<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hyunjae</title>
        <link>https://velog.io/</link>
        <description>There is such a world to see! Working at @KAIST</description>
        <lastBuildDate>Mon, 07 Sep 2020 06:29:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hyunjae</title>
            <url>https://images.velog.io/profiles/hyunjae-lee/thumbnails/1573444198.257.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hyunjae. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hyunjae-lee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Programmers - 순열 검사 풀이]]></title>
            <link>https://velog.io/@hyunjae-lee/Programmers-%EC%88%9C%EC%97%B4-%EA%B2%80%EC%82%AC-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@hyunjae-lee/Programmers-%EC%88%9C%EC%97%B4-%EA%B2%80%EC%82%AC-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Mon, 07 Sep 2020 06:29:34 GMT</pubDate>
            <description><![CDATA[<h3 id="1-문제-설명">1. 문제 설명</h3>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/a1fa0c23-e74b-47a4-b418-f757e7e5d0db/image.png" alt=""></p>
<h3 id="2-해결-방법">2. 해결 방법</h3>
<p>아주 간단한 문제이지만, C++ STL 에서 Vector 내의 중복된 원소 제거 및 정렬을 복습 및 정리할 겸 포스팅한다. 간단하게 unique, erase, sort 정도만 알아두면 복잡한 문제가 아주 간단하게 풀릴때도 있다.</p>
<h3 id="3-결과-코드">3. 결과 코드</h3>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/fb57f03d-50a5-4bf5-a260-32d56ba2a8b5/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Tomcat - (2) 구조]]></title>
            <link>https://velog.io/@hyunjae-lee/Tomcat-2-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@hyunjae-lee/Tomcat-2-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Sun, 30 Aug 2020 12:42:33 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이번 장에서는 Tomcat의 구조에 대해 살펴보겠습니다. 새로운 용어들이 많아서 낯설 수도 있습니다. 차근차근 알아가보겠습니다.</p>
