<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>m_seo.log</title>
        <link>https://velog.io/</link>
        <description>기억도 기록도</description>
        <lastBuildDate>Tue, 13 Dec 2022 09:56:14 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. m_seo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/m_seo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[HTTP 기본]]></title>
            <link>https://velog.io/@m_seo/HTTP-%EA%B8%B0%EB%B3%B8</link>
            <guid>https://velog.io/@m_seo/HTTP-%EA%B8%B0%EB%B3%B8</guid>
            <pubDate>Tue, 13 Dec 2022 09:56:14 GMT</pubDate>
            <description><![CDATA[<h2 id="📌httphypertext-transfer-protocol">📌HTTP(HyperText Transfer Protocol)</h2>
<p>HTTP 메시지에 모든 것을 전송</p>
<ul>
<li>HTML, TEXT</li>
<li>IMAGE, 음성, 영상, 파일</li>
<li>JSON, XML(API)</li>
<li>거의 모든 형태의 데이터 전송 가능</li>
<li>서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용</li>
</ul>
<blockquote>
<p> HTTP1.1 가장 많이 사용, 우리에게 가장 중요한 버전.
        이후 버전은 성능 개선에 초첨이 맞춰졌다.
        RFC2068 (1997) -&gt; RFC2616 (1999) -&gt; RFC7230~7235 (2014)</p>
</blockquote>
<h2 id="📌기반-프로토콜">📌기반 프로토콜</h2>
<ul>
<li>TCP : HTTP1.1, HTTP2</li>
<li>UDP : HTTP3</li>
<li>현재 HTTP1.1을 주로 사용</li>
<li>HTTP2, HTTP3도 점점 증가</li>
</ul>
<h2 id="📌http-특징">📌HTTP 특징</h2>
<ul>
<li>클라이언트 서버 구조</li>
<li>무상태 프로토콜(스테이스리스), 비연결성</li>
<li>HTTP 메시지</li>
<li>단순함, 확장 가능</li>
</ul>
<h2 id="📌클라이언트-서버-구조">📌클라이언트 서버 구조</h2>
<ul>
<li>Request Response 구조</li>
<li>클라이언트는 서버에 요청을 보내고, 응답을 대기</li>
<li>서버가 요청에 대한 결과를 만들어서 응답
<img src="https://velog.velcdn.com/images/m_seo/post/b84effc3-d0be-4daf-9d94-295263fa7b22/image.png" alt=""></li>
</ul>
<h2 id="📌무상태-프로토콜---스테이스리스stateless">📌무상태 프로토콜 - 스테이스리스(Stateless)</h2>
<ul>
<li>서버가 클라이언트의 상태를 보존 X : </li>
<li>장점 : 서버 확장성 높음(스케일 아웃)</li>
<li>단점 : 클라이언트가 추가 데이터 전송</li>
</ul>
<h2 id="📌statefulstateless-차이">📌Stateful,Stateless 차이</h2>
<blockquote>
<ul>
<li>상태유지(Stateful) : 고객이 물건을 구입할 때, 중간에 다른 점원으로 바뀌면 안된다.(중간에 다른 점원으로 바뀔 때 상태 정보를 다른 점원에게 미리 알려줘야 한다.)</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/m_seo/post/61f0ef2f-e24e-4a1d-992d-28c776b01436/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_seo/post/64c12200-5bf4-4236-888a-24b9e86fe29e/image.png" alt=""></p>
<blockquote>
<ul>
<li>무상태(Stateless) : 고객이 물건을 구입할 때, 중간에 다른 점원으로 바뀌어도 된다.</li>
</ul>
</blockquote>
<ul>
<li>갑자기 고객이 증가해도 점원을 대거 투입할 수 있다.</li>
<li>갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.</li>
<li>무상태는 응답 서버를 쉽게 바꿀 수 있다 -&gt; 무한한 서버 증설 가능 </li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/46b12fbe-e8eb-4a44-a780-cce6e0870a84/image.png" alt="">
<img src="https://velog.velcdn.com/images/m_seo/post/70d0f77d-501c-4d3f-996b-df0eb2cc87a0/image.png" alt=""></p>
<h2 id="📌stateless-실무-한계">📌Stateless 실무 한계</h2>
<ul>
<li>모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.</li>
<li>무상태 ex. 로그인이 필요 없는 단순한 서비스 소개 화면</li>
<li>상태유지 ex. 로그인</li>
<li>로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지</li>
<li>일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지</li>
<li>상태 유지는 최소한만 사용</li>
</ul>
<h2 id="📌비연결성">📌비연결성</h2>
<ul>
<li>HTTP는 기본이 연결을 유지하지 않는 모델</li>
<li>일반적으로 초 단위의 이하의 빠른 속도로 응답</li>
<li>1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음
  ex. 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지는 않는다.</li>
<li>서버 자원을 매우 효율적으로 사용할 수 있음</li>
</ul>
<h2 id="📌비연결성-한계와-극복">📌비연결성 한계와 극복</h2>
<ul>
<li>TCP/IP 연결을 새로 맺어야 함 - 3 way handshake 시간 추가</li>
<li>웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지등 수 많은 자원이 함께 다운로드</li>
<li>지금은 HTTP 지속 연결(Persistent Connections)로 문제 해결</li>
<li>HTTP2, HTTP3에서 더 많은 최적화</li>
</ul>
<blockquote>
<p>HTTP 초기</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/m_seo/post/ff49352f-1c59-4056-975c-b65d2b2d3f7c/image.png" alt=""></p>
<blockquote>
<p>HTTP 지속 연결</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/m_seo/post/177cdcc1-2d04-4b5b-9bae-4f237050ae88/image.png" alt=""></p>
<blockquote>
<h2 id="📌http-정리">📌HTTP 정리</h2>
</blockquote>
<ul>
<li>HTTP 메시지에 모든 것을 전송</li>
<li>HTTP 역사 HTTP1.1을 기준으로 학습</li>
<li>클라이언트 서버 구조</li>
<li>무상태 프로토콜(스테이스리스)</li>
<li>HTTP 메시지</li>
<li>단순함, 확장 가능</li>
</ul>
<hr>
<h6 id="모든-개발자를-위한-http-웹-기본-지식---김영한-님의-강의를-참고하였습니다">#모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 님의 강의를 참고하였습니다.</h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[#2557 #1000 #1001 #10998 #1008 #10869 #10926]]></title>
            <link>https://velog.io/@m_seo/2557-1000-1001-10998-1008-10869-10926</link>
            <guid>https://velog.io/@m_seo/2557-1000-1001-10998-1008-10869-10926</guid>
            <pubDate>Wed, 07 Dec 2022 17:06:27 GMT</pubDate>
            <description><![CDATA[<h2 id="📌2557번-문제-및-출처">📌<a href="https://www.acmicpc.net/problem/2557">2557번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>Hello World!를 출력하시오.</p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>public class Main {

    public static void main(String[] args) {
        System.out.println(&quot;Hello World!&quot;);
    }
}</code></pre><h2 id="📌1000번-문제-및-출처">📌<a href="https://www.acmicpc.net/problem/1000">1000번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.</p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int a, b;
        a = scanner.nextInt();
        b = scanner.nextInt();
        System.out.println(a + b);
    }
}</code></pre><h2 id="📌-1001번-문제-및-출처">📌 <a href="https://www.acmicpc.net/problem/1001">1001번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.</p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int a, b;
        a = scanner.nextInt();
        b = scanner.nextInt();
        System.out.println(a - b);
    }
}</code></pre><h2 id="📌10998번-문제-및-출처">📌<a href="https://www.acmicpc.net/problem/10998">10998번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>두 정수 A와 B를 입력받은 다음, A×B를 출력하는 프로그램을 작성하시오.</p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int a, b;
        a = scanner.nextInt();
        b = scanner.nextInt();
        System.out.println(a * b);
    }
}</code></pre><h2 id="📌1008번-문제-및-출처">📌<a href="https://www.acmicpc.net/problem/1008">1008번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.</p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        double a, b;
        a = scanner.nextInt();
        b = scanner.nextInt();
        System.out.println(a / b);
    }
}</code></pre><h2 id="📌10869번-문제-및-출처">📌<a href="https://www.acmicpc.net/problem/10869">10869번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. </p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int a, b;
        a = scanner.nextInt();
        b = scanner.nextInt();
        System.out.println(a + b);
        System.out.println(a - b);
        System.out.println(a * b);
        System.out.println(a / b);
        System.out.println(a % b);
    }
}</code></pre><h2 id="📌10926번-문제-및-출처">📌<a href="https://www.acmicpc.net/problem/10926">10926번 문제 및 출처</a></h2>
<blockquote>
<p>문제</p>
</blockquote>
<p>준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.</p>
<blockquote>
<p>코드</p>
</blockquote>
<pre><code>import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(str+&quot;??!&quot;);
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[시퀀스(Sequence) 생성 및 사용법]]></title>
            <link>https://velog.io/@m_seo/%EC%8B%9C%ED%80%80%EC%8A%A4Sequence-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@m_seo/%EC%8B%9C%ED%80%80%EC%8A%A4Sequence-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Sat, 26 Nov 2022 14:00:34 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-시퀀스sequence">📌 시퀀스(Sequence)</h2>
