<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>모든지 기록하자!</title>
    <link>https://rma7.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 11 Jul 2026 20:53:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>홍크</managingEditor>
    <item>
      <title>React Hooks</title>
      <link>https://rma7.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Hook은 함수형 컴포넌트가 클래스형 컴포넌트의 기능을 사용할 수 있도록 해주는 기능이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;리액트의 컴포넌트는 클래스형과 함수형으로 나눠진다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 이전 게시물의 클래스 컴포넌트를 사용한 예제와&amp;nbsp; 훅스를 사용한 예제이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;Class component&lt;/h4&gt;
&lt;pre id=&quot;code_1687515240198&quot; class=&quot;xml&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;/&amp;gt;
    &amp;lt;title&amp;gt;구구단&amp;lt;/title&amp;gt;
    &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@16/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@16/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 결과: &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;button&amp;gt;Like&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt; --&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  class GuGuDan extends React.Component {
    state = {
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: '',
      result: '',
    };

    onSubmit = (e) =&amp;gt; {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        this.setState((prevState) =&amp;gt; {
          return {
            result: '정답: ' + prevState.value,
            first: Math.ceil(Math.random() * 9),
            second: Math.ceil(Math.random() * 9),
            value: '',
          };
        });
        this.input.focus();
      } else {
        this.setState({
          result: '땡',
          value: '',
        });
        this.input.focus();
      }
    };

    onChange = (e) =&amp;gt; {
      this.setState({ value: e.target.value });
    };

    input;

    onRefInput = (c) =&amp;gt; { this.input = c; };

    // 컨텐츠
    render() {
      return (
        &amp;lt;React.Fragment&amp;gt;
          &amp;lt;div&amp;gt;{this.state.first} 곱하기 {this.state.second}는?&amp;lt;/div&amp;gt;
          &amp;lt;form onSubmit={this.onSubmit}&amp;gt;
            &amp;lt;input ref={this.onRefInput} type=&quot;number&quot; value={this.state.value} onChange={this.onChange}/&amp;gt;
            &amp;lt;button&amp;gt;입력!&amp;lt;/button&amp;gt;
          &amp;lt;/form&amp;gt;
          &amp;lt;div&amp;gt;{this.state.result}&amp;lt;/div&amp;gt;
        &amp;lt;/React.Fragment&amp;gt;
      );
    }
  }

&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  ReactDOM.render(&amp;lt;GuGuDan/&amp;gt;, document.querySelector('#root'));
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;Hooks&lt;/h4&gt;
&lt;pre id=&quot;code_1687515240209&quot; class=&quot;xml&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;/&amp;gt;
    &amp;lt;title&amp;gt;구구단&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react@16/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@16/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  const GuGuDan = () =&amp;gt; {
    const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
    const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
    const [value, setValue] = React.useState('');
    const [result, setResult] = React.useState('');
    const inputEl = React.useRef(null);

    const onSubmitForm = (e) =&amp;gt; {
      e.preventDefault();
      if (parseInt(value) === first * second) {
        setResult('정답');
        setFirst(Math.ceil(Math.random() * 9));
        setSecond(Math.ceil(Math.random() * 9));
        setValue('');
        inputEl.current.focus();
      } else {
        setResult('땡');
        setValue('');
        inputEl.current.focus();
      }
    };
    return (
      &amp;lt;React.Fragment&amp;gt;
        &amp;lt;div&amp;gt;{first} 곱하기 {second}는?&amp;lt;/div&amp;gt;
        &amp;lt;form onSubmit={onSubmitForm}&amp;gt;
          &amp;lt;input
            ref={inputEl}
            type=&quot;number&quot;
            value={value}
            onChange={(e) =&amp;gt; setValue(e.target.value)}
          /&amp;gt;
          &amp;lt;button&amp;gt;입력!&amp;lt;/button&amp;gt;
        &amp;lt;/form&amp;gt;
        &amp;lt;div id=&quot;result&quot;&amp;gt;{result}&amp;lt;/div&amp;gt;
      &amp;lt;/React.Fragment&amp;gt;
    );
  };

&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  ReactDOM.render(&amp;lt;GuGuDan/&amp;gt;, document.querySelector('#root'));
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 위 코드의 ref에 대해 알아보자&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;ref란 DOM에 직접 접근하기 위해 사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Html을 작성할 때 &amp;lt;div id=&quot;test&quot;&amp;gt; 와 같이 id를 사용한다. 특정한 id에 해당하는 DOM에만 스타일이나 자바스크립트에서 여러가지 작업을 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 id를 붙이는 것 처럼 리액트에서도 DOM을 선택해 직접 접근하기 위해 ref를 사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;state 비교&lt;/h4&gt;
&lt;pre id=&quot;code_1687515240220&quot; class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//클래스형
state = {
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: '',
      result: '',
    };
    
//혹스
const [first, setFirst] = React.useState(Math.ceil(Math.random() * 9));
const [second, setSecond] = React.useState(Math.ceil(Math.random() * 9));
const [value, setValue] = React.useState('');
const [result, setResult] = React.useState('');
const inputEl = React.useRef(null);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;훅스는 각각 setState 사용할 수 있게 도와준다. (ex - result의 setState는 setResult)&lt;/p&gt;</description>
      <category>React</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/85</guid>
      <comments>https://rma7.tistory.com/85#entry85comment</comments>
      <pubDate>Fri, 23 Jun 2023 19:14:04 +0900</pubDate>
    </item>
    <item>
      <title>React 구구단 만들기</title>
      <link>https://rma7.tistory.com/84</link>
      <description>&lt;pre id=&quot;code_1687515081632&quot; class=&quot;xml&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;/&amp;gt;
    &amp;lt;title&amp;gt;구구단&amp;lt;/title&amp;gt;
    &amp;lt;script crossorigin src=&quot;https://unpkg.com/react@16/umd/react.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script crossorigin src=&quot;https://unpkg.com/react-dom@16/umd/react-dom.development.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;https://unpkg.com/babel-standalone@6/babel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt; &amp;lt;!-- 결과: &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;button&amp;gt;Like&amp;lt;/button&amp;gt;&amp;lt;/div&amp;gt; --&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  class GuGuDan extends React.Component {
    state = {
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: '',
      result: '',
    };

    onSubmit = (e) =&amp;gt; {
      e.preventDefault();
      if (parseInt(this.state.value) === this.state.first * this.state.second) {
        this.setState((prevState) =&amp;gt; {
          return {
            result: '정답: ' + prevState.value,
            first: Math.ceil(Math.random() * 9),
            second: Math.ceil(Math.random() * 9),
            value: '',
          };
        });
        this.input.focus();
      } else {
        this.setState({
          result: '땡',
          value: '',
        });
        this.input.focus();
      }
    };

    onChange = (e) =&amp;gt; {
      this.setState({ value: e.target.value });
    };

    // 컨텐츠
    render() {
      return (
        &amp;lt;div&amp;gt;
          &amp;lt;div&amp;gt;{this.state.first} 곱하기 {this.state.second}는?&amp;lt;/div&amp;gt;
          &amp;lt;form onSubmit={this.onSubmit}&amp;gt;
            &amp;lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange}/&amp;gt;
            &amp;lt;button&amp;gt;입력!&amp;lt;/button&amp;gt;
          &amp;lt;/form&amp;gt;
          &amp;lt;div&amp;gt;{this.state.result}&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      );
    }
  }