</blockquote>
<hr>
<h3 id="tomcat-구성">Tomcat 구성</h3>
<p>Tomcat을 구성하는 큰 단위로는 다음의 3가지가 있습니다.</p>
<blockquote>
<p><strong>• Coyote (HTTP Component)</strong> : Tomcat에 TCP를 통한 프로토콜 지원
<strong>• Catalina (Servlet Container)</strong> : Java Servlet을 호스팅하는 환경
<strong>• Jasper (JSP Engine)</strong> : 실제 JSP 페이지의 요청을 처리하는 Servlet</p>
</blockquote>
<p>3가지의 구성요소는 다음과 같이 동작합니다.</p>
<ol>
<li>HTTP 요청을 Coyote에서 받아서 Catalina로 전달합니다. </li>
<li>그러면 Catalina (Servlet Container)에서 전달받은 HTTP 요청을 처리할 웹 어플리케이션 (Context)를 찾고, WEB-INF/web.xml 파일 내용을 참조하여 요청을 전달합니다.</li>
<li>요청된 Servlet을 통해 생성된 jsp 파일들이 호출될 때, Jasper (JSP Engine)이 Validation Check / Compile 등을 수행합니다.</li>
</ol>
<p>위의 3가지 구성요소는 다음의 5단계 구조에 포함됩니다. 더 자세한 내용은 아래 <code>Tomcat 구조</code>를 통해 살펴보도록 하겠습니다. </p>
<hr>
<h3 id="tomcat-구조">Tomcat 구조</h3>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/38096013-50e4-40d3-91ac-4f3aea4b399b/image.png" alt="Tomcat Architecture 1"></p>
<p><strong>Tomcat</strong> 은 Java로 작성된 Program이기 때문에 JVM (Java Virtual Machine) 위에서 동작합니다. <strong>하나의 JVM</strong> 에서 <strong>하나의 Tomcat Instance (Server)가 하나의 Process</strong> 로써 동작합니다. </p>
<p><strong>하나의 Server</strong> 에는 <strong>여러 개의 Service</strong> 가 존재할 수 있습니다. 각각의 <strong>Service는 1</strong>개의 <strong>1개의 Engine</strong> 과 <strong>여러 개의 Connector</strong> 로 구성됩니다.</p>
<p><strong>Engine</strong> 은 Catalina Servlet Engine이라고도 불리며, 정의된 Connector로 들어온 요청을 하위에 있는 해당 Host에게 전달해주는 역할을 수행합니다. </p>
<p><strong>하나의 Engine</strong> 에는 <strong>여러 개의 Host</strong> 가 존재할 수 있습니다. Host는 가상호스트 이름을 나타내며, 호스트 이름이 곧 url에 매핑됩니다. (ex : <a href="http://hostname/">http://hostname/</a> ). </p>
<p><strong>하나의 Host</strong> 에는 <strong>여러 개의 Context</strong> 가 존재할 수 있습 니다. Context는 하나의 Web Application을 나타내며 주로 *.war 파일의 형태로 배포가 됩니다.</p>
<p><code>Tomcat Server가 요청을 받으면, Catalina (Tomcat Engine)가 요청에 맞는 Context (Context path)를 찾고, Context는 자신이 설정된 어플리케이션의 deployment descriptor file (web.xml)을 기반으로 전달받은 요청을 서블릿에게 전달하여 처리되도록 합니다.</code></p>
<blockquote>
<p>즉, 클라이언트 HTTP request &gt; Catalina &gt; Context &gt; Servlet &gt; 클라이언트 response 순으로 처리됩니다.</p>
</blockquote>
<p>아래는 Tomcat의 5-tier architecture를 나타낸 그림입니다. 각 tier마다 설정해야 할 parameter들과 설명들 도 일부 작성하였습니다. (설정을 한다는 것은, CATALINA HOME/conf/server.xml에서 값을 수정하는 것을 뜻합니다.)</p>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/d93fc950-28ae-42d9-9e7a-4aea7731a2f8/image.png" alt=""></p>
<hr>
<h3 id="tomcat-connector">Tomcat Connector</h3>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/65b66273-66b2-46f9-92f0-45ab66d8b5d8/image.png" alt="Tomcat Connector"></p>
<p><strong>Connector</strong> 는 TCP port에서 request들을 listen하여 해당 Engine으로 보내주는 역할을 수행하며 3가지의 종류가 있습니다.</p>
<blockquote>
<p><strong>• HTTP/1.1 과 HTTP/2 Connector</strong> 는 Tomcat이 standalone web server로 동작하거나 다른 web server의 요청을 받아 WAS의 역할을 수행하도록 지원해줍니다. 
<strong>• AJP Connector</strong> 는 Apache HTTP Web server의 요청을 처리하기 위한 특수한 Protocol을 처리합니다.</p>
</blockquote>
<p>Connector마다 동작하는 방식을 설정할 수 있습니다. 동작하는 방식으로는 <code>BIO, NIO, NIO2, APR</code> 로 총 4 종류가 있습니다. (Tomcat 버전별로 지원하는 동작방식이 상이합니다.)</p>
<blockquote>
<p><strong>• BIO</strong>  : Tomcat 7의 기본방식이며, 하나의 thread가 하나의 connection을 담당하는 것입니다. 레스토랑으로 생각해보자면, 한명의 종업원이 하나의 손님 그룹 (하나의 테이블)을 전담하는 것으로 비유 할 수 있습니다.
maxConnections = maxThreads = 200 이라는 기본 값으로 설정됩니다.</p>
</blockquote>
<blockquote>
<p><strong>• NIO</strong> : Tomcat 8.5 부터의 기본방식이며, 하나의 thread가 하나 이상의 connection을 담당하는 것입니다. 레스트랑으로 생각해보자면, 한명의 종업원이 여러 손님 그룹을 위해 주문을 받거나 서빙하는 등의 업무를 수행하는 것으로 비유할 수 있습니다.
maxConnections는 default가 10,000 이고, maxThreads는 default가 200입니다.</p>
</blockquote>
<blockquote>
<p><strong>• APR</strong> : Apache Portable Protocol 이라는 특수한 Protocol입니다.
maxConnections는 default가 8,192 입니다. <a href="https://github.com/apache/tomcat/blob/master/TOMCAT-NEXT.txt">https://github.com/apache/tomcat/blob/master/TOMCAT-NEXT.txt</a> 을 보면, 10.x 버전부터는 APR 방식이 삭제된다고 합니다.</p>
</blockquote>
<p>사용할 Protocol을 지원하는 Connector를 선정하고 그 후 해당 Connector의 동작방식을 선택하고 나면 반드시 고려해야 할 parameter 들은 다음과 같습니다. (위에서 일부 언급된 내용입니다)</p>
<blockquote>
<p><strong>• maxThreads</strong> : Connector가 생성할 수 있는 최대 Thread 수 (Active user 수를 의미합니다) (default = 200), Connector를 Executor (Shared Thread Pool)로 설정했다면 값이 무시됨.
<strong>• maxConnections</strong> : 동시 처리 가능한 최대 Connection 수 (현재 사용중인 fd의 수) (default) BIO는 maxThreads 값과 동일, NIO = 10,000, ARP = 8,192
<strong>• maxSpareThreads</strong> : 최소로 실행을 유지할 thread 수 (default = 10)
<strong>• acceptCount</strong> : 모든 thread가 사용 중일때, queue에 저장 가능한 최대 request 수 (backlog를 의미합니 다)
(default = 100)</p>
</blockquote>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/4b1ccbcc-b147-455e-95e4-6fdc2937edff/image.png" alt=""></p>
<p>각 Connector로 들어온 요청은 Thread pool에서 <strong>할당된 thread</strong> 가 담당합니다. 배정된 thread는 context path로 찾은 해당 web.xml에게 서블릿 작업 처리요청을 하고 다시 응답받을 때까지 대기합니다. 서블릿 응답을 받은 thread는 다시 돌아와 클라이언트에게 response를 전달하고 다시 Thread pool에 반환됩니다.</p>
<p><strong>Thread Pool</strong> 은 Dedicated Thread Pool과 Shared Thread Pool가 있습니다. Dedicated Thread Pool은 Connector마다 개별적인 Thread Pool을 가지는 것이고, Shared Thread Pool은 Engine에 할당된 여러 개의 Connector가 공유하는 Thread Pool을 뜻합니다. 실제 운영환경에서는 Dedicated Thread Pool을 주로 사용합 니다.</p>
<hr>
<p>다음 장에서는 Tomcat의 설정파일들과 JDBC에 대해 알아보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Tomcat - (1) 소개]]></title>
            <link>https://velog.io/@hyunjae-lee/tomcat1</link>
            <guid>https://velog.io/@hyunjae-lee/tomcat1</guid>
            <pubDate>Sat, 27 Jun 2020 07:18:27 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이번 장에서는 Web Application Server (WAS)의 대표적인 Open Source Software인 &#39;Tomcat&#39;에 대해 알아보겠습니다.</p>