<ul>
<li>유일한 값을 생성해주는 오라클 객체이다.</li>
<li>일련번호, 자동증가 값을 생성한다.</li>
<li>시퀀스는 독립적으로 테이블과 별개로 동작한다.</li>
<li>모든 DBMS에서 사용하는 것은 아니다.</li>
<li>시퀀스는 메모리에 cache하여 성능을 향상 시킬 수 있다.</li>
</ul>
<blockquote>
<p>보통 시퀀스를 사용하는 부분은 테이블에서 <strong>기본키(Primary Key)</strong>를 생성하여 사용하기 위해 사용한다. 기본키다 보니 시퀀스의 숫자를 자동으로 증가시켜 중복이 안되는 고유키로 사용하는 것이다.</p>
</blockquote>
<h2 id="📌-시퀀스-구문">📌 시퀀스 구문</h2>
<pre><code>CREATE SEQUENCE 스키마명.시퀀스명
       INCREMENT BY 1         --&gt; 증가값(1씩 증가)
       START WITH 1             --&gt; 시작값        
       MINVALUE 1             --&gt; 최솟값
       MAXVALUE 1000         --&gt; 최댓값
       NOCYCLE                 --&gt; 최댓값 도달시 시작값 부터 다시 반복
       NOCACHE                 --&gt; CACHE를 사용할지 여부
       NOORDER;                 --&gt; 요청 순서대로 값을 생성할지 여부</code></pre><blockquote>