&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;text/babel&quot;&amp;gt;
  ReactDOM.render(&amp;lt;GuGuDan/&amp;gt;, document.querySelector('#root'));
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;바뀌는 부분은 아래처럼&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;state로 등록해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687515081642&quot; class=&quot;reasonml&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;state = {
      first: Math.ceil(Math.random() * 9),
      second: Math.ceil(Math.random() * 9),
      value: '',
      result: '',
    };&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687515081644&quot; class=&quot;pf&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨텐츠
    render() {
      return (
        &amp;lt;div&amp;gt;
          &amp;lt;div&amp;gt;{this.state.first} 곱하기 {this.state.second}는?&amp;lt;/div&amp;gt;
          &amp;lt;form onSubmit={this.onSubmit}&amp;gt;
            // 올바른 input
            &amp;lt;input type=&quot;number&quot; value={this.state.value} onChange={this.onChange}/&amp;gt;
            
            // 입력 안되는 input창 onChange가 없어 오류발생
            &amp;lt;input type=&quot;number&quot; value={this.state.value} /&amp;gt;
            // jsx 문법이기 때문에 input 뒤에 /로 닫아주지 않으면 오류가 발생한다.
            &amp;lt;button&amp;gt;입력!&amp;lt;/button&amp;gt;
          &amp;lt;/form&amp;gt;
          &amp;lt;div&amp;gt;{this.state.result}&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      );
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&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;295&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mq6Qp/btslaejIalk/Ulul9ELAUPV5JmlUQ300D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mq6Qp/btslaejIalk/Ulul9ELAUPV5JmlUQ300D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mq6Qp/btslaejIalk/Ulul9ELAUPV5JmlUQ300D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmq6Qp%2FbtslaejIalk%2FUlul9ELAUPV5JmlUQ300D0%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;295&quot; height=&quot;82&quot; data-origin-width=&quot;295&quot; data-origin-height=&quot;82&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/kQH5R/btr5OyE7zbM/6c3yGoPuhOsDvOBaiy5rwK/img.png&quot; data-lightbox=&quot;lightbox&quot; data-alt=&quot;onChange함수가 없이 입력안됨&quot;&gt;&lt;/span&gt;onChange함수가 없이 입력안됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;input 창에 &amp;nbsp;value를 위에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;state&lt;/b&gt;로 지정했기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;onChange 함수가 없다면 입력이 진행되지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;코드 실행결과&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 정답&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2wR8z/btsk9kLmswz/qLeUdFPUzEKMp23mUo0JYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2wR8z/btsk9kLmswz/qLeUdFPUzEKMp23mUo0JYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2wR8z/btsk9kLmswz/qLeUdFPUzEKMp23mUo0JYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2wR8z%2Fbtsk9kLmswz%2FqLeUdFPUzEKMp23mUo0JYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;121&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 오답&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;289&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NXRRg/btsk8hvhLAt/aDiGp55Z0kYBTwUemSEiK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NXRRg/btsk8hvhLAt/aDiGp55Z0kYBTwUemSEiK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NXRRg/btsk8hvhLAt/aDiGp55Z0kYBTwUemSEiK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNXRRg%2Fbtsk8hvhLAt%2FaDiGp55Z0kYBTwUemSEiK1%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;289&quot; height=&quot;116&quot; data-origin-width=&quot;289&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이번 주 리엑트 강의를 들으며..&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Js 기본기가 많이 부족하다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 강의 듣기전 봐도 모르던 코드를 아주 약간 이해하기 시작&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;웹 게임을 만들며 배우는 React&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/web-game-react/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/web-game-react/dashboard&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>React</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/84</guid>
      <comments>https://rma7.tistory.com/84#entry84comment</comments>
      <pubDate>Fri, 23 Jun 2023 19:13:35 +0900</pubDate>
    </item>
    <item>
      <title>React JSX 문법이란?</title>
      <link>https://rma7.tistory.com/83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JSX(JavaScript XML)은 Javascrpint에 XML을 추가하여 확장 문법이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;JSX은 Javascrpint의 공식적인 문법이 아니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;브라우저에서 실행하기 전 바벨(리액트 라이브러리)을 사용하여 자바스크립트 형태 코드로 변환된다.&lt;/p&gt;
&lt;pre id=&quot;code_1687515020982&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JSX 예시
function App(){
	retrun(
    &amp;lt;h1&amp;gt;테스트&amp;lt;/h1&amp;gt;
    );
}

// 위와 같이 작성했을 시, 바벨이 아래와 같이 Javascript로 해석해준다.
function App(){
	return React.createElement(&quot;h1&quot;, null, &quot;테스트&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;JSX문법&amp;nbsp;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;1. 반드시 부모 요소 하나가 감싸는 형태여야 한다.&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Virtual DOM 방식에서는 컴포넌트 변화를 감지할 때 효율적으로 비교할 수 있도록&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다&lt;/b&gt;는 규칙이 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1687515020985&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 잘못된 사용 (에러발생)
function App(){
	return (
    	&amp;lt;div&amp;gt;Test1&amp;lt;/div&amp;gt;
        &amp;lt;div&amp;gt;Test2&amp;lt;/div&amp;gt;
    );
}


// 올바른 사용
function App(){
	return (
    	&amp;lt;div&amp;gt;
    		&amp;lt;div&amp;gt;Test1&amp;lt;/div&amp;gt;
        	&amp;lt;div&amp;gt;Test2&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}

// 올바른 사용2
function App(){
	return (
    	&amp;lt;Fragment&amp;gt;
    		&amp;lt;div&amp;gt;Test1&amp;lt;/div&amp;gt;
        	&amp;lt;div&amp;gt;Test2&amp;lt;/div&amp;gt;
        &amp;lt;/Fragment&amp;gt;
    );
}

// 올바른 사용3
function App(){
	return (
    	&amp;lt;&amp;gt;
    		&amp;lt;div&amp;gt;Test1&amp;lt;/div&amp;gt;
        	&amp;lt;div&amp;gt;Test2&amp;lt;/div&amp;gt;
        &amp;lt;/&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;2. 반드시 태그는 닫혀야 한다.&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &amp;lt;div&amp;gt;, &amp;lt;p&amp;gt;, &amp;lt;span&amp;gt;, &amp;lt;a&amp;gt; 같이 짝이 있는 태그의 경우 반드시 닫는 태그가 존재해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &amp;lt;img/&amp;gt;, &amp;lt;input/&amp;gt;, &amp;lt;br/&amp;gt; 같은 단독 태그(self-closing tag)의 경우에는 반드시 태그를 닫아줘야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;3. 자바스크립트 표현&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;JSX내부에서 코드를{ } 로 감싸면&amp;nbsp; JavaScript 표현식을 사용할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1687515020989&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
	const name = 'My Name';
	return (
		&amp;lt;div&amp;gt;
			&amp;lt;div&amp;gt;Hello&amp;lt;/div&amp;gt;
			&amp;lt;div&amp;gt;{name}&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
	);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;4. JSX 내부에서는 if문을 사용할 수 없다.&amp;nbsp;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;- JSX 밖에서 if 문을 사용하거나, { } 안에서 삼항 연산자를 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687515020990&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 외부에서 사용
function App() {
	let desciption = '';
	const test = 'yes';
	if(test === 'yes') {
		desc = &amp;lt;div&amp;gt;Yes 입니다.&amp;lt;/div&amp;gt;;
	} else {
		desc = &amp;lt;div&amp;gt;No 입니다.&amp;lt;/div&amp;gt;;
	}
	return (
		&amp;lt;&amp;gt;
			{desciption}
		&amp;lt;/&amp;gt;
	);
}


// 내부에서 사용
function App() {
	const desciption = 'yes';
	return (
		&amp;lt;&amp;gt;
			&amp;lt;div&amp;gt;
				{desciption === 'yes' ? (
					&amp;lt;div&amp;gt;Yes 입니다.&amp;lt;/div&amp;gt;
				) : (
					&amp;lt;div&amp;gt;No 입니다.&amp;lt;/div&amp;gt;
				)}
			&amp;lt;/div&amp;gt;
		&amp;lt;/&amp;gt;
	);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;5. AND 연산자(&amp;amp;&amp;amp;) 사용&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 특정 조건을 만족할 때만 내용을 보여준다. (조건이&amp;nbsp;만족하지&amp;nbsp;않을&amp;nbsp;경우&amp;nbsp;아무것도&amp;nbsp;노출되지&amp;nbsp;않는다.)&lt;/p&gt;
&lt;pre id=&quot;code_1687515020993&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
	const desciption = 'yes';
	return (
		&amp;lt;&amp;gt;
			&amp;lt;div&amp;gt;
				{desciption === 'yes' &amp;amp;&amp;amp; &amp;lt;div&amp;gt;Yes 입니다.&amp;lt;/div&amp;gt;}
			&amp;lt;/div&amp;gt;
		&amp;lt;/&amp;gt;
	);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- falsy한 값인 0은 예외적으로 화면에 나타난다.&lt;/p&gt;
&lt;pre id=&quot;code_1687515020994&quot; class=&quot;xquery&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 아래 코드는 화면에 '테스트'를 보여주는 것이 아닌 숫자 0을 보여준다.
const number = 0;
return number &amp;amp;&amp;amp; &amp;lt;div&amp;gt;테스트&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;6. OR 연산자(||) 사용&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 리액트 컴포넌트에서는 함수에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;undefined나 null을 반환하면 렌더링을 하려하면 오류가 발생한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;JSX 내부에서 undefined나 null을 렌더링하는 것은 괜찮다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;&amp;nbsp;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;JSX 내부에서 undefined나 null을 렌더링하면 아무것도 보여주지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- OR 연산자는 특정 값이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;undefined나 null일 경우 보여주고 싶은 문구가 있을 때 주로 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687515020996&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// undefined 렌터링 시 오류발생
function App(){
	const name = 'undefined';
	return name;
}

// OR 연산자 사용
function App() {
  const name = undefined;
  return name || &quot;값이 undefined&quot;;  
}

// JSX 내부에서 undefined, null 허용
function App() {
  const name = undefined;
  return (
  	&amp;lt;div&amp;gt;{name}&amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;6.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;JSX&amp;nbsp;스타일링&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&amp;nbsp;- 카멜 표기법으로 작성해야 한다. ex) background-color -&amp;gt; backgroundcolor&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687515020998&quot; class=&quot;javascript&quot; style=&quot;background-color: #000000; color: #000000; text-align: left;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function App() {
	const style = {
		backgroundColor: 'blue',
		fontSize: '12px'
	}
	return (
		&amp;lt;div style={style}&amp;gt;테스트&amp;lt;/div&amp;gt;
	);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;JSX은 XSS 공격을 방어한다.&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 기본적으로 React DOM은 JSX에 삽입된 모든 값을 렌더링하기 전에 Escape 처리하므로, 애플리케이션에서 명시적으로 작성되지 않은 내용은 주입되지 않는다. 모든 항목은 렌더링 되기 전에 문자열로 변환된다. 이런 특성으로 인해 XSS (cross-site-scripting) 공격을 방지할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://goddaehee.tistory.com/296&quot;&gt;https://goddaehee.tistory.com/296&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@gyumin_2/React-JSX%EB%9E%80%EC%A0%95%EC%9D%98-%EC%9E%A5%EC%A0%90-%EB%AC%B8%EB%B2%95-%ED%8A%B9%EC%A7%95-%EB%93%B1&quot;&gt;https://velog.io/@gyumin_2/React-JSX%EB%9E%80%EC%A0%95%EC%9D%98-%EC%9E%A5%EC%A0%90-%EB%AC%B8%EB%B2%95-%ED%8A%B9%EC%A7%95-%EB%93%B1&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://chanhuiseok.github.io/posts/react-3/&quot;&gt;https://chanhuiseok.github.io/posts/react-3/&lt;/a&gt;&lt;/p&gt;</description>
      <category>React</category>
      <category>JSX</category>
      <category>react</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/83</guid>
      <comments>https://rma7.tistory.com/83#entry83comment</comments>
      <pubDate>Fri, 23 Jun 2023 19:10:53 +0900</pubDate>
    </item>
    <item>
      <title>[Network] PORT</title>
      <link>https://rma7.tistory.com/78</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;IP만으로 한 번에 둘 이상 연결해야 한다면 어느 프로세스에서 처리할지 구분할 방법이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 전 게시물에서 봤던 TCP/IP 패킷 정보에는 PORT 정보도 포함하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처2.PNG&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDdiRC/btrqnkf68qg/tEOfsI13fBcW3XVaxTd7D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDdiRC/btrqnkf68qg/tEOfsI13fBcW3XVaxTd7D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDdiRC/btrqnkf68qg/tEOfsI13fBcW3XVaxTd7D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDdiRC%2Fbtrqnkf68qg%2FtEOfsI13fBcW3XVaxTd7D0%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;510&quot; height=&quot;322&quot; data-filename=&quot;캡처2.PNG&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;IP&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;는 컴퓨터를 찾을 때 필요한 주소&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;를 &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Port&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;는 같은 IP 내에서 프로세스를 구분 할&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;때 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;김영한 강사님의 이해하기 쉬운 비유는 IP가 아파트면 PORT는 그 아파트에 몇동 몇호인지 구분하는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처4.PNG&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buNgns/btrqujG0JWK/KGWdft4E0ezWQMEFOHbdk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buNgns/btrqujG0JWK/KGWdft4E0ezWQMEFOHbdk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buNgns/btrqujG0JWK/KGWdft4E0ezWQMEFOHbdk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuNgns%2FbtrqujG0JWK%2FKGWdft4E0ezWQMEFOHbdk0%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;510&quot; height=&quot;271&quot; data-filename=&quot;캡처4.PNG&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;포트 번호는 크게 세 종류로 구분된다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;0번 ~ 1023번:&lt;span&gt; 잘 알려진 포트로 사용하지 않는 것이 좋다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(well-known port)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1024번 ~ 49151번: 등록된 포트 (registered port)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;49152번 ~ 65535번: 동적 포트 (dynamic port)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;잘 알려진 포트번호의 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;20&amp;nbsp;:&amp;nbsp;FTP(data) &lt;br /&gt;21&amp;nbsp;:&amp;nbsp;FTP(제어) &lt;br /&gt;22&amp;nbsp;:&amp;nbsp;SSH &lt;br /&gt;23&amp;nbsp;:&amp;nbsp;텔넷 &lt;br /&gt;53&amp;nbsp;:&amp;nbsp;DNS &lt;br /&gt;80&amp;nbsp;:&amp;nbsp;월드&amp;nbsp;와이드&amp;nbsp;웹&amp;nbsp;HTTP &lt;br /&gt;119&amp;nbsp;:&amp;nbsp;NNTP &lt;br /&gt;443&amp;nbsp;:&amp;nbsp;TLS/SSL&amp;nbsp;방식의&amp;nbsp;HTTP&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;참고 - 김영한 모든 개발자를 위한 HTTP 웹 기본 지식 강의&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://ko.wikipedia.org/wiki/포트_(컴퓨터_네트워킹)&quot;&gt;https://ko.wikipedia.org/wiki/포트(컴퓨터_네트워킹)&lt;/a&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Network</category>
      <category>port</category>
      <category>포트</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/78</guid>
      <comments>https://rma7.tistory.com/78#entry78comment</comments>
      <pubDate>Tue, 11 Jan 2022 22:11:40 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Spring 과 Spring Boot 의 차이점은?</title>
      <link>https://rma7.tistory.com/77</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring Framework&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링 프레임 워크는 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공한다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로 쓰이고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring의 특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. IoC&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;(Invertion of Control: 제어 역행)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;DI(Dependency Injection: 의존성 주입)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;3. AOP(Aspect-Oriented Programming: 관점 지향 프로그래밍)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1 - IoC (&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;Invertion of Control: 제어 역행&lt;/span&gt;) 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;일반적으로 자바 프로그램은 main 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 객체가 생성되고 실행된다. 서블릿을 개발해서 서버에 배포할 수는 있지만 배포하고 나서는 개발자가 직접 제어할 수 있는 방법은 없다. 대신 서블릿에 대한 제어 권한을 가진 컨테이너 가 적절한 시점에서 서블릿 클래스의 객체를 만들고 그 안에 메소드를 호출한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;조립된 코드의 최종 호출은 개발자에 의해서 제어되는 것이 아니라 프레임워크의 내부에서 결정된 대로 이뤄지게 되는데 이러한 현상을 제어 역행 이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;DI(Dependency Injection: 의존성 주입) 란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;객체 사이에 필요한 의존 관계에 대해서 스프링 컨테이너가 자동으로 연결해 주는 것을 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f8f9fa; color: #212529;&quot;&gt;스프링 컨테이너는 DI를 이용하여 빈(Bean) 객체를 관리하며 스프링 컨테이너에 클래스를 등록하면 스프링이 클래스의 인스턴스를 관리해 준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링 컨테이너에 빈(Bean)을 등록하고 설정하는 방법은 두 가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. XML 설정을 통한 DI&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 어노테이션(Annotations)을 이용한 DI&amp;nbsp;&lt;/p&gt;

&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring Boot&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;스프링 프레임워크는 기능이 많은만큼 환경설정이 복잡한 편이다. 이 것에 어려움을 느끼는 사용자들을 위해 나온 것이 스프링 부트다. 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화해준다. 스프링 부트 starter 디펜던시만 추가해주면 바로 API를 정의하고 내장된 톰켓이나 제티로 웹 어플리케이션 서버를 실행할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;차이점?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1 - Embed Tomcat을 사용하기 때문에 따로 톰켓을 설치하거나 매번 버전 관리를 하지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2 - starter를 통한 dependency 자동화&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;Spring framework에서는 각각의 dependency들의 호환되는 버전을 일일이 맞추어 주어야 했고,&amp;nbsp; 하나의 버전을 올리고자 하면 다른 dependeny에 까지 영향을 미쳐 version관리에 어려움이 많았다. 하지만 starter가 대부분의 dependency를 관리해주기 때문에 번거로움이 적어졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;3 - XML 설정을 하지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #222426;&quot;&gt;4 - jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Spring</category>
      <category>Spring</category>
      <category>SpringBoot</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/77</guid>
      <comments>https://rma7.tistory.com/77#entry77comment</comments>
      <pubDate>Sat, 1 Jan 2022 01:58:12 +0900</pubDate>
    </item>
    <item>
      <title>[Network] TCP , UDP</title>
      <link>https://rma7.tistory.com/76</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IP의 단점인 비연결성과 비신뢰성 등을 해결하기 위해 TCP를 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처1.PNG&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJS7gT/btrppy5UU0f/SGoGevICy8x35wdyoBfORk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJS7gT/btrppy5UU0f/SGoGevICy8x35wdyoBfORk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJS7gT/btrppy5UU0f/SGoGevICy8x35wdyoBfORk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJS7gT%2Fbtrppy5UU0f%2FSGoGevICy8x35wdyoBfORk%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;228&quot; data-filename=&quot;캡처1.PNG&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;391&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hello world라는 메시지를 전송하면 SOKET 라이브러리를 이용해 OS계층으로 전달, OS계층에서는&amp;nbsp; 메시지 데이터에 TCP 정보를 포함시키고 TCP정보를 포함하는 IP 패킷을 생성한다. IP 패킷은 네트워크 인터페이스를 통해 전송한다.&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;b&gt;TCP의 특징&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;전송 제어 프로토콜 (Transmission Control Protocol)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;TCP는&lt;span&gt; 웹 브라우저&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;들이&lt;span&gt; 월드 와이드 웹(www)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;에서 서버에 연결할 때 사용되며,&lt;span&gt;&amp;nbsp;이메일&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;전송이나 파일 전송에도 사용된다. &lt;/span&gt;신뢰할 수 있는 프로토콜로 현재는 대부분 TCP를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 연결지향 - TCP 3way handshake(가상연결)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처3.PNG&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mYE66/btrpiIB0mDr/JIkfCnxhqwSNZKZBXqtuVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mYE66/btrpiIB0mDr/JIkfCnxhqwSNZKZBXqtuVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mYE66/btrpiIB0mDr/JIkfCnxhqwSNZKZBXqtuVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmYE66%2FbtrpiIB0mDr%2FJIkfCnxhqwSNZKZBXqtuVK%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;306&quot; data-filename=&quot;캡처3.PNG&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP 프로토콜의 작동은 크게 세 가지 흐름으로 구분하며 연결 생성 -&amp;gt; 자료 전송 -&amp;gt; 연결 종료이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신뢰성 있는 연결이 생성돼야 하며, 그 후 자료를 전송하고, 마지막으로 연결을 종료하면서 할당된 자원을 반납한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결을 생성하기 위해 TCP 3way handshake를 사용 하며 SYN , SYN+ACK , ACK로 3번 데이터를 주고받아 연결 확인 후 데이터를 전송한다. TCP 3way handshake는 물리적인 연결이 아니라 논리적 연결이다.(가상연결)&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;2. 데이터 전달 보증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 서버에 데이터를 전송하면 서버에서는 데이터를 받았다면 클라이언트로 응답을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 순서 보장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP는 IP와는 다르게 전송 제어 정보 , 순서 정보 등을 포함하고 있기 때문에 순서가 보장된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처2.PNG&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LwDj1/btrpdnL8220/1oBVvosbyhcFZVnnZVJcvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LwDj1/btrpdnL8220/1oBVvosbyhcFZVnnZVJcvK/img.png&quot; data-alt=&quot;&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;TCP/IP패킷에 포함된 정보는 위에 사진과 같다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LwDj1/btrpdnL8220/1oBVvosbyhcFZVnnZVJcvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLwDj1%2FbtrpdnL8220%2F1oBVvosbyhcFZVnnZVJcvK%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;400&quot; height=&quot;252&quot; data-filename=&quot;캡처2.PNG&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TCP/IP패킷에 포함된 정보는 위에 사진과 같다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;TCP는 데이터 스트림으로부터 데이터를 받아들여 이것을 청크 단위로 분할한 뒤 TCP 헤더를 덧붙여 TCP 세그먼트를 생성한다. TCP 세그먼트는&lt;span&gt; IP 데이터그램&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;에&lt;span&gt; 캡슐화&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;되어 상대방과 주고받게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;UDP의 특징&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;사용자 데이터그램 프로토콜(User Datagram Protocol)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;UDP의 전송 방식은 너무 단순해서 서비스의 신뢰성이 낮고, 데이터그램 도착 순서가 바뀌거나, 중복되거나, 통보 없이 누락시키기도 한다. UDP는 일반적으로 오류의 검사와 수정이 필요 없는 애플리케이션에서 수행할 것으로 가정한다. &lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;UDP를 사용하는 네트워크 애플리케이션에는&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;DNS,&lt;span&gt; IPTV&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;, 음성 인터넷 프로토콜 (VoIP&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;),&lt;span&gt;&amp;nbsp;등등&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;&amp;nbsp;그리고 많은 온라인 게임 등이 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #202122;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;TCP와 UDP 비교&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP는 데이터를 주고받을 양단간에 먼저 연결을 설정하고 설정된 연결을 통해 양방향으로 데이터를 전송하지만, UDP는 연결을 설정하지 않고 수신자가 데이터를 받을 준비를 확인하는 단계를 거치지 않고 단방향으로 정보를 전송한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신뢰성 - TCP는 메시지 수신을 확인하지만 UDP는 수신자가 메시지를 수신했는지 확인할 수 없다.&lt;/li&gt;
&lt;li&gt;순서 정렬 - TCP에서는 메시지가 보내진 순서를 보장하기 위해 재조립하지만 UDP는 메시지 도착 순서를 예측할 수 없다.&lt;/li&gt;
&lt;li&gt;부하 - TCP보다 UDP속도가 일반적으로 빠르고 오버헤드가 적다.&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;다음 게시물에서는 PORT와 DNS에 대해 알아보기로 하자.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;김영한 모든 개발자를 위한 HTTP 웹 기본 지식 강의&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EC%A0%9C%EC%96%B4_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; https://ko.wikipedia.org/wiki/전송_제어_프로토콜&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%82%AC%EC%9A%A9%EC%9E%90_%EB%8D%B0%EC%9D%B4%ED%84%B0%EA%B7%B8%EB%9E%A8_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/사용자_데이터그램_프로토콜&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Network</category>
      <category>IP</category>
      <category>TCP</category>
      <category>UDP</category>
      <category>사용자 데이터그램 프로토콜</category>
      <category>전송 제어 프로토콜</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/76</guid>
      <comments>https://rma7.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 30 Dec 2021 23:51:53 +0900</pubDate>
    </item>
    <item>
      <title>[Network] 인터넷 프로토콜(IP, Internet Protocol)</title>
      <link>https://rma7.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발 공부를 시작하고 속성으로 빠른 시일 내에 공부하다 보니 이해되지 않는 부분들이 많아&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 동작 원리나 구조, 흐름 같은 원리에 중점을 두고 순차적으로 공부해 보려고 한다.&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;모든 것이 HTTP 기반 위에서 동작한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML, 이미지 , 영상 , 파일뿐만 아니라 앱과 서버가 통신할 때도 서버와 서버가 통신할 때도 HTTP 프로토콜 위에서 데이터를 주고받는다.&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;인터넷 프로토콜(IP) 역할&amp;nbsp;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정한 IP 주소에 데이터 전달&lt;/li&gt;
&lt;li&gt;패킷(Packet)이라는 통신 단위로 데이터 전달&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처.PNG&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3j5Wl/btroRK1D5mB/cq2jhIrPjPNpxKc4jDoaHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3j5Wl/btroRK1D5mB/cq2jhIrPjPNpxKc4jDoaHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3j5Wl/btroRK1D5mB/cq2jhIrPjPNpxKc4jDoaHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3j5Wl%2FbtroRK1D5mB%2Fcq2jhIrPjPNpxKc4jDoaHK%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;410&quot; height=&quot;224&quot; data-filename=&quot;캡처.PNG&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처1.PNG&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT2jE4/btroTcQCIC8/P5BiDgjNPvq74pjAghB1E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT2jE4/btroTcQCIC8/P5BiDgjNPvq74pjAghB1E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT2jE4/btroTcQCIC8/P5BiDgjNPvq74pjAghB1E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT2jE4%2FbtroTcQCIC8%2FP5BiDgjNPvq74pjAghB1E1%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;410&quot; height=&quot;219&quot; data-filename=&quot;캡처1.PNG&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IP 프로토콜의 한계&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 비연결성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷을 전송한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처.PNG&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BASPO/btro08MXxga/TuKk5Sw6XRSH4N8W5vfS31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BASPO/btro08MXxga/TuKk5Sw6XRSH4N8W5vfS31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BASPO/btro08MXxga/TuKk5Sw6XRSH4N8W5vfS31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBASPO%2Fbtro08MXxga%2FTuKk5Sw6XRSH4N8W5vfS31%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;410&quot; height=&quot;210&quot; data-filename=&quot;캡처.PNG&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 비신뢰성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;&amp;nbsp;- 비신뢰성은 흐름에 관여하지 않기 때문에 보낸 정보가 제대로 갔는지 보장하지 않는다는 뜻이다. 예를 들어 전송 과정에서 패킷이 손상될 수도 있다. &lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;같은 호스트에서 전송한 패킷의 순서가 뒤죽박죽이 될 수도 있고, 같은 패킷이 두 번 전송될 수도 있으며, 아예 패킷이 사라질 수도 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처1.PNG&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BsNl1/btroYjOKRsD/gf1wCwuhevT4TuiKJ4Cih0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BsNl1/btroYjOKRsD/gf1wCwuhevT4TuiKJ4Cih0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BsNl1/btroYjOKRsD/gf1wCwuhevT4TuiKJ4Cih0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBsNl1%2FbtroYjOKRsD%2Fgf1wCwuhevT4TuiKJ4Cih0%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;410&quot; height=&quot;222&quot; data-filename=&quot;캡처1.PNG&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;캡처2.PNG&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/os9Nh/btroT6v0R6O/vSQxthKHSv2BhKcz5kZgN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/os9Nh/btroT6v0R6O/vSQxthKHSv2BhKcz5kZgN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/os9Nh/btroT6v0R6O/vSQxthKHSv2BhKcz5kZgN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fos9Nh%2FbtroT6v0R6O%2FvSQxthKHSv2BhKcz5kZgN0%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;410&quot; height=&quot;207&quot; data-filename=&quot;캡처2.PNG&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;497&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;패킷 전송과 정확한 순서를 보장하려면&lt;span&gt; TCP&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;프로토콜과 같은 IP의 상위 프로토콜을 이용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #202122;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;TCP, UDP에 대한 내용은 다음 게시물에 설명&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #202122;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;참고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/인터넷_프로토콜&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;김영한 모든 개발자를 위한 HTTP 웹 기본 지식 강의&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Network</category>
      <category>IP</category>
      <category>인터넷 프로토콜</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/75</guid>
      <comments>https://rma7.tistory.com/75#entry75comment</comments>
      <pubDate>Sun, 26 Dec 2021 15:04:40 +0900</pubDate>
    </item>
    <item>
      <title>[Network] 아파치 설정파일 분석 - httpd.conf , httpd-vhost.conf</title>
      <link>https://rma7.tistory.com/74</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;1. virtual hosts 주석 해제&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 가상 호스트를 사용하기 위해 주석 해제한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci6CrL/btropnd2KZ2/BidMlwq0Ks64EbBTzOJ5t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci6CrL/btropnd2KZ2/BidMlwq0Ks64EbBTzOJ5t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci6CrL/btropnd2KZ2/BidMlwq0Ks64EbBTzOJ5t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci6CrL%2Fbtropnd2KZ2%2FBidMlwq0Ks64EbBTzOJ5t1%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;590&quot; height=&quot;169&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가상호스트란?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본적으로 웹서버에 존재하는 주 호스트 도메인을 등록하여 사용하고 있지만 추가적으로 한 서버에 여러 도메인을 등록하여 사용한다는 의미이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가상 호스트 서버를 이용하여 제한된 공간 안에서 여러 개의 홈페이지를 제공해주는 서비스가(웹, 메일 등) 호스팅 서버스이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;2. ErrorLog 변경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorLog &amp;ldquo;|/apps/apache/bin/rotatelogs /apps/apache/logs/error_log.%Y%m%d 86400&amp;rdquo;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;에러 로그가 저장되는 경로를 지정한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로그를 분할해서 남길경우에는 아파치에서 제공하는 rotatelogs를 사용한다. 파일명에 연월일시 분초를 작성하여 파일이 생성된 시간 기록, 86400은 로그파일을 새로 생성할 시간(초단위) 한국 시간으로 맞추려면 +540을 하면 된다. GMT 시간과 한국시간은 9시간이 차이 나기 때문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;3. CustumLog common 변경&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorLog &amp;ldquo;|/apps/apache/bin/rotatelogs /apps/apache/logs/access_log.%Y%m%d 86400&amp;rdquo; common env=!dontlog&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span&gt;커스텀 로그가 저장되는 경로를 지정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로그 형식 이름은 &quot;LogFormat&quot;으로 정의된 어떤 로그를 기록할 것에 대한 정의를 지정한 것이다. &quot;LogFormat&quot;의 맨 뒤에 작성되어 있는 문장이 포맷명이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 설정은 로그 파일명은 &amp;ldquo;access.log&amp;rdquo;이고 로그 포맷은 &amp;ldquo;common&amp;rdquo;으로 되어 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;env=!dontlog -&amp;gt; dontlog가 아닐 때 로그를 기록한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;#gif,bmp,jpg,ico,js,css,png 로그에서 제외&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SetEnvIfNoCase Request_URI &quot;\.(gif)|(jpg)|(png)|(css)|(js)|(ico)|(eot)$&quot; dontlog&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;4. ServerName 주석 처리 해제&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;643&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p4xy4/btroqR7eywS/WKUkWj2WQVkiPIOcKXucMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p4xy4/btroqR7eywS/WKUkWj2WQVkiPIOcKXucMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p4xy4/btroqR7eywS/WKUkWj2WQVkiPIOcKXucMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp4xy4%2FbtroqR7eywS%2FWKUkWj2WQVkiPIOcKXucMk%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;643&quot; height=&quot;255&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 일반적으로 IP 주소에 대해 할당된 도메인명이지만, 따로 이름을 할당하고 그것을 공식 도메인명으로 원하는 경우에 사용한다. &quot;ServerName&quot;가 지정되어 있지 않은 경우는 Apache에 할당된 IP 주소를 역으로 도메인명을 가져온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;ServerName [스키마://]도메인명|IP 주소[:포트 번호] &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ex) &lt;/span&gt;&lt;span&gt;www.exampl.com:80&lt;/span&gt;&lt;span&gt;&lt;span&gt; -&amp;gt; 포트 번호는 생략할 수 있지만 생략된 경우는 http 포트 번호를 사용한다. 포트 번호도 지정하는 것을 추천한다고 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;5. &lt;/span&gt;&lt;span&gt;Directory 변경&lt;/span&gt;&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DjJtR/btrotjVXnRf/hz7NH4kqkhPBjOLtPzNzQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DjJtR/btrotjVXnRf/hz7NH4kqkhPBjOLtPzNzQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DjJtR/btrotjVXnRf/hz7NH4kqkhPBjOLtPzNzQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDjJtR%2FbtrotjVXnRf%2Fhz7NH4kqkhPBjOLtPzNzQk%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;579&quot; height=&quot;232&quot; data-origin-width=&quot;579&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&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;Directory&amp;gt; ~ &amp;lt;/Directory&amp;gt; 지시자는 지정한 디렉터리 이하의 모든 웹문서들에 대하여 어떤 서비스와 기능을 허용/거부할 것인지를 설정하는 매우 중요한 지시자이다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;Directory&amp;gt; 지시자의 설정은 개인에 따라 다르니 각자 목적에 맞게 설정해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Options&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 지정한 디렉토리 이하에 모든 파일과 디렉토리들에 적용할 접근제어를 설정한다. 디렉토리를 보여줄 것인가? CGI를 허용할 것인가? SSI를 허용할 것인가? 등의 설정을 여기서 하게 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;FollowSymlinks&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 심볼의 링크를 허용한다. 이 옵션을 지정하면 웹브라우저에서 링크 파일의 경로까지도 확인할 수 있게 된다. 보안상 이 값은 설정하지 않는 것이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AllowOverride&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어떻게 접근을 허락할 것인가에 대한 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;None&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AccessFileName에 지정된 파일을 엑세스 인증 파일로 인식하지 않는다. AccessFileName의 값이 대부분 .htaccess 이므로 이를 무시하게 된다는 의미가 된다. 이 파일을 무시하기 때문에 새로운 접근 인증 방식을 Override하지 않는다. 대부분이 보안이나 중요한 디렉토리에서 사용할 수 있는 것으로 아주 제한적인 접근만을 허용하고자 할 때에 사용하는 값이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;All&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이전의 인증방식에 대하여 새로운 접근 인증방식을 우선 적용하도록 Override를 허용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Order deny, allow&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;allow 설정을 먼저 확인하고 그다음 deny 설정을 확인한다. 뒤에 것이 우선한다는 뜻&lt;/span&gt;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;6. apache mod_jk 모듈 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아파치와 톰캣의 연동 원리는?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아파치와 톰캣이 연동하기 위해선 AJP를 통해 서로 통신을 하여야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AJP란 아파치가 웹서버와 외부 서비스(톰캣 등)와 연동하기 위해 정한 규약(프로토콜)이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아파치는 이를 사용하여 80 포트로 들어오는 요청은 자신이 받고, 이 요청 중 서블릿을 필요로 하는 요청은 톰캣에 접속하여 처리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1) 아파치 웹서버의 httpd.conf 에 톰캣 연동을 위한 설정을 추가하고 톰캣에서 처리할 요청을 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2) 사용자의 브라우저는 아파치 웹서버(보통 80 포트)에 접속해 요청&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3) 아파치 웹서버는 사용자의 요청이 톰캣에서 처리하도록 지정된 요청인지 확인. 요청을 톰캣에서 처리해야 하는 경우 아파치 웹서버는 톰캣의 AJP포트(보통 8009 포트)에 접속해 요청을 전달&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4) 톰캣은 아파치 웹서버로부터 요청을 받아 처리한 후, 처리 결과를 아파치 웹서버에 되돌려줌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;5) 아파치 웹서버는 톰캣으로부터 받은 처리 결과를 사용자에게 전송&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;LoadModule jk_module modules/mod_jk.so(모듈 load )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JkWorkersFile /apps/apache/conf/workers.properties (mod_jk를 위한 tomcat 프로퍼티)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JkLogLevel error (로그 레벨 설정)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JkLogStampFormat &quot;[%a %b %d %H %M %S %Y]&amp;ldquo; (로그 포맷에 사용할 시간 형식 지정)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresActive On (ExpiresByType과 ExpiresDefault 지시어로 지정한 규칙에 따라 서비스하려는 문서에 이 헤더들을 생성한다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;사용자 PC에서 이미지가 캐쉬된다. 이미지가 많은 사이트에서 아주 효과적으로 사용 가능하며 이미지가 자주 바뀌는 사이트에선 비추천이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType image/gif &quot;access plus 1 weeks&amp;ldquo; (1주 후에 다시 받아온다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType image/jpeg &quot;access plus 1 weeks&amp;ldquo; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType image/png &quot;access plus 1 weeks&amp;ldquo; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType text/css &quot;access plus 1 weeks&amp;ldquo; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType text/javascript &quot;access plus 1 weeks&amp;ldquo; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType application/javascript &quot;access plus 1 weeks&amp;ldquo; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ExpiresByType text/html &quot;now plus 0 minutes&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;Tomcat과의 연동 시에 Tomcat과 같은 DocRoot를 사용할 경우 Apache단에서 설정으로 WEB-INF, META-INF 로의 접근을 막아야 한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;Location /WEB-INF&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SetHandler WEB-INF&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Order deny,allow&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Deny from all&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;Location /META-INF&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SetHandler META-INF&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Order deny,allow&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Deny from all&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;lt;/Location&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;에러 페이지 지정 - 보통 기본 보안점검 사항에 들어가는 디렉터리 리스팅, 불필요한 페이지 및 에러 페이지를 통해 서버 정보 및 중요 정보가 노출되는지 점검&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorDocument 403 /error/e_403.jsp&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorDocument 404 /error/e_404.jsp&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorDocument 405 /error/e_405.jsp&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorDocument 500 /error/e_500.jsp&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;TRACE method는 잠재적으로 cross-site tracing, basic 인증 암호 가로채기 등에 악용 가능&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;TraceEnable Off&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&gt;Dynamic Shared Object (DSO) Support&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DSO 방식으로 컴파일된 Apache의 모듈을 적재. 모듈의 위치는 /etc/httpd/modules이며 이는 usr/lib64/httpd/modules의 심볼릭 링크이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;LoadModule authn_file_module modules/mod_authn_file.so&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. . .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;7. httpd-vhost.conf 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;VirtualHost *:80 -&amp;gt; 가상 호스트 구역을 설정하여 사용한다. 가상 호스트의 첫 번째 구역은 클라이언트가 요청한 ServerName(도메인)을 찾지 못하였을 경우에 보여지게 될 부분을 설정하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ServerAdmin : 해당 가상호스트의 관리자 이메일 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DocumentRoot : 해당 가상 호스트의 홈페이지 디렉토리 위치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ServerName : 해당 가상호스트의 도메인명&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ServerAlias : 가상 호스트 설정에 별칭으로 등록한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ErrorLog : 해당 가상 호스트의 웹 에러로그 파일 위치&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CustomLog : 해당 가상호스트의 웹 로그파일 위치 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ProxyPreserveHost on : HTTP 요청 헤더의 Host: 부분을 유지하는 옵션&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ProxyPass : 서버가 적절한 문서를 가져오도록 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ReversPassReverse : 외부에서 접속했을 때 내부 서버나 다른 곳으로 연결해 주는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;DirectoryIndex : 클라이언트의 요청이 있을 때, 파일명을 지정하지 않고 디렉토리만 지정될 경우가 있다. 파일명이 생략된 경우에 어떤 파일을 반환할까를 DirectoryIndex로 지정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Alias : 별칭을 만드는 지시자이고 Alias 별칭명 실제명과 같은 방식으로 만들게 된다. 별칭명뒤에 /를 포함하면 아파치 서버는 URL에도 /이 있어야 처리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JkMount : 확장자 jsp, json, xml, do를 가진 경로는 woker tomcat으로 연결하는 구문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;8. workers.properties 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;worker 이름 : 뒷단의 tomcat 서버를 구분할 수 있는 이름이어야 한다. 나중에 로드밸런싱을 할 때에 tomcat에도 적용되는 이름이기 때문에 설정 중요&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;worker port : 뒷단 tomcat 서버의 AJP 포트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;worker lbfactor : 부하분산을 위한 설정으로 뒷단 tomcat 서버들에 연결 무게를 설정해준다.&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;hwpEditorBoardContent&quot; contenteditable=&quot;true&quot; data-hjsonver=&quot;1.0&quot; data-jsonlen=&quot;224413&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 - &lt;a href=&quot;https://webdir.tistory.com/178&quot;&gt;https://webdir.tistory.com/178&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Network</category>
      <category>httpd-vhost.conf</category>
      <category>httpd.conf</category>
      <category>아파치 설정</category>
      <category>아파치 설정 파일</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/74</guid>
      <comments>https://rma7.tistory.com/74#entry74comment</comments>
      <pubDate>Mon, 20 Dec 2021 21:07:43 +0900</pubDate>
    </item>
    <item>
      <title>[Network] Virtual Host(가상 호스트)란?</title>
      <link>https://rma7.tistory.com/73</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;가상 호스트란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본적으로 웹서버에 존재하는 주 호스트 도메인을 등록하여 사용하고 있지만 추가적으로 한 서버에 여러 도메인을 등록하여 사용한다는 의미이다. &lt;/span&gt;&lt;span&gt;가상 호스트 서버를 이용하여 제한된 공간 안에서 여러 개의 홈페이지를 제공해주는 서비스가(웹, 메일 등) 호스팅 서버스이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache에서는 두 가지 방식을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Name-based Virtual Host&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Name-based 방식의 가상 호스트는 같은 IP 주소를 가지고 여러 개의 호스트명을 가진다.(가장 보편적인 방법)&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&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;618&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2wyBu/btrofFmwzTu/aZRXJrcftjWsyy4eqtt7kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2wyBu/btrofFmwzTu/aZRXJrcftjWsyy4eqtt7kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2wyBu/btrofFmwzTu/aZRXJrcftjWsyy4eqtt7kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2wyBu%2FbtrofFmwzTu%2FaZRXJrcftjWsyy4eqtt7kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;207&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. IP-based Virtual Host&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP Address 기반의 가상 호스트라고 하며, 각 웹 사이트마다 다른 IP Address 또는 Port를 가지는 방식이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP Adress를 다르게 하는 방법도 있지만 동일한 IP Address를 주고 Port를 다르게 하는 방법도 있다.&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;- IP Address를 다르게 하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 호스트 각각에 하나씩의 IP Address를 할당하여 운용 웹 호스팅 초창기에 사용된 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name-based virtual host 보다 안정적이고, 더 효율적이며, 관리하기도 쉽다. 이 방식으로 하면 각각의 웹사이트를 하나의 물리적인 서버에서 별도 관리할 수도 있다.&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;618&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/COSXc/btrolUjevOm/jKJLMKiAL8H31DG5k6I3SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/COSXc/btrolUjevOm/jKJLMKiAL8H31DG5k6I3SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/COSXc/btrolUjevOm/jKJLMKiAL8H31DG5k6I3SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCOSXc%2FbtrolUjevOm%2FjKJLMKiAL8H31DG5k6I3SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;207&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div id=&quot;hwpEditorBoardContent&quot; contenteditable=&quot;true&quot; data-hjsonver=&quot;1.0&quot; data-jsonlen=&quot;6294&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Port를 다르게 하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;동일한 호스트에 포트만 다르게 지정하여 운용 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;80번이 주 호스트이고, 8080, 8081, 8082와 같이 순서대로 포트를 지정하여 가상 호스트를 할당한다.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boWkff/btroqR0kwqt/q4dH86vh7jRkHuEApDojV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boWkff/btroqR0kwqt/q4dH86vh7jRkHuEApDojV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boWkff/btroqR0kwqt/q4dH86vh7jRkHuEApDojV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboWkff%2FbtroqR0kwqt%2Fq4dH86vh7jRkHuEApDojV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;209&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 - &lt;a href=&quot;https://blog.embian.com/46&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.embian.com/46&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://seokbeomkim.github.io/posts/vhost-host-header/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://seokbeomkim.github.io/posts/vhost-host-header/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;</description>
      <category>Network</category>
      <category>virtual host</category>
      <category>가상호스트</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/73</guid>
      <comments>https://rma7.tistory.com/73#entry73comment</comments>
      <pubDate>Mon, 20 Dec 2021 20:50:36 +0900</pubDate>
    </item>
    <item>
      <title>Apache와 Tomcat이란?</title>
      <link>https://rma7.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;프로젝트를 진행하면서 Spring에서 Tomcat으로만 진행했던 터라 Apache Server와 Tomcat에 차이점에 대해 알지 못했고 현재 둘 다 사용 중이라 이참에 블로그 글을 쓰면서 알아보려고 한다.&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;&amp;nbsp;Apache란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흔히 아파치라고 부르는 것은 오픈 소스 소프트웨어 그룹인 아파치 재단에서 만든 &lt;b&gt;웹서버(Apache HTTP Server)&lt;/b&gt;를 지칭하고&amp;nbsp; 정적인 데이터(html, css, image 등등)를 처리 해 준다.&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;웹서버는 클라이언트가 GET, POST, DELETE 등의 메소드를 이용해 요청하면 그에 대한 결과를 돌려주는 기능을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 요청한 것들 중 웹서버 자체적으로 처리할 수 없는 것들을 톰캣과 같은 컨테이너에게 넘겨 처리결과를 받아와서 클라이언트에게 넘겨주는 역할도 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;Tomcat이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣은 동적인 데이터를 처리하는 웹서버이다. 동적인 처리를 담당하는 서버를 &lt;b&gt;WAS(Web Application Server)&lt;/b&gt;라고 하며 웹서버와 웹 컨테이너의 결합으로 다양한 기능을 컨테이너에 구현하여 규모가 크고 엔터프라이즈 환경에 필요한 트랜잭션, 보안, 트래픽 관리, DB커넥션 풀, 비즈니스 로직 수행 등등 다양한 역할을 수행할 수 있는 서버이다.&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;&amp;nbsp;Was의 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 요청(브라우저) -&amp;gt; 웹서버 -&amp;gt; WAS -&amp;gt; 웹서버 -&amp;gt; 사용자 응답 메세지(브라우저)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;was.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBAExb/btrnVbdQLap/EABFClIlJPM5Kpz1RLbC00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBAExb/btrnVbdQLap/EABFClIlJPM5Kpz1RLbC00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBAExb/btrnVbdQLap/EABFClIlJPM5Kpz1RLbC00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBAExb%2FbtrnVbdQLap%2FEABFClIlJPM5Kpz1RLbC00%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;803&quot; height=&quot;345&quot; data-filename=&quot;was.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아파치 톰캣으로 부르는 이유는 기본적으로 아파치와 톰캣의 기능은 나누어져 있지만&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;톰캣 안에 있는 컨테이너를 통해 일부 아파치의 기능을 포함하기 때문에 보통 아파치 톰캣으로 합쳐 부른다.&lt;/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;Apache와 Tomcat의 차이점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAS(톰캣)만 쓰지 않고 아파치를 쓰는 이유는 목적이 다르기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹서버는 정적인 데이터를 처리하는 서버이며, 이미지나 단순한 html을 처리하는 서버라면 웹서버가 적당하며 빠르고 안정적이다. WAS는 동적인 데이터를 처리하는 서버로 DB와 연결되어 데이터를 주고받거나 프로그램으로 데이터 조작이 필요한 경우 WAS를 활용한다.&amp;nbsp; 아파치(80 포트) , 톰캣 (8080 포트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 - &lt;a href=&quot;https://limmmee.tistory.com/4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://limmmee.tistory.com/4&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://ithub.tistory.com/101&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ithub.tistory.com/101&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;a href=&quot;https://velog.io/@kdhyo/Apache-Tomcat-%EB%91%98%EC%9D%B4-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EC%A7%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@kdhyo/Apache-Tomcat&lt;/a&gt;&lt;/p&gt;</description>
      <category>Network</category>
      <category>Apache</category>
      <category>tomcat</category>
      <category>아파치</category>
      <category>톰캣</category>
      <author>홍크</author>
      <guid isPermaLink="true">https://rma7.tistory.com/72</guid>
      <comments>https://rma7.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 14 Dec 2021 22:15:51 +0900</pubDate>
    </item>
  </channel>
</rss>