</blockquote>
<hr>
<h3 id="tomcat-이란">Tomcat 이란?</h3>
<p>Apache 재단에서 만든, Java Servlet을 지원하기 위한 <a href="http://tomcat.apache.org/">Open Source 프로젝트</a>입니다. Tomcat은 Java를 이용한 웹 애플리케이션의 다양한 규격 (Spec)을 준수하여 JSP, HTML 파일들로 구성된 <code>.war</code> 파일을 배포해주는 엔진입니다. </p>
<p><strong>Spec?</strong> 
여러 사람들이 함께 개발하고 사용하기 위한 일련의 규칙이라고 이해하였습니다. Servlet, WebSocket 등 각각에 대해 약속을 정하고 이를 준수하여 개발 및 이용하도록 합니다. 무엇에 대해 규칙을 정해야하고, 왜 그것들이 필요한가? 에 대해서는 추후에 정리하도록 하겠습니다.</p>
<p><strong>JSP, HTML 파일들로 구성된 .war 파일?</strong> 
 간단히 말해, 하나의 폴더를 제가 구성하고 싶은 웹 어플리케이션이라고 한다면, 그 폴더를 구성하는 다양한 하위 폴더들, 다양한 파일들을 압축해놓은 하나의 압축 파일입니다. </p>
<p>Tomcat의 경우, 혹은 다른 Java WAS (Web Application server)의 대부분의 경우도, &#39;.war&#39; 파일을 업로드 및 업데이트하여 실제 웹사이트에 배포하는 경우가 일반적입니다. 여기서는 &#39;.war&#39; 파일을 하나의 웹 애플리케이션을 구성하기 위한 모든 파일 및 폴더를 압축하였다고 이해하시면 됩니다.</p>
<blockquote>
<p>Tomcat은 어떤 버전들이 있는지 살펴보겠습니다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/b06f6e9e-5223-4c2c-b11a-1d4db174e854/Tomcatversion.png" alt=""></p>
<p>현재 사용되는 Tomcat 버전으로는, <strong>7.0 / 8.5 / 9.0</strong> 이 있습니다. 10 버전은 알파버전으로 개발 중이라 합니다. 세 개의 버전의 차이는 크게 다음과 같습니다.</p>
<p><strong>7.0</strong> : connector가 채택할 protocol로써 BIO / NIO / ARP 지원</p>
<p><strong>8.5 &amp; 9.0</strong> : connector가 채택할 protocol로써 NIO / NIO2 / ARP 지원, HTTP/2 지원</p>
<p>connector가 무엇인지, BIO / NIO / ARP / NIO2는 무엇인지, HTTP/2는 무엇인지에 대해서도 추후에 알아보겠습니다. (Network 카테고리에서 정리하려 합니다)</p>
<p><strong>Tomcat은 Java로 구성한 웹 애플리케이션을 실행시켜주는 소프트웨어</strong>이며 여러 개의 버전이 있다는 정도로만 이해가 되셨으면 충분합니다. </p>
<p>다음으로 Tomcat의 구성요소에 대해 알아보기 전에, 자신의 OS에 맞는 바이너리 파일을 <a href="https://tomcat.apache.org/download-90.cgi">다운로드</a>하여주시길 바랍니다. </p>
<p>(Windows의 경우, Tomcat의 실행이 Window Service 단위라고 합니다. 저는 OS X 유저라서, Linux를 기반으로 한 바이너리 파일을 기준으로 설명을 드리도록 하겠습니다~!)</p>
<hr>
<h3 id="tomcat-폴더구성">Tomcat 폴더구성</h3>
<blockquote>
<p>바이너리 파일을 다운로드하였으면 아래와 같은 폴더 구성을 확인하실 수 있습니다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/159deb1b-fd2a-492e-9122-2d9521a20534/tomcat-layout.png" alt=""></p>
<p>주요 폴더에 대한 설명은 다음과 같습니다.</p>
<blockquote>
<p><strong>bin</strong> : 실행/종료등을 위한 스크립트 파일들이 있습니다. 
<strong>conf</strong> : Tomcat이 기동되는 서버에 대한 설정부터, 유저 설정 (관리자), 기본적인 web.xml &amp; context.xml 등 전역적인 설정을 다룹니다. 
<strong>lib</strong> : 전역적으로 사용되는 라이브러리들이 있습니다. 
<strong>logs</strong> : 로그 파일들이 생성되어 담기는 폴더입니다.
<strong>webapps</strong> : Tomcat에 배치시킬 다수 개의 웹 애플리케이션들이 주로 &#39;.war&#39;파일로 위치하는 곳입니다.
<strong>RUNNING.txt</strong> : Tomcat 바이너리 파일을 실행하는 방법에 대한 간단한 설명서입니다. </p>
</blockquote>
<p>폴더 구성이 많아보일수도 있고, 각각이 왜 필요한지가 궁금한 것이 당연합니다. 실제로 Tomcat을 실행해보고, Tomcat의 전반적인 Architecture에 대해 다음 글에서 살펴보면서 이해해보도록 하겠습니다~!</p>
<p>위의 폴더 구성 설명에서, &#39;전역적인&#39; 이라는 뜻은 &#39;여러 개의&#39; 웹 어플리케이션들이 &#39;하나의&#39; Tomcat 서버에 구성될 수 있기 때문에 이들이 공용으로 사용한다는 뜻입니다. </p>
<hr>
<h3 id="tomcat-실행">Tomcat 실행</h3>
<p>Tomcat은 bin 폴더 아래의 startup.sh (Linux 계열 기준)을 실행하여 기동됩니다. Tomcat은 Java 프로그램이기 때문에, <strong>당연히 최소한 JRE (Java Runtime Environment)가 설치되어 있어야 합니다.</strong></p>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/d66ad2d8-0963-4d7e-a81a-5a5a630f717f/tomcat-execute1.png" alt=""></p>
<pre><code>./startup.sh
./shutdown.sh</code></pre><p>Tomcat 실행 및 종료는 위와 같은 명령어를 통해 할 수 있습니다. </p>
<p>실행 후의 로그에서, CATALINA_BASE 와 같은 다양한 환경변수와 그 값들을 확인할 수 있습니다. 주요 환경변수들은 다음과 같습니다.</p>
<blockquote>
<p><strong>CATALINA_BASE</strong> :  (optional) 처음에는 CATALINA_HOME과 동일합니다. 하지만, clustering 등과 같이 여러 개의 Tomcat instance를 사용한다면 각각의 BASE를 설정해야 합니다.
<strong>CATALINA_HOME</strong> : Tomcat이 설치된 폴더 주소입니다.
<strong>JRE_HOME</strong> : Java 프로그램인 Tomcat을 실행하기 위해서는 당연히 JVM을 포함한 JRE가 최소한으로 필요합니다. 이를 가리키는 경로입니다.
<strong>CLASSPATH</strong> : class path란, JVM이 Java 프로그램을 실행하는데 필요한 class 파일들의 위치를 나타냅니다. 
Tomcat이 class path를 이용하여 class 들을 JVM에 로딩하고 사용하는 방법이 WAS라는 카테고리를 고려하여, 일반적인 Java Program의 경우와 다릅니다. 이는 Tomcat의 class loading에서 살펴보겠습니다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/hyunjae-lee/post/b1e75ed3-0ef4-482f-bff5-de5e2ca4cc7d/tomcat-execute2.png" alt="Tomcat 실행 후, 프로세스 확인 =&gt; PID 99869인 하나의 Java Program이 실행중"></p>
<p>Tomcat 실행 후, 프로세스 PID가 99869인 하나의 Java Program이 실행중인 것을 확인하실 수 있습니다.</p>
<p>다음 장에서는 Tomcat의 전반적인 Architecture와 구성요소들에 대해 알아보겠습니다.</p>
]]></description>
        </item>
    </channel>
</rss>