<ul>
<li>INCREMENT BY : 시퀀스 실행 시 증가시킬 값</li>
</ul>
</blockquote>
<ul>
<li>START WITH   : 시퀀스의 시작값(MINVALUE와 같거나 커야한다.)</li>
<li>MINVALUE     : 시퀀스가 시작되는 최솟값</li>
<li>MAXVALUE     : 시퀀스가 끝나는 최댓값</li>
<li>NOCYCLE|CYCLE : NOCYCLE(반복안함), CYCLE(시퀀스의 최댓값에 도달 시 최솟값 1부터 다시시작)</li>
<li>NOCACHE|CACHE : NOCACHE(사용안함), CACHE(캐시를 사용하여 미리 값을 할당해 놓아서 속도가 빠르며, 동시 사용자가 많을 경우 유리)</li>
<li>NOORDER|ORDER : NOORDER(사용안함), ORDER(요청 순서로 값을 생성하여 발생 순서를 보장하지만 조금의 시스템 부하가 있다.)</li>
</ul>
<h2 id="📌-시퀀스-생성">📌 시퀀스 생성</h2>
<pre><code>CREATE SEQUENCE emp_seq
       INCREMENT BY 1
       START WITH 1
       MINVALUE 1
       MAXVALUE 9999
       NOCYCLE
       NOCACHE
       NOORDER;
</code></pre><blockquote>
<p>위의 시퀀스는 1부터 시작하여 9999까지 1씩 증가한다.</p>
</blockquote>
<h2 id="📌-시퀀스-사용">📌 시퀀스 사용</h2>
<pre><code>SELECT emp_seq.NEXTVAL
  FROM dual</code></pre><blockquote>
<p>시퀀스명.NEXTVAL을 사용하여 일렬번호를 생성할 수 있다.
   시퀀스를 실행할 때마다 값이 증가하니 주의해야 한다.
   (증가된 값은 다시 내릴 수 없다.)</p>
</blockquote>
<h2 id="📌-시퀀스-수정">📌 시퀀스 수정</h2>
<pre><code>ALTER SEQUENCE emp_seq INCREMENT BY 2</code></pre><blockquote>
<p>시퀀스 증가값을 1에서 2로 변경</p>
</blockquote>
<pre><code>ALTER SEQUENCE emp_seq MAXVALUE 99999</code></pre><blockquote>
<p>시퀀스 최댓값을 9999에서 99999로 변경</p>
</blockquote>
<ul>
<li>START WITH는 변경이 불가하며, 이 외에는 모두 변경이 가능하다.</li>
<li>MINVALUE를 바꿀때, 현재값이랑 동일하게 바꿀경우 에러
(MINVALUE cannot be made to exceed the current value)가 
발생할 수 있어 현재 값 부터 초기화 해준뒤에 사용해야 한다.</li>
</ul>
<h2 id="📌-시퀀스-검색">📌 시퀀스 검색</h2>
<pre><code>SELECT * FROM NAME_SEQUENCES;</code></pre><blockquote>
<p>현재 계정의 모든 시퀀스의 데이터를 전부 보여준다.</p>
</blockquote>
<h2 id="📌-시퀀스-삭제">📌 시퀀스 삭제</h2>
<pre><code>DROP SEQUENCE emp_seq</code></pre><blockquote>
<p>시퀀스 값을 초기화 하기 위해서는 시퀀스를 삭제 후 다시 생성하거나, INCREMENT BY 값을 마이너스로 수정하여 감소시킬 값만큼 실행해야 한다.</p>
</blockquote>
<hr>
<h2 id="📌-시퀀스-적용">📌 시퀀스 적용</h2>
<ul>
<li><p>테이블 생성</p>
<pre><code>CREATE TABLE MEMBER_seq(
NO NUMBER PRIMARY KEY, -- 기본키(시퀀스 적용할 컬럼)
NAME VARCHAR2(10) NOT NULL,
PHONENUMBER VARCHAR2(20) NOT NULL
);</code></pre><blockquote>
<p>시퀀스를 테이블에 적용하기 위해서는 INSERT문을 이용해서 데이터를 입력하는 곳에 &quot;시퀀스명.NEXTVAL&quot;를 입력한다.(시퀀스는 대부분 INSERT 문과 사용된다.</p>
</blockquote>
</li>
<li><p>데이터 추가</p>
<pre><code>INSERT INTO MEMBER_seq
VALUES(NO_SEQ.NEXTVAL, &#39;JOKER&#39;, &#39;01012345678&#39;);
</code></pre></li>
</ul>
<p>INSERT INTO MEMBER_seq
VALUES(NO_SEQ.NEXTVAL, &#39;BATMAN&#39;, &#39;01012340987&#39;);</p>
<p>INSERT INTO MEMBER_seq
VALUES(NO_SEQ.NEXTVAL, &#39;Quinn&#39;, &#39;01010041004&#39;);</p>
<pre><code>
+ MEMBER_seq 테이블 검색</code></pre><p>SELECT * FROM MEMBERINFO;</p>
<pre><code>
+ 현재 시퀀스 값 검색</code></pre><p>SELECT NO_SEQ.CURRVAL FROM DUAL;</p>
<pre><code>
&gt; 시퀀스를 적용하여 데이터를 입력하면 자동적으로 값이 증가되면서 저장되는 것을 알 수 있다. NEXTVAL는 현재 시퀀스 값의 다음 값을 반환하고, CURRVAL는 현재 시퀀스 값을 반환한다.

+ 시퀀스 수정</code></pre><p>ALTER SEQUENCE NO_SEQ
  MAXVALUE 1000;</p>
<pre><code>
+ 시퀀스 수정 결과 검색</code></pre><p>SELECT SEQUENCE_NAME, MAX_VALUE 
FROM USER_SEQUENCES;</p>
<pre><code>
+ 시퀀스 삭제</code></pre><p>DROP SEQUENCE NO_SEQ;</p>
<pre><code>
+ 시퀀스 삭제 결과 확인</code></pre><p>SELECT SEQUENCE_NAME FROM USER_SEQUENCES ;</p>
<pre><code>
+ 최종 테이블 검색</code></pre><p>SELECT * FROM MEMBER_seq;</p>
<p>```</p>
<blockquote>
<p>시퀀스를 삭제하여도 이미 입력한 데이터는 영향을 받지 않는다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[home.jsp, web.xml, servlet-context.xml]]></title>
            <link>https://velog.io/@m_seo/home.jsp-web.xml-servlet-context.xml</link>
            <guid>https://velog.io/@m_seo/home.jsp-web.xml-servlet-context.xml</guid>
            <pubDate>Tue, 22 Nov 2022 13:54:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/m_seo/post/4617f31a-bfa0-4664-b119-1bf411ef896e/image.png" alt=""></p>
<blockquote>
<ol>
<li>클라이언트 요청(/, root페이지 요청)</li>
<li>web.xml에서 dispatcherServlet가 클라이언트 요청을 핸들링</li>
<li>servlet-context.xml에서 해당 클래스의 웹요청을 처리하는 컨트롤러 사용(HandlerMapping으로 Controller를 검색)</li>
<li>해당 Controller가 요청을 처리 후 , home을 리턴</li>
<li>View에 출력</li>
</ol>
</blockquote>
<h2 id="📌-dispatcherservlet">📌 DispatcherServlet</h2>
<p>Model 파트와 Controller파트 View파트를 조합하여 브라우저로 출력해주는 역할을 수행하는 클래스
<img src="https://velog.velcdn.com/images/m_seo/post/76bdb8dd-d678-4358-9ef8-0ab67c4b0f7b/image.png" alt=""></p>
<h2 id="📌-wen-inf-webxml">📌 /WEN-INF-web.xml</h2>
<p>웹프로젝트의 배치 기술서(deploy descriptor, 웹프로젝트의 환경설정파일)
스프링 프로젝트가 실행되면 가장 먼저 web.xml을 읽어 들이게 되고 위에서부터 차례로 태크를 해석하기 시작한다.</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;web-app version=&quot;2.5&quot; xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&gt;

    &lt;!-- The definition of the Root Spring Container shared by all Servlets and Filters --&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
    &lt;!--  스프링의 환경설정 파일인 root-context.xml을 가장 먼저 참조한다. --&gt;
        &lt;param-value&gt;/WEB-INF/spring/root-context.xml&lt;/param-value&gt;
    &lt;/context-param&gt;

    &lt;!-- Creates the Spring Container shared by all Servlets and Filters --&gt;
    &lt;listener&gt;
        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
    &lt;/listener&gt;

    &lt;!-- Processes application requests --&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;appServlet&lt;/servlet-name&gt;
        &lt;!--  스프링에 내장된 서블릿 클래스 --&gt;
        &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
            &lt;!-- /WEB-INF/spring/appServlet/servlet-context.xml을 참조 --&gt;
            &lt;!--  xml 파일 안제 정의된 객체들을 로딩한다. --&gt;
            &lt;param-value&gt;/WEB-INF/spring/appServlet/servlet-context.xml&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;!-- 가장 첫번째 우선순위를 뜻한다. --&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;

    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;appServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/&lt;/url-pattern&gt;
        &lt;!-- DispatcherServlet이 모든 요청을 가로챌 수 있도록 등록 --&gt;
        &lt;!-- 특정 url으로 변경하여 사용가능 ex) *.do --&gt;
    &lt;/servlet-mapping&gt;
&lt;/web-app&gt;</code></pre><h2 id="📌-web-infspringroot-contextxml">📌 /WEB-INF/spring/root-context.xml</h2>
<p>스프링의 환경설정 파일, 
현재는 별다른 내용을 작성하기 않았기 때문에 web.xml에서는 root-context.xml을 건너 뛰게 된다.</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd&quot;&gt;

    &lt;!-- Root Context: defines shared resources visible to all other web components --&gt;

&lt;/beans&gt;</code></pre><h2 id="📌-servlet-contextxml">📌 servlet-context.xml</h2>
<p>web.xml에서 DispatcherServlet(스프링에 내장된 컨트롤러)로 이동하게 되고, /WEB-INF/spring/appServlet/servlet-context.xml을 참조하게 된다.</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/mvc&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
    xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
    xsi:schemaLocation=&quot;http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd&quot;&gt;

    &lt;!-- DispatcherServlet Context: defines this servlet&#39;s request-processing infrastructure --&gt;

    &lt;!-- Enables the Spring MVC @Controller programming model --&gt;

    &lt;!-- 매노테이션을 사용가능하도록 설정 --&gt;
    &lt;annotation-driven /&gt;

    &lt;!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --&gt;
    &lt;resources mapping=&quot;/resources/**&quot; location=&quot;/resources/&quot; /&gt;

    &lt;!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --&gt;
    &lt;!-- view resolver(뷰리졸버, 뷰 해석기) --&gt;
    &lt;beans:bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&gt;
        &lt;!-- 뷰(jsp)의 접두어, 접미어 설정 : 파일명만 작성할 수 있게 세팅 --&gt;
        &lt;!-- 접두어(디렉토리) --&gt;
        &lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        &lt;!-- 접미어(확장자) --&gt;
        &lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
    &lt;/beans:bean&gt;

    &lt;context:component-scan base-package=&quot;com.example.spring01&quot; /&gt;



&lt;/beans:beans&gt;</code></pre><h2 id="📌homecontroller">📌HomeController</h2>
<pre><code>package com.example.spring01;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */

// Controller 애노테이션
@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */

    //url mapping
    //기본, 루트 페이지 =&gt; home매서드 호출
    @RequestMapping(value = &quot;/&quot;, method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info(&quot;Welcome home! The client locale is {}.&quot;, locale);

        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

        String formattedDate = dateFormat.format(date);

        //모델(서블릿의 request 객체를 대체한 것)
        model.addAttribute(&quot;serverTime&quot;, formattedDate );

        //home,jsp로 포워딩
        //servlet-context.xml
        //&lt;beans:property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot; /&gt;
        //&lt;beans:property name=&quot;suffix&quot; value=&quot;.jsp&quot; /&gt;
        //디렉토리(접두어)와 jsp(접미어) 확장자를 제외하고 이름만 작성하도록 세팅
        return &quot;home&quot;;
    }

}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Project 디렉토리 구조]]></title>
            <link>https://velog.io/@m_seo/spring-project-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@m_seo/spring-project-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Tue, 22 Nov 2022 13:06:50 GMT</pubDate>
            <description><![CDATA[<h2 id="📌-스프링-프로젝트-디렉토리-구조">📌 스프링 프로젝트 디렉토리 구조</h2>
<p><strong>src/main/java</strong> : 자바코드(컨트롤러, 모델)
<strong>src/main/resources</strong> : 자바 코드에서 사용할 리소스(mapper, sql)
<strong>src/test/java</strong> : 테스트 코드
<strong>src/test/resources</strong> : 테스트 코드에서 사용할 리소스
<strong>JRE System Library</strong> : 자바 컴파일러
<strong>Maven Dependencies</strong> : 라이브러리 관리도구(maven에서 다운받은 jar파일)</p>
<p><strong>src</strong> : web디렉토리
<strong>src/main/webapp/resources</strong> : js, css, image 등 관리
<strong>src/main/webapp/WEB-INF/classes</strong> : 컴파일된 클래스
<strong>src/main/webapp/WEB-INF/spring</strong> : 스프링 환경설정파일
(root-contect.xml,servlet-context.xml)
<strong>src/main/webapp/WEB-INF/views</strong> : html, jsp 파일
<strong>src/main/webapp/</strong> : 외부접근가능
<strong>src/main/webapp/WEB-INF</strong> : 외부접근 불가, 컨트롤러 경유해서 접근 가능</p>
<h2 id="📌-web-inf-폴더">📌 WEB-INF 폴더</h2>
<p>&lt;WEB-INF : 접근 금지 디렉토리 - 보안성을 이유로 
외부에서 직접 접속을 할 수 없게 막았다.)
외부에서 직접 접속이 차단되어 있다. 그 이유는 컴파일된 클래스와 스프링 환경설정파일(DB연결정보)이 존재하기 때문이다.
JSP 또한 외부로 접속하여 수정되는 것을 방지하기 위한 보안 때문에 외부접근이 금지되어 있기 때문에</p>
<h2 id="📌-pomxml--maven에서-참조하는-설정파일">📌 pom.xml : maven에서 참조하는 설정파일</h2>
<p>maven은 빌드와 관련된 정보를 프로젝트 객체모델(Project Object Model)이라는 이름으로 정의하고 사용하는데
pom이라는 이름으로된 pom.xml 파일을 사용한다.</p>
<p>*maven의 로컬저장소
C:\Users\사용자계정.m2\repository</p>
<p>pom.xml에서 dependency 태그를 추가하고 설정하고싶은 라이브러리를 추가하면 된다. 라이브러리는 maven repository에서 원하는 라이브러리를 검색하여 내용을 복사하여 추가해주면 maven이 알아서 jar파일을 로컬저장소에 다운받아준다.</p>
<p>📌 <a href="https://mvnrepository.com/">https://mvnrepository.com/</a>
-&gt; 여기서 기존의 웹프로젝트의 경우 프로젝트에 필요한 모든 라이브러리 파일을 직접 다운받아 적용시켜야했던 반면,
    denpendency태그를 적용시켜주면 알아서 다운받고 해당 프로젝트에 적용하여 스프링의 장점을 알 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[URI(Uniform Resource Identifier)]]></title>
            <link>https://velog.io/@m_seo/URIUniform-Resource-Identifier</link>
            <guid>https://velog.io/@m_seo/URIUniform-Resource-Identifier</guid>
            <pubDate>Thu, 28 Jul 2022 08:31:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h4 id="uri는-로케이터locator-이름name-또는-둘-다-추가로-분류될-수-있다">&quot;URI는 로케이터(locator), 이름(name) 또는 둘 다 추가로 분류될 수 있다&quot;</h4>
</blockquote>
<p><img src="https://velog.velcdn.com/images/m_seo/post/5678f7e4-e278-4d8b-ba5a-961077320d87/image.PNG" alt=""></p>
<ul>
<li><p><strong>URI</strong> : 소스를 식별하는 통합방법</p>
</li>
<li><p><strong>URL</strong> : 가장 큰 개념으로, 리소스에 이 위치에 있다</p>
<pre><code>      *(EX. 주민번호처럼 식별)</code></pre></li>
<li><p><strong>URN</strong> : 리소스 이름</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/6c1fe706-a2a6-441c-99ee-d8d6929ca295/image.PNG" alt=""></p>
<h2 id="📌uri">📌URI</h2>
<ul>
<li><strong>U</strong>niform : 리소스 식별하는 통일된 방식</li>
<li><strong>R</strong>esource : 자원, URI로 식별할 수 있는 모든 것(제한 없음)</li>
<li><strong>I</strong>dentifier : 다른 항목과 구분하는데 필요한 정보</li>
</ul>
<h2 id="📌url--uniform-resource-locator">📌URL : Uniform Resource Locator</h2>
<ul>
<li><strong>L</strong>ocator : 리소스가 있는 위치를 지정</li>
</ul>
<h2 id="📌urn--uniform-resource-name">📌URN : Uniform Resource Name</h2>
<ul>
<li><strong>N</strong>ame : 리소스에 이름을 부여</li>
</ul>
<blockquote>
<p>위치는 변할 수 있지만, 이름은 변하지 않는다.</p>
</blockquote>
<h2 id="📌url-문법">📌URL 문법</h2>
<p>• scheme://[userinfo@]host[:port][/path][?query][#fragment]
• <a href="https://www.google.com:443/search?q=hello&amp;hl=ko">https://www.google.com:443/search?q=hello&amp;hl=ko</a></p>
<p>• 프로토콜(https)
• 호스트명(<a href="http://www.google.com">www.google.com</a>)
• 포트 번호(443)
• 패스(/search)
• 쿼리 파라미터(q=hello&amp;hl=ko)</p>
<h3 id="scheme">&gt; scheme</h3>
<ul>
<li>주로 프로토콜 사용
-&gt; 프로토콜 : 어떤 방식으로 자원에 접근할 것인가 하는 약속 규친<pre><code>         *(EX. http, https,ftp 등등)</code></pre></li>
<li>http는 80포트, https는 443포트를 주로 사용하며, 포트는 생략 가능하다.</li>
<li>https는 http에 보안 추가(HTTP Secure)</li>
</ul>
<h3 id="userinfo">&gt; userinfo</h3>
<ul>
<li>URL에 사용자 정보를 포함해서 인증한다.</li>
<li>거의 사용하지 않는다.</li>
</ul>
<h3 id="host">&gt; host</h3>
<ul>
<li>호스트명</li>
<li>도메인명 또는 IP주소를 직접 사용가능</li>
</ul>
<h3 id="port">&gt; port</h3>
<ul>
<li>포트(PORT)</li>
<li>접속 포트</li>
<li>일반적으로 생략, 생략시 http는 80포트 / https는 443포트</li>
</ul>
<h3 id="path">&gt; path</h3>
<ul>
<li>리소스 경로(path), 계층적 구조</li>
<li>EX.<ul>
<li>/home/file1.jpg</li>
<li>/members</li>
<li>/members/100, /items/iphone12</li>
</ul>
</li>
</ul>
<h3 id="query">&gt; query</h3>
<ul>
<li>key=value 형태</li>
<li>?로 시작, &amp;로 추가 기능 ?keyA=valueA&amp;keyB=valueB</li>
<li>query parameter, query string 등으로 불림, 웹서버에 제공하는 파라미터, 문자 형태</li>
<li>숫자를 쳐도, 문자로 넘어간다.</li>
</ul>
<h3 id="fragment">&gt; fragment</h3>
<ul>
<li>html 내부 북마크 등에 사용</li>
<li>서버에 전송하는 정보 아님</li>
</ul>
<h2 id="📌-웹-브라우저-요청-흐름">📌 웹 브라우저 요청 흐름</h2>
<p><img src="https://velog.velcdn.com/images/m_seo/post/e9f5b7f3-4c6b-40e8-a06d-5b6683022292/image.PNG" alt=""></p>
<blockquote>
<ol>
<li>DNS 서버를 조회한다.</li>
<li>IP, 포트 정보를 찾아낸다.</li>
<li>HTTP 요청 메세지 생성</li>
<li>HTTP 요청 메세지 전송</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/m_seo/post/7eab2f9b-c4f6-488b-a01c-ca4564c05637/image.PNG" alt=""></p>
<p><img src="https://velog.velcdn.com/images/m_seo/post/77e7551e-e3e4-4ea0-9b17-ab9240b83f56/image.PNG" alt=""></p>
<ul>
<li><p>구글 서버가 메세지를 받으면, TCP/IP는 버리고 HTTP를 본다.
구글 서버는 검색 엔진을 통해 찾는다.
웹 서버에서 HTTP 응답 메시지를 만들어서 
응답 패킷을 웹브라우저한테 보낸다.
웹 브라우저가 패킷을 까서 우리가 쓰는 화면에서 볼 수 있다.</p>
<hr>
</li>
</ul>
<h6 id="모든-개발자를-위한-http-웹-기본-지식---김영한-님의-강의를-참고하였습니다">#모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 님의 강의를 참고하였습니다.</h6>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터넷 네트워크]]></title>
            <link>https://velog.io/@m_seo/%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@m_seo/%EC%9D%B8%ED%84%B0%EB%84%B7-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Mon, 25 Jul 2022 00:51:38 GMT</pubDate>
            <description><![CDATA[<h2 id="📌인터넷-통신">📌인터넷 통신</h2>
<p><img src="https://velog.velcdn.com/images/m_seo/post/bcd0fa20-6d4a-4b1e-a31b-3a9db14ab0cc/image.PNG" alt=""></p>
<p>클라이언트와 서버가 멀리 있을경우, 인터넷 망을 통해 메시지를 보낸다.
하지만, 노드를 통한 여러 과정들이 있다. 그럼 어떻게 안전하게 도착할까?</p>
<p><img src="https://velog.velcdn.com/images/m_seo/post/f70eff28-4078-4a26-b879-08e2fe357708/image.PNG" alt=""></p>
<p>바로, IP(인터넷 프로토콜) 이다.</p>
<h2 id="📌ip인터넷-프로토콜의-역할"><strong>📌IP(인터넷 프로토콜)의 역할</strong></h2>
<ol>
<li>지정한 IP주소(IP Address)에 데이터 전달</li>
<li>패킷(Packet)이라는 통신 단위로 데이터 전달</li>
</ol>
<p><img src="https://velog.velcdn.com/images/m_seo/post/a5f94a0b-8839-4904-bfcb-4b5b39d5ab04/image.PNG" alt=""></p>
<p>IP 패킷 정보(규칙)은 출발지IP, 목적지IP, 기타(메시지등)을 넣고 전송한다.
노드들끼리 전송하면서 맞는 IP주소에 도달한다.</p>
<p><img src="https://velog.velcdn.com/images/m_seo/post/71f61237-e0b7-410d-8c35-8f998640ed0f/image.PNG" alt=""></p>
<p>또한, 메시지를 받은 서버도
출발IP, 목적IP, 기타(메시지등)을 넣고 다시 전송하여 클라이언트에게 도달한다.</p>
<h3 id="하지만-ip-프로토콜의-한계는-있다"><strong>하지만, IP 프로토콜의 한계는 있다.</strong></h3>
<p><img src="https://velog.velcdn.com/images/m_seo/post/6d275687-5370-4405-848d-b24cb5acff4a/image.PNG" alt=""></p>
<blockquote>
<p>1) 비연결성</p>
</blockquote>
<ul>
<li>패킷을 받을 대상이 없거나, 서비스 불능 상태여도 패킷 전송
EX) 상대의 컴퓨터가 꺼져 있거나, 주소 없이 편지를 전송하는 것.</li>
</ul>
<blockquote>
<p>2) 비신뢰성</p>
</blockquote>
<ul>
<li>중간에 패킷이 사라지면?</li>
<li>패킷이 순서대로 안오면?</li>
<li>하나의 PC에서 여러가지(인터넷, 음악 등) 같은 IP로 
여러 행위를 작동할 때 어떻게 구분할지?
EX) 우편이 잘 갔는지, 안갔는지 / 받을 수 있는 상태인지 아닌지를 모름.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/f750079d-5575-4be0-bd78-3300ba011c8e/image.PNG" alt=""></p>
<blockquote>
<p>3) 패킷 소실</p>
</blockquote>
<ul>
<li>중간에 서버가 문제가 생겨 보낸 데이터 소실.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/d10b5706-9293-4d73-bf1e-1db6b90c10c4/image.PNG" alt=""></p>
<blockquote>
<p>4) 패킷 전달 순서 문제 발생</p>
</blockquote>
<p>EX) 용량이 클 때</p>
<ul>
<li>패킷 전달이 순차적으로 1번, 2번 데이터를 전송하였지만,
노드들끼리 전송하면서 순서가 잘 못 전달 될 수 있음.</li>
</ul>
<h2 id="📌-이러한-ip의-단점을-해결해주는-tcp">📌 이러한 IP의 단점을 해결해주는 TCP.</h2>
<p>TCP는 인터넷 프로토콜 스택의 4계층 중, 전송 계층에 해당한다.</p>
<p><img src="https://velog.velcdn.com/images/m_seo/post/e5ebf687-7e69-4fb8-9fcb-ddd8c28eed6c/image.PNG" alt=""></p>
<p>*
2번째 단계에서, OS계층으로 전달한다. OS계층의 TCP가 메시지에 TCP 정보를 생성, 메시지 데이터를 포함한다. 전달 후에, IP를 씌어 IP 패킷을 생성한다,
결론적으로는 IP, TCP, 메시지로 생성된다.</p>
<p><img src="https://velog.velcdn.com/images/m_seo/post/5e27f162-86ea-4a1d-b104-7c5991ce47a6/image.PNG" alt=""></p>
<ul>
<li><p>IP박스 안에 TCP 세그먼트가 있다.
출발지 PORT, 목적지 PORT, 전송 제어, 순서, 검증정보 등등..
IP로만 해결안됬던걸 해결 할 수 있다.</p>
</li>
<li><p>TCP는 현재 시장의 90% 가까운 점유율을 가지고 있다.</p>
</li>
</ul>
<h2 id="📌tcp의-특징---전송-제어-프로토콜transmission-control-protocol"><strong>📌TCP의 특징 - 전송 제어 프로토콜(Transmission Control Protocol)</strong></h2>
<p><img src="https://velog.velcdn.com/images/m_seo/post/1c7be6ce-d430-4a68-8d7b-c2da77f8eb7c/image.PNG" alt=""></p>
<p>SYN : 접속 요청 / ACK : 요청 수락</p>
<blockquote>
<p>1) 연결지향 - TCP 3 way handshake(가상 연결)</p>
</blockquote>
<ul>
<li>연결이 되었는지 안되었는지 확인 후에 메시지를 전송한다.</li>
</ul>
<p>TCP 3 way handshake</p>
<p>1) 클라이언트 -&gt; 서버 : 메시지 전송
2) 서버 -&gt; 클라이언트 : 클라이언트 메시지 확인 메시지 전송
3) 클라이언트 -&gt; 서버 : 서버가 보낸걸 확인 메시지 보냄
따라서, 클라이언트와 서버 모두 확인하며 신뢰 할 수 있다.
4) 데이터 전송</p>
<p>하지만, 가상연결로써, 
논리적으로만 연결된거지 물리적으로 연결된건 모른다.</p>
<p><img src="https://velog.velcdn.com/images/m_seo/post/08a7c970-504b-4504-8a76-a06f75e8612a/image.PNG" alt=""></p>
<blockquote>
<p>2) 데이터 전달 보증</p>
</blockquote>
<ul>
<li>데이터가 전달되지 않았을때 알 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/c08d38e1-b1f2-43fd-a448-83556f2cfec4/image.PNG" alt=""></p>
<blockquote>
<p>3) 순서 보장</p>
</blockquote>
<p>따라서, 신뢰할 수 있는 프로토콜로 현재는 대부분 TCP를 사용한다.</p>
<h2 id="📌udp-특징---사용자-데이터그램-프로토콜user-datagram-protocol">📌UDP 특징 - 사용자 데이터그램 프로토콜(User Datagram Protocol)</h2>
<p>1) 하얀 도화지에 비유(기능이 거의 없음)
2) 연결지향 - TCP 3 way handshake X
3) 데이터 전달 보증 X
4) 순서 보증 X
5) 데이터 전달 및 순서가 보장되지 않지만, 단순하고 빠름.</p>
<p>즉, IP 프로토콜과 거의 비슷하다. +PORT +체크섬 정도</p>
<h2 id="📌port">📌PORT</h2>
<p><img src="https://velog.velcdn.com/images/m_seo/post/990eaf42-1557-4e85-ae56-953f9d2ae1f2/image.PNG" alt=""></p>
<ul>
<li>같은 IP 내에서 프로세스를 구분하는 것으로, 하나의 컴퓨터로 
여러 동작을 하고 있을 때, 어떤 패킷인지 구분하는 것.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/1c030a0c-9ffc-4002-b404-df8201f503d4/image.PNG" alt=""></p>
<ul>
<li><p>패킷을 전달할때
출발지 IP, PORT
목적지 IP, PORT
모두 보내기 때문에 확인 가능하다.
EX) IP는 아파트, PORT는 몇동, 몇호로 생각하면 쉽다.
  한 아파트 안에서 사람들이 어디서 사는지 알려준다.</p>
</li>
<li><p><strong>PORT 번호</strong>
0 ~ 65535 : 할당 가능
0 ~ 1023 : 잘 알려진 포트, 사용하지 않는 것이 좋다
FTP - 20, 21
TELNET - 23
HTTP - 80
HTTPS - 443</p>
</li>
<li><p>마지막으로, DNS 이다.
IP는 기억하기 어려울뿐만 아니라, 변경 될 수 있다.</p>
</li>
</ul>
<h2 id="📌dns---도메인-네임-시스템domain-name-system"><strong>📌DNS - 도메인 네임 시스템(Domain Name System)</strong></h2>
<ul>
<li>도메인 명을 IP 주소로 변환한다.
EX) 전화번호부</li>
</ul>
<p><img src="https://velog.velcdn.com/images/m_seo/post/86bc5b66-f3aa-45dd-acd8-dcb178c29fdc/image.PNG" alt=""></p>
<ul>
<li>DNS 서버에 도메인을 등록한다.
클라이언트가 도메인 명으로 요청하면, DNS 서버가 IP를 알려준다.</li>
</ul>
<hr>
<blockquote>
<p>정리</p>
</blockquote>
<p>엄청 복잡한 인터넷 망을 메시지를 보내기 위해서 제일 먼저,
인터넷 프로토콜이라는 IP가 있어야 한다. 보통 IP 프로토콜이라고 한다.
하지만, IP프로토콜만 가지고는 메시지가 잘 전송됬는지 확인하기 어렵고,
포트라는 개념도 없고, 메시지 순서도 없다.
이 문제를 TCP 프로토콜이 해결해준다.
UDP 프로토콜은 IP 프로토콜과 비슷하지만, 포트가 추가된다.
필요하면, UDP프로토콜에 애플리케이션 기능을 확장 할 수 있다.
PORT는 같은 IP 안에서 동작하는 통신할 애플리케이션을 구분하기 위해서 사용한다. 쉽게 IP는 아파트, PORT는 몇동/몇호 로 생각하면 쉽다.
DNS는 IP는 변하기 쉽고 외우기 어려운데,
도메인명을 등록해서 사용 할 수 있도록 하는것이다.</p>
<hr>
<h6 id="모든-개발자를-위한-http-웹-기본-지식---김영한-님의-강의를-참고하였습니다">#모든 개발자를 위한 HTTP 웹 기본 지식 - 김영한 님의 강의를 참고하였습니다.</h6>
]]></description>
        </item>
    </channel>
</rss>