<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Hanxbeen.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 08 Jun 2021 20:42:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Hanxbeen.log</title>
            <url>https://images.velog.io/images/han_been/profile/f9bb2291-79fc-4121-8ee2-7b61dad19730/photo.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Hanxbeen.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/han_been" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Javascript - 두 개 뽑아서 더하기]]></title>
            <link>https://velog.io/@han_been/Javascript-%EB%91%90-%EA%B0%9C-%EB%BD%91%EC%95%84%EC%84%9C-%EB%8D%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@han_been/Javascript-%EB%91%90-%EA%B0%9C-%EB%BD%91%EC%95%84%EC%84%9C-%EB%8D%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 08 Jun 2021 20:42:22 GMT</pubDate>
            <description><![CDATA[<p>자바스크립트로 코딩테스트를 준비하고하있다.</p>
<p>프로그래머스에서 기초부터 풀어보았다.</p>
<h1 id="문제">문제</h1>
<ul>
<li><a href="https://programmers.co.kr/learn/courses/30/lessons/68644">프로그래머스 &#39;두개 뽑아서 더하기&#39;</a></li>
</ul>
<p><img src="https://images.velog.io/images/han_been/post/b7740c50-10c3-49de-9f11-318a13cb5819/image.png" alt=""></p>
<h1 id="풀이-1">풀이 1</h1>
<blockquote>
<p>다음 solution.js 에서는 Set 객체의 특성을 이용해 데이터의 중복을 제거했습니다.</p>
</blockquote>
<ul>
<li><strong>const set = new Set(calculator);</strong>
중복값이 있는 calculator 배열을 Set객체로 만들어서 중복을 제거한다.</li>
<li><strong>const uniqueArr = [...set];</strong>
전개연산자를 사용해 Set객체를 다시 배열로 변환했습니다.
전개연산자 대신 Array.from() 또는 forEach() 문을 사용해도 됩니다.</li>
</ul>
<pre><code>function solution(numbers) {
    var answer = [];
    answer = numbers; 
    var calculator = [];
    var idx = 0;

    while(idx != answer.length){
        for (var i = idx; i &lt; answer.length; i++) {
            if(answer.length == i+1){
                break;
            }
            else {
                calculator.push(answer[idx]+answer[i+1]);
            }
        }             
        idx++; 
    }

    calculator.sort(function(a, b)  {
        if(a &gt; b) return 1;
        if(a === b) return 0;
        if(a &lt; b) return -1;
    });

    const set = new Set(calculator); 
    const uniqueArr = [...set];

    answer = uniqueArr

    return answer;
}</code></pre><h1 id="풀이-2">풀이 2</h1>
<blockquote>
<p>다음 solution.js 에서는 forEach()와 include()를 활용해  데이터의 중복을 제거했습니다.</p>
</blockquote>
<ul>
<li><strong>forEach() 함수</strong>는 주어진 배열을 순회하면서, 배열의 원소들로 주어진 callback함수를 실행</li>
<li><strong>include() 함수</strong>는 주어진 배열에 특정 값이 포함되는지 여부를 검사</li>
</ul>
<pre><code>function solution(numbers) {
    var answer = [];
    answer = numbers; 
    var calculator = [];
    var idx = 0;
    while(idx != answer.length){
        for (var i = idx; i &lt; answer.length; i++) {
            if(answer.length == i+1){
                break;
            }
            else {
                calculator.push(answer[idx]+answer[i+1]);
            }
        }             
        idx++; 
    }
    let uniqueArr = [];
    calculator.forEach((element) =&gt; {
        if(!uniqueArr.includes(element)){
            uniqueArr.push(element)
        }
    })
    uniqueArr.sort(function(a, b)  {
        if(a &gt; b) return 1;
        if(a === b) return 0;
        if(a &lt; b) return -1;
    });
    console.log(uniqueArr)
    answer = uniqueArr
    return answer;
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[부하 테스트]]></title>
            <link>https://velog.io/@han_been/%EB%B6%80%ED%95%98-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
            <guid>https://velog.io/@han_been/%EB%B6%80%ED%95%98-%ED%85%8C%EC%8A%A4%ED%8A%B8</guid>
            <pubDate>Wed, 26 May 2021 00:35:37 GMT</pubDate>
            <description><![CDATA[<h2 id="성능-테스트">성능 테스트</h2>
<p><img src="https://images.velog.io/images/han_been/post/2daded85-9a2f-4ce4-b852-c0a2c5ec2ae8/image.png" alt="">
서비스의 성능을 측정하기위해 시스템을 실제 사용될 것과 같은 환경에서 작동시켜보는 것</p>
<ol>
<li>스파이크 테스트</li>
<li>부하 테스트</li>
<li>스트레스 테스트</li>
<li>내구성 테스트</li>
</ol>
<h3 id="성능-테스트-용어">성능 테스트 용어</h3>
<ul>
<li><p>트랜잭션(Transaction)</p>
<ul>
<li>일정한 업무 단위.</li>
<li>웹 서비스에서는 요청과 응답이 하나의 트랜젝션을 이룸</li>
<li>사용자 수 = 트랜젝션 수???</li>
</ul>
</li>
<li><p>TPS</p>
<ul>
<li>Transaction Per sec</li>
<li>1000TPS = 1초당 1000개의 트랜젝션을 해결</li>
</ul>
</li>
<li><p>응답시간</p>
<ul>
<li>사용자가 요청을 보낸 시점부터 결과가 보여지기까지의 시간</li>
</ul>
</li>
</ul>
<h3 id="성능-테스트의-목적">성능 테스트의 목적</h3>
<ul>
<li><p>응답 처리량 저하, 병목 구간등을 출하 전에 발견하여 조치함</p>
</li>
<li><p>모든 구간에 Log를 걸어 이상 발생시 Log확인</p>
<ul>
<li>nginx(또는 Tomcat), DB로그 확인</li>
<li>소스코드 주요 부분에 Logging 및 확인</li>
<li>서버 별 CPU, MEMORY 추이 확인</li>
<li>또는 상용 모니터링 도구도 활용함 : APM도구 등</li>
</ul>
</li>
</ul>
<h3 id="성능-테스트-도구">성능 테스트 도구</h3>
<ul>
<li><p>nGrinder
: 그루비 언어
<img src="https://images.velog.io/images/han_been/post/44e14503-8c5f-48e9-b1a6-7904fd0c75df/image.png" alt=""></p>
</li>
<li><p>Locust
: 파이썬 언어 기반에서 돌아가는 테스트
<img src="https://images.velog.io/images/han_been/post/6fd86cb9-f6bf-40a6-a4dd-7bc20258affe/image.png" alt=""></p>
</li>
<li><p>LoadRunner
: 최강의 도구라 불린다
<img src="https://images.velog.io/images/han_been/post/951baa23-ea76-4358-9c5d-11df868abdb3/image.png" alt=""></p>
</li>
<li><p>Jmeter
: 오픈소스 도구
<img src="https://images.velog.io/images/han_been/post/40f862e4-1016-407b-9cf2-d3ee46ca2274/image.png" alt=""></p>
</li>
</ul>
<h3 id="성능-테스트-부하는-얼마나">성능 테스트 부하는 얼마나?</h3>
<ul>
<li><p>동시 접속 트랜젝션 예상은 얼마나?</p>
<ul>
<li>합의가 필요한 부분이나, 일반 웹 시스템의 경우 전체 사용자의 5~20% 정도로 잡는다</li>
<li>특수한 경우는 80%까지도 잡는다 &gt;&gt; 수강신청</li>
</ul>
</li>
<li><p>도메인별 예상 사용자 수
<img src="https://images.velog.io/images/han_been/post/8fae5643-84b9-4018-b974-ba7efbfc6015/image.png" alt=""></p>
</li>
</ul>
<h4 id="성능-테스트-사례-1">성능 테스트 사례 (1)</h4>
<ul>
<li>250 유저 내구성 테스트<ul>
<li>전반적으로 그래프가 튀지않고 안정적인 TPS를 유지하는 것을 알 수 있다.
<img src="https://images.velog.io/images/han_been/post/42972e83-9313-4537-a776-f3b9f62d5b7e/image.png" alt="normalcase"></li>
</ul>
</li>
<li>처음에는 안정적이지만, 10초이후에 모듈에 행이 걸렸다가 갑자기 풀리는 현상이 발생한다. 그리고 이후에는 TPS가 전반적으로 낮아짐.
<img src="https://images.velog.io/images/han_been/post/bfe21d79-d37a-4497-9d33-c14c6aa53e10/image.png" alt="badcase"></li>
</ul>
<h3 id="개선-작업">개선 작업</h3>
<p><img src="https://images.velog.io/images/han_been/post/56f5e9fe-51f6-485a-bc44-8e2646f936ff/image.png" alt=""></p>
<ul>
<li>데이터 베이스에서는 정규화와 인덱싱을 추가로 작업 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[실용적으로 문제를 해결하는 개발자 되기]]></title>
            <link>https://velog.io/@han_been/%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8%EB%AC%B8%EC%A0%9C%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@han_been/%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8%EB%AC%B8%EC%A0%9C%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Tue, 16 Mar 2021 03:18:30 GMT</pubDate>
            <description><![CDATA[<p>오늘 SSAFY에서 진행한 멘토 수업이 있었다.</p>
<p><strong>Soojin Ro</strong> 라는 개발자님이셨다.</p>
<p>즐겨 찾는 개발블로그의 주인이셨다..!!</p>
<p>경영학전공을 하셨는데 NEXT를 통해서 개발자의 길을 시작했다고 하신다.</p>
<p>아무튼!</p>
<p>오늘 들은 이야기중에 기억하고 싶은 부분들을 기록해보고자 한다.</p>
<h3 id="주옥같은-멘토-말씀-기록">주옥같은 멘토 말씀 기록</h3>
<ol>
<li><p>경영학 전공자가 개발자가 되기까지 <strong>어떤 공부가 중요</strong>하다고 생각하시나요
 <em>-  &quot;Soojin Ro&quot; : 알고리즘, 자료구조로 기초적인 공부가 가장 베이스라고 생각합니다.</em></p>
</li>
<li><p>무언가를 배우는 가장 좋은 방법은 누군가를 가르치는 것이다.
_    -  &quot;Soojin Ro&quot; : 주니어도 누군가의 멘토가 될 수 있다_</p>
</li>
<li><p>개발자에게 <strong>협업이란</strong>
_    -  &quot;Soojin Ro&quot; : 동료의 성장과 행복에 온 신경을 쏟자, 코드리뷰를 통해 도움이 되지않더라도 서로의 의견을 주고받는 것이 서로에게 신뢰를 주는 일이다_</p>
</li>
<li><p>코드의 <strong>생김새</strong></p>
<ul>
<li>가독성</li>
<li>함수 짧게 만들기</li>
<li>변수 이름 잘 짓기</li>
<li>예외처리 상황 신경쓰기</li>
</ul>
</li>
<li><p><strong>사용자를 위한 코드</strong> 작성</p>
<ul>
<li>사용하기 너무 어려운가?</li>
<li>작동되는 것만 테스트하는 것이 아닌, 내가 사용자라면 문제로 여기지 않을까?</li>
<li>쓸 사람의 입장이 되보자</li>
<li>사이드 프로젝트 진행 : 사용자와 커뮤니케이션이 되는 앱스토어라면 좋을 것 같다.</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[콘솔 사칙연산 _ console.log]]></title>
            <link>https://velog.io/@han_been/%EC%BD%98%EC%86%94-%EC%82%AC%EC%B9%99%EC%97%B0%EC%82%B0-console.log</link>
            <guid>https://velog.io/@han_been/%EC%BD%98%EC%86%94-%EC%82%AC%EC%B9%99%EC%97%B0%EC%82%B0-console.log</guid>
            <pubDate>Wed, 30 Dec 2020 06:12:50 GMT</pubDate>
            <description><![CDATA[<h3 id="1-콘솔에서-사칙연산-코드">1. 콘솔에서 사칙연산 코드</h3>
<p>다음과 같은 코드를 작성해보고, 실제 브라우저 콘솔 창에서 어떤 형태로 출력되는지 알아보자</p>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;Insert title here&lt;/title&gt;

    &lt;script type=&quot;text/javascript&quot;&gt;
        var num1 = 10;
        var num2 = 20;
        var bool = true;

        console.log(&#39;num1++ : &#39; + num1++);    
        console.log(&#39;num1 : &#39; + num1);
        console.log(&#39;--num1 : &#39; + --num1);    
        console.log(&#39;!bool : &#39; + !bool);    

            // 여기까지 일반 프로그래밍 언어와 연산 방식이 같다

            console.log(&#39;typeof bool : &#39; + typeof bool);
        console.log(&#39;typeof num1 : &#39; + typeof num1);

        console.log(&#39;num1 + num2 : &#39; + num1 + num2);     
        console.log(&#39;num1 + num2 : &#39; + (num1 + num2));    
        // 괄호가 없는 덧셈은 문자열로 연산된다

        console.log(&#39;num1 - num2 : &#39; + (num1 - num2));    
        console.log(&#39;num1 - num2 : &#39; + num2 - num1);    
        // 괄호가 없는 뺄셈은 NaN값을 출력한다        

            console.log(&#39;num1 * num2 : &#39; + (num1 * num2));     
        console.log(&#39;num1 * num2 : &#39; + num1 * num2);     

            console.log(&#39;num1 / num2 : &#39; + (num1 / num2));    
        console.log(&#39;num1 / num2 : &#39; + num1 / num2);
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="2-콘솔-창-결과">2. 콘솔 창 결과</h3>
<p><img src="https://images.velog.io/images/han_been/post/89163baa-4d6b-46a2-bd2d-59be227b170b/%E1%84%87%E1%85%B3%E1%86%AF%E1%84%85%E1%85%A9%E1%84%80%E1%85%B3_%E1%84%8B%E1%85%A8%E1%84%89%E1%85%B5.png" alt="결과"></p>
<blockquote>
<ul>
<li><strong>알 수 있는 점</strong></li>
</ul>
</blockquote>
<ul>
<li>덧셈의 경우에는 괄호가 없으면 문자열로 연산이 된다</li>
<li>뺄셈의 경우에는 괄호가 없으면 &#39;NaN&#39; 값이 출력이 된다</li>
<li>곱셈과 뺄셈의 결과는 괄호와 상관이 없다</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[컨테이너, IoC(Inversion of Control)]]></title>
            <link>https://velog.io/@han_been/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-IoCInversion-of-Control</link>
            <guid>https://velog.io/@han_been/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-IoCInversion-of-Control</guid>
            <pubDate>Sun, 08 Nov 2020 13:39:15 GMT</pubDate>
            <description><![CDATA[<h4 id="컨테이너란">컨테이너란?</h4>
<blockquote>
<p>인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것</p>
</blockquote>
<h4 id="스프링-컨테이너">스프링 컨테이너</h4>
<blockquote>
<p>스프링 프레임워크의 핵심부에 위치하며, 종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다</p>
</blockquote>
<p>요놈은 !! 개발자가 작성한 코드의 처리과정을 자기가!! 알아서!! 개발자가 <strong><em>작성한 코드를 스스로 참조</em></strong> 하며, <em><strong>객체의 생성 소멸을 컨트롤</strong></em> 해준다.</p>
<p>정말이지 고마운 녀석인데 너무 익숙해져버렸다..</p>
<p>정리하자면, 개발자가 작성한 코드는 컨테이너를 사용하는 순간 개발자의 손을 떠나 컨테이너의 독립적인 영역으로 종속된다. </p>
<p>그리고 독립적인 컨테이너는 자기 마음대로 객체를 생성하는게 아니라 프로그램을 이요하는 이용자이 호출에 의해 컨테이너가 걸맞게 동작되는 구조이다.. </p>
<h3 id="스프링-컨테이너의-두-종류">스프링 컨테이너의 두 종류</h3>
<p>*<em>1. 빈팩토리 BeanFactory *</em>_(org.springframework.beans.factory.BeanFactory) _</p>
<blockquote>
<ul>
<li>DI(Dependency Injection)의 기본 바탕이 되는 가장 단순한 컨테이너 (팩토리 디자인 패턴을 구현한 것)</li>
</ul>
</blockquote>
<ul>
<li>Bean Factory는 Bean을 생성하고 분배하는 역할을 하는 클래스이다</li>
<li>Bean의 정의를 즉시 로딩</li>
<li>그러나 Bean이 필요하게 됐을 때 인스턴스화 한다<ul>
<li>정의 후 곧바로 인스턴스화 하지않고 필요해졌을 때 인스턴스화<ul>
<li>= Lazy loading</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>*<em>2. 어플리케이션 컨텍스트 ApplicationContext *</em>_(org.springframework.context.factory.BeanFactory) _</p>
<ul>
<li>빈 팩토리와 유사한 기능을 제공하나, 좀 더 많은 기능을 제공</li>
</ul>
<h4 id="더-추가적으로-제공하는-기능">더 추가적으로 제공하는 기능</h4>
<blockquote>
<ul>
<li>국제화가 지원되는 텍스트 메시기 관리</li>
</ul>
</blockquote>
<ul>
<li>이미지같은 파일 자원을 로드할 수 있는 포괄적인 방법 제공</li>
<li>리너스로 등록된 빈에게 이벤트 발생을 알려줌</li>
</ul>
<h4 id="많이-사용되는-applicationcontext">많이 사용되는 ApplicationContext</h4>
<blockquote>
<ul>
<li>ClassPathXmlApplicationContext : 클래스패스에 위치한 xml 파일에서 컨텐스트 정의 내용을 읽어들인다.</li>
</ul>
</blockquote>
<ul>
<li>FileSystemxmlApplicationContext : 파일 경로로 지정된 xml 파일에서 컨텐스트 정의 내용을 읽어들인다.</li>
<li>XmlWebApplicationContext : 웹 어플리케이션에 포함된 xml 파일에서 컨텐스트 정의 내용을 읽어들인다.</li>
</ul>
<h3 id="beanfactory의-lazy-loading과-의-차이">BeanFactory의 Lazy loading과 의 차이</h3>
<p>ApplicationContext는 초기화 시점에 모든 싱글턴 빈을 미리 로드한 후 애플리케이션 가동 후 빈을 지연없이 얻을 수 있음.</p>
<ul>
<li>미리 빈을 생성해 놓아서 빈이 필요할 때 즉시 사용 보장</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[SPRING]]></title>
            <link>https://velog.io/@han_been/SPRING</link>
            <guid>https://velog.io/@han_been/SPRING</guid>
            <pubDate>Sun, 08 Nov 2020 10:05:27 GMT</pubDate>
            <description><![CDATA[<h4 id="spring">SPRING</h4>
<ul>
<li><strong>엔터프라이즈</strong> 급 애플리캐이션을 만들기위한 모든 기능을 종합적으로 제공하는 <em><strong>경량화 된 솔루션</strong></em></li>
<li>JEE(Java Enterprise Edition)가 제공하는 다수의 기능을 지원하고 있기 때문에, JEE를 대체하는 Framework로 자리잡고 있음</li>
<li>SpringFramework는 JEE가 제공하는 다양한 기능을 제공하는 것 뿐만 아니라, DI(Dependency Injection)나 AOP(Aspect Oriented Programming)와 같은 기능도 지원함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Framework]]></title>
            <link>https://velog.io/@han_been/Spring-Framework</link>
            <guid>https://velog.io/@han_been/Spring-Framework</guid>
            <pubDate>Sat, 07 Nov 2020 05:27:34 GMT</pubDate>
            <description><![CDATA[<h4 id="등장배경">등장배경</h4>
<ul>
<li><p>Enterprise JavaBeans(EJB)를 사용하면 애플리케이션 작성을 쉽게 할 수 있다.</p>
<ul>
<li>코드 수정 후 반영하는 과정 자체가 거창해 기능은 좋으나 복잡한 스펙으로 개발의 효율이 떨어짐</li>
<li>애플리케이션을 테스트하기 위해서는 반드시 EJB서버가 필요함<blockquote>
<ul>
<li>Entity Bean : DB와 관련</li>
<li>Message-Driven Bean : EJB 컨테이너가 지원하는 EJB 구성 요소</li>
<li>Session Bean : Business Logic과 관련
등이 있으며, 현실에서의 반영이 어려움...</li>
</ul>
</blockquote>
</li>
</ul>
</li>
<li><p>Low Level의 트랜잭션이나 상태관리, 멀티 쓰레딩, 리소스 풀링과 같은 복잡한 Low Level의 API따위를 이해하지 못하더라도 아무 문제 없이 애플리케이션을 개발할 수 있다</p>
</li>
<li><p>웹사이트가 점점 커지면서 Enterprise Service가 필요해짐</p>
<ul>
<li>Session Bean에서 Transaction관리가 용이함</li>
<li>로긴, 분산처리, 보안 등</li>
<li>Java 진영에서는 EJB가 Enterprise급 서비스로 각광을 받게됨</li>
<li>배우기 어렵고, 설정해야할 부분이 많음.</li>
<li>EJB는 RMI기반으로 하는 서버이므로 무거운 Container이다. <blockquote>
<ul>
<li>RMI(Remote Method Invocation)</li>
</ul>
<ol>
<li>네트웍상에 있는 원격컴퓨터의 객체의 메소드를 호출하는 JAVA의 분산처리 방법</li>
<li>네트워크로 연결되어 다른 컴퓨터에 존재하는 메소드를
마치 내 컴퓨터에 있는 듯이 호출해서 사용 가능하게 만들어주는 것이 바로 java.rmi package 이다.</li>
</ol>
</blockquote>
</li>
</ul>
</li>
<li><p>점차 POJO + 경량 프레임워크를 사용하기 시작</p>
</li>
<li><p>POJO (Plain Old Java Object)</p>
<ul>
<li>특정 프레임워크나 기술에 의존적이지 않은 자바 객체</li>
<li>특정 기술에 종속적이지 않기 때문에 생산성, 이식성 향상</li>
<li>Plain : component interface를 상속받지 않는 특징 ( 특정 framework에 종속되지않는)</li>
<li>Old : EJB이전의 java class를 의미</li>
</ul>
</li>
<li><p>경량 프레임워크</p>
<ul>
<li>EJB가 제공하는 서비스를 지원해줄 수 있는 프레임워크 등장</li>
<li>Hibernate, JDO, iBatis(Mybatis), <em><strong>Spring</strong></em></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[UPDATE]]></title>
            <link>https://velog.io/@han_been/UPDATE</link>
            <guid>https://velog.io/@han_been/UPDATE</guid>
            <pubDate>Wed, 14 Oct 2020 12:16:42 GMT</pubDate>
            <description><![CDATA[<h3 id="update">UPDATE</h3>
<ul>
<li>where절의 conditions(조건)에 만족하는 레코드의 값을 변경</li>
<li><em><strong>주의</strong></em> <em><strong>!!!</strong></em> : WHERE 절을 생략하면 모든 데이터가 바뀜</li>
</ul>
<h4 id="member-table의-정보-변경">member table의 정보 변경</h4>
<blockquote>
<ul>
<li><strong>UPDATE DATA</strong> : </li>
</ul>
</blockquote>
<ul>
<li>사용자 아이디 : <strong>hanbeen</strong>인 회원의 정보를 다음으로 변경</li>
<li>비밀번호 : 9876</li>
<li>이메일 도메인 : naver.com</li>
</ul>
<h4 id="query">QUERY</h4>
<blockquote>
<p><strong>UPDATE</strong> member
<strong>SET</strong> userpwd = 9876, emaildomain = &#39;naver.com&#39;
<strong>WHERE</strong> userid = &#39;hanxbeen&#39;;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[INSERT]]></title>
            <link>https://velog.io/@han_been/INSERT</link>
            <guid>https://velog.io/@han_been/INSERT</guid>
            <pubDate>Wed, 14 Oct 2020 12:11:00 GMT</pubDate>
            <description><![CDATA[<h3 id="insert">INSERT</h3>
<ul>
<li>member table에 정보 입력하기</li>
</ul>
<blockquote>
<ul>
<li>INSERT DATA : </li>
</ul>
</blockquote>
<ul>
<li>이름 : 조한빈</li>
<li>사용자 아이디 : hanbeen</li>
<li>비밀번호 : 1234</li>
<li>이메일 아이디 : hanxbeen</li>
<li>이메일 도메인 : velog.io</li>
<li>가입일 : 오늘 날짜</li>
</ul>
<blockquote>
<p><strong>INSERT INTO</strong> <strong><em>member</em></strong>(username,userid, userpwd, emailid, emaildomain,joindate)
<strong>VALUES</strong> (&#39;조한빈&#39;, &#39;hanbeen&#39;, &#39;1234&#39;, &#39;hanxbeen&#39;, &#39;velog.io&#39;, now());</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL]]></title>
            <link>https://velog.io/@han_been/SQL</link>
            <guid>https://velog.io/@han_been/SQL</guid>
            <pubDate>Wed, 14 Oct 2020 11:45:55 GMT</pubDate>
            <description><![CDATA[<h3 id="sqlstructured-query-language">SQL(Structured Query Language)</h3>
<ul>
<li>DataBase에 있는 정보를 사용할 수 있도록 지원</li>
<li>모든 DBMS에서 사용 가능</li>
<li>대소문자를 구별하지 않고 사용한다
: insert, INsert, INSERT 모두 같게 식별한다<ul>
<li>단, 데이터의 대소문자는 구별한다</li>
</ul>
</li>
</ul>
<h3 id="sql-구문-종류">SQL 구문 종류</h3>
<ul>
<li><em><strong>DML</strong></em>(Data Manipulation Language)<ul>
<li>개별적으로 DB 테이블에서 새로운 행을 입력, 기존의 행을 변경, 제거</li>
</ul>
</li>
</ul>
<blockquote>
<ul>
<li><a href="https://velog.io/@han_been/INSERT"><strong>INSERT</strong></a></li>
</ul>
</blockquote>
<ul>
<li><a href="https://velog.io/@han_been/UPDATE"><strong>UPDATE</strong></a></li>
<li><strong>DELETE</strong></li>
<li><strong>SELECT</strong></li>
<li>COMMIT</li>
<li>ROLLBACK</li>
</ul>
<ul>
<li><em><strong>DDL</strong></em>(Data Definition Language)<ul>
<li>테이블로부터 데이터 구조를 생성, 변경, 제거</li>
</ul>
</li>
</ul>
<blockquote>
<ul>
<li><strong>CREATE</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>ALTER</strong></li>
<li><strong>DROP</strong></li>
<li><strong>RENAME</strong></li>
</ul>
<ul>
<li><em><strong>DCL</strong></em>(Data Control Language)<ul>
<li>DB와 그 그조에 대한 접근권한을 제공하거나 제거</li>
</ul>
</li>
</ul>
<blockquote>
<ul>
<li><strong>GRANT</strong></li>
</ul>
</blockquote>
<ul>
<li><strong>REVOKE</strong></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[정규화]]></title>
            <link>https://velog.io/@han_been/%EC%A0%95%EA%B7%9C%ED%99%94</link>
            <guid>https://velog.io/@han_been/%EC%A0%95%EA%B7%9C%ED%99%94</guid>
            <pubDate>Wed, 14 Oct 2020 11:30:02 GMT</pubDate>
            <description><![CDATA[<h3 id="정규화란">정규화란?</h3>
<ul>
<li>DB server의 메모리를 낭비하지 않기 위하여 어떤 테이블을 식별자로 가지는 여러개의 테이블로 나누는 과정을 말한다.</li>
<li>한마디로, 어떤 테이블을 더 이상 쪼갤 수 없을 때까지 쪼개는 것이다.</li>
</ul>
<h3 id="정규화의-종류">정규화의 종류</h3>
<ul>
<li>정규화에는 네 가지 종류가 있다.<ul>
<li>제 1 정규화</li>
<li>제 2 정규화</li>
<li>제 3 정규화</li>
<li>제 4 정규화</li>
</ul>
</li>
</ul>
<h4 id="제-1-정규화">제 1 정규화</h4>
<ul>
<li>어떤 테이블에서 반복되어지는 컬럼값들이 존재한다면, 값들이 반복되어 나오는 컬럼들을 분리해서 새로운 테이블을 만드는 것이다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[RDBMS ]]></title>
            <link>https://velog.io/@han_been/RDBMS</link>
            <guid>https://velog.io/@han_been/RDBMS</guid>
            <pubDate>Wed, 14 Oct 2020 11:24:48 GMT</pubDate>
            <description><![CDATA[<h3 id="rdbms">RDBMS?</h3>
<ul>
<li><strong>R</strong>elational <strong>D</strong>ata<strong>B</strong>ase <strong>M</strong>anagement <strong>S</strong>ystem</li>
<li>Tabled based DBMS<ul>
<li>데이터를 테이블 단위로 관리한다.
: 하나의 테이블은 여러 개의 Column(컬럼)으로 구성.</li>
<li>중복 데이터를 최소화 시킴.
: 같은 데이터가 여러 컬럼 또는 테이블에 존재할 경우 데이터 수정 시 문제가 발생할 가능성이 높아진다. -&gt; <a href="https://velog.io/@han_been/%EC%A0%95%EA%B7%9C%ED%99%94">정규화</a></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Servlet에 데이터 전달하기]]></title>
            <link>https://velog.io/@han_been/Servlet%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@han_been/Servlet%EC%97%90-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EB%8B%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 10 Oct 2020 09:12:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<h3 id="servlet으로-데이터를-전달하는-방식">Servlet으로 데이터를 전달하는 방식</h3>
</blockquote>
<ul>
<li>GET 호출</li>
<li>POST 호출</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[서블릿 생명주기
(Servlet Life Cycle)]]></title>
            <link>https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Servlet-Life-Cycle</link>
            <guid>https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Servlet-Life-Cycle</guid>
            <pubDate>Fri, 09 Oct 2020 10:45:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/han_been/post/ebbf458c-b7dd-41d5-b9d7-95c5c7f4360a/image.png" alt="Servlet Life Cycle"></p>
<blockquote>
<ul>
<li><em><strong>클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인</strong></em></li>
</ul>
</blockquote>
<blockquote>
<ul>
<li><em><strong>없을 경우 init()메소드를 호출하여 적재한다.</strong></em></li>
</ul>
</blockquote>
<ul>
<li><strong><em>init()메소드는 처음 한번만 실행</em></strong> 되기 때문에, 서블릿의 쓰레드에서 공통적으로 사용해야하는 것이 있다면 오버라이딩하여 구현. </li>
<li>실행 중 서블릿이 <strong><em>변경</em></strong> 될 경우, <strong><em>기존 서블릿을 destory</em></strong> 하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다.</li>
</ul>
<blockquote>
<ul>
<li>init()이 호출된 후 클라이언트의 요청에 따라서 service()메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기된다. </li>
</ul>
</blockquote>
<ul>
<li>이때 서블릿 컨테이너가 클라이언트의 요청이 오면 <strong><em>가장 먼저 처리하는 과정</em></strong> 으로 <em><strong>HttpServletRequest,HttpServletResponse를 생성</strong></em></li>
<li>HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공된다.</li>
</ul>
<blockquote>
<ul>
<li>컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출</li>
</ul>
</blockquote>
<ul>
<li>init()과 마찬가지로 <em><strong>한번만 실행</strong></em></li>
<li>종료시에 처리해야하는 작업들은 destroy()메소드를 오버라이딩하여 구현하면 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Servlet]]></title>
            <link>https://velog.io/@han_been/Servlet</link>
            <guid>https://velog.io/@han_been/Servlet</guid>
            <pubDate>Fri, 09 Oct 2020 08:35:47 GMT</pubDate>
            <description><![CDATA[<h1 id="-about-servlet"><em><strong>[ About Servlet..]</strong></em></h1>
<h3 id="servlet이란">Servlet이란?</h3>
<blockquote>
<ul>
<li>WebProgramming에서 Client의 요청을 처리</li>
<li>그 결과를 다시 Client에게 전송하는 자바 프로그래밍 기술</li>
<li>Servlet 클래스의 구현 규칙을 따른다.</li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>javax.servlet package에 정의된 인터페이스</li>
</ul>
</blockquote>
<ul>
<li><strong><em>서블릿의 라이프 사이클</em></strong> 을 위한 세 가지 필수적인 메소드를 정의<ul>
<li>init()</li>
<li>service()</li>
<li>destroy()</li>
</ul>
</li>
</ul>
<p>이 세 가지 메소드들은 모든 서블릿(SDK에서 정의되거나, 자체적으로 정의된)에 의해 구현되고, 특정 시간에 서버에 의해 호출됩니다.</p>
<h4 id="-inin">* inin()</h4>
<blockquote>
<ul>
<li>서블릿 생명 주기 중 <em><strong>초기화 단계</strong></em> 에 호출된다.</li>
</ul>
</blockquote>
<ul>
<li>javax.servlet.ServletConfig 인터페이스를 구현하는 오브젝트가 전달된다.</li>
<li>이를 통해 서블릿이 웹 애플리케이션에서 초기화 매개변수(parameter)에 접근할 수 있도록 한다.</li>
</ul>
<h4 id="-service">* service()</h4>
<blockquote>
<ul>
<li>초기화 이후 <em><strong>각각의 요청들</strong></em> 이 들어오면 호출된다.</li>
</ul>
</blockquote>
<ul>
<li>각각의 요청들은 별도로 나누어진 스레드에서 처리된다.</li>
<li>웹 컨테이너는 모든 요청에 대해 서블릿의 service() 메소드를 요청한다.</li>
<li>service() 메소드는 요청의 종류를 판별하고 요청을 처리할 적절한 메소드로 전달합니다. </li>
</ul>
<h4 id="-destroy">* destroy()</h4>
<blockquote>
<ul>
<li>서블릿 객체가 <em><strong>파괴되어야 할 때</strong></em> 호출된다.</li>
</ul>
</blockquote>
<ul>
<li><p>해당 서블릿이 가지고 있던 자원을 release 해줍니다.</p>
</li>
<li><p><em><strong>서블릿 객체의 생명 주기</strong></em> 에서 서블릿 클래스가 클래스 로더에 의해 컨테이너에 동적으로 로드된다</p>
</li>
<li><p>각 요청은 자체적인 스레드에 있으며, 서블릿 객체는 동시에 여러개의 스레드를 제공할 수 있다</p>
<ul>
<li>thread not safe
: 코드가 다른 스레드에 의해 상태가 변경될 수 있음</li>
</ul>
</li>
<li><p>더이상 사용되지 않을 때에는, JVM에 의해 Garbage Collecting 되어야 합니다</p>
</li>
</ul>
<h3 id="servlet이-해야하는-일">Servlet이 해야하는 일</h3>
<blockquote>
<ul>
<li>HTTP 요청(request)을 받아서 처리.</li>
<li>요청에 대한 응답(response)</li>
</ul>
</blockquote>
<h3 id="servlet의-특징">Servlet의 특징</h3>
<blockquote>
<ol>
<li>Client의 요청에 동적으로 작동</li>
<li>Java Thread를 이용해 동작</li>
<li>HTML 변경 시 재컴파일 필요</li>
<li><strong>Java 코드에 HTML이 들어가있음</strong></li>
<li>HTML을 사용해서 요청에 응답</li>
</ol>
</blockquote>
<h3 id="servlet-생성-방법">Servlet 생성 방법</h3>
<blockquote>
<ol>
<li>@WebServlet<ul>
<li>해당 서블릿과 매핑될 url 지정</li>
</ul>
</li>
<li>HttpServlet 클래스 상속</li>
</ol>
</blockquote>
<pre><code>@WebServlet(&quot;/Main.do&quot;)
public class MainServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //GET 방식으로 요청 받았을 떄 처리할 내용
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //POST 방식으로 요청 받았을 떄 처리할 내용
    }
}</code></pre><h1 id="-servlet-동작-방식-"><em><strong>[ Servlet 동작 방식 ]</strong></em></h1>
<p><img src="https://images.velog.io/images/han_been/post/6cde2757-a32e-4f14-aa0b-ed4b9ff66a99/image.png" alt=""></p>
<blockquote>
</blockquote>
<ol>
<li>사용자(클라이언트)가 URL을 클릭하면 _<strong>HTTP Request</strong>_를 Servlet Container로 전송합니다.</li>
<li>HTTP Request를 전송받은 Servlet Container는 _<strong>HttpServletRequest, HttpServletResponse 두 객체를 생성</strong>_합니다.</li>
<li>web.xml은 사용자가 요청한 URL을 분석하여 <strong><em>어느 서블릿</em></strong>에 대해 요청을 한 것인지 찾습니다.</li>
<li>해당 서블릿에서 service메소드를 호출한 후 클리아언트의 POST, GET여부에 따라 <strong><em>doGet() 또는 doPost()를 호출</em></strong>합니다.</li>
<li>doGet() or doPost() 메소드는 동적 페이지를 생성한 후 <strong><em>HttpServletResponse</em></strong>객체에 응답을 보냅니다.</li>
<li>응답이 끝나면 HttpServletRequest, HttpServletResponse 두 _<strong>객체를 소멸</strong>_시킵니다.</li>
</ol>
<h3 id="servlet-container가-궁금하시다면-click">Servlet Container가 궁금하시다면 <a href="https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80"><em><strong>CLICK!!</strong></em></a></h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[서블릿 컨테이너(Servlet Container) 란?]]></title>
            <link>https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80</link>
            <guid>https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80</guid>
            <pubDate>Fri, 09 Oct 2020 08:34:01 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.programcreek.com/2013/04/what-is-servlet-container/">출처 : 잘 정리된 영문 사이트 참고</a></p>
<ul>
<li><p>서블릿 컨테이너를 알기전에 웹서버에 대한 이해가 먼저 필요합니다.</p>
</li>
<li><p>웹서버에 대해서 알아보겠습니다. </p>
<h2 id="-웹서버란--"><em><strong>[ 웹서버란 ? ]</strong></em></h2>
</li>
<li><p>웹서버 : 웹페이지를 사용자에게 전송하는 서버</p>
</li>
</ul>
<p><img src="https://images.velog.io/images/han_been/post/e8418da4-7a8d-4463-b765-e4c3ffcf491d/image.png" alt="web server"></p>
<blockquote>
<ul>
<li>웹 서버는 데이터를 전송하기 위해 HTTP 프로토콜을 사용합니다.</li>
</ul>
</blockquote>
<ul>
<li>일반적인 상황에서 사용자는 브라우저에 URL(<a href="https://velog.io/@han_been)%EC%9D%84">https://velog.io/@han_been)을</a> 입력합니다.</li>
<li>그리고 사용자는 웹페이지를 얻게 됩니다.</li>
<li>웹서버가 하는 일은 웹페이지를 사용자에게 전송하는 것입니다.</li>
</ul>
<h2 id="-서블릿-컨테이너란--"><em><strong>[ 서블릿 컨테이너란 ? ]</strong></em></h2>
<ul>
<li>서블릿 컨테이너 
: 서블릿들의 생성, 실행, 파괴를 담당한다.
: 서블릿들을 위한 상자(Container)입니다.</li>
</ul>
<p>서버에 만들어진 서블릿이 스스로 작동하는 것이 아니라, <strong><em>서블릿을 관리</em></strong> 해주는 것이 필요한데, 이러한 역할을 하는 것이 바로 <em><strong>서블릿 컨테이너</strong></em> 입니다.</p>
<p>즉, 서블릿을 &#39;요구사항 명세서&#39;라고 표현한다면, 서블릿 컨테이너는 그 명세서를 보고 개발하는 &#39;개발자&#39;입니다.</p>
<p>서블릿 컨테이너는 Clinet의 Request를 받아주고 Response할 수 있게, 웹 서버와 소켓을 만들어 통신합니다.</p>
<p>대표적으로 무료 서비스인 Tomcat(톰캣)이 있습니다.</p>
<p>톰캣은 웹 서버와 소켓을 만들어 통신하며 JSP(java server page)와 Servlet이 작동할 수 있는 환경을 제공합니다. 
<img src="https://images.velog.io/images/han_been/post/84e64c50-5a45-49c2-8a04-66ef3be86f8a/image.png" alt="servlet container"></p>
<blockquote>
<ul>
<li>일반적으로 사용자는 서버에서 오직 정적인 웹페이지만을 요청할 수 있음</li>
</ul>
</blockquote>
<ul>
<li>만약 사용자가 본인의 입력을 기초로한 웹페이지를 자유롭게 얻고 싶다면 이 방법은 제한적임</li>
<li>_<strong>서블릿 컨테이너</strong>_는 서버 사이드에서 _<strong>동적으로 웹페이지를 생성</strong>_하기 위해 자바를 사용</li>
<li>때문에 _<strong>웹서버와 서블릿들이 상호작용</strong>_할 때 서블릿 컨테이너는 필수적</li>
</ul>
<p>Servlet에 대한 기초가 궁금하시다면  <a href="https://velog.io/@han_been/Servlet">CLICK!!</a></p>
<h2 id="-서블릿-컨테이너의-역할은--"><em><strong>[ 서블릿 컨테이너의 역할은 ? ]</strong></em></h2>
<blockquote>
<p><strong>_ 1. 웹서버와의 통신 지원_</strong></p>
</blockquote>
<ul>
<li>서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어, 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다.</li>
</ul>
<blockquote>
<p> <strong><em>2. 서블릿 생명주기(Life Cycle) 관리</em></strong> </p>
</blockquote>
<ul>
<li>서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리한다. <ul>
<li><ol>
<li>서블릿 클래스를 로딩하여 인스턴스화</li>
</ol>
</li>
<li><ol start="2">
<li>초기화 메소드를 호출</li>
</ol>
</li>
<li><ol start="3">
<li>요청이 들어오면 적절한 서블릿 메소드를 호출합니다. </li>
</ol>
</li>
<li><ol start="4">
<li>서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행</li>
</ol>
</li>
</ul>
</li>
</ul>
<p>서블릿 생명 주기(Servlet Life Cycle)가 궁금하시다면 <a href="https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Servlet-Life-Cycle">CLICK!!</a></p>
<blockquote>
<p><strong>_ 3. 멀티쓰레드 지원 및 관리 _</strong></p>
</blockquote>
<ul>
<li><ol>
<li>서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 쓰레드를 하나 생성</li>
</ol>
</li>
<li><ol start="2">
<li>HTTP 서비스 메소드를 실행하고 나면, 쓰레드는 자동으로 소멸</li>
</ol>
</li>
<li><ol start="3">
<li>원래는 쓰레드를 관리해야 하지만 서버가 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 된다.</li>
</ol>
</li>
</ul>
<blockquote>
<p><strong>_4. 선언적인 보안 관리 _</strong></p>
</blockquote>
<ul>
<li>서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현해 놓지 않아도 됩니다.</li>
<li>일반적으로 보안관리는 XML 배포 서술자에 다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 
수정하여 다시 컴파일 하지 않아도 보안관리가 가능합니다.</li>
</ul>
<h2 id="-웹-서버와-서블릿-컨테이너는-어떻게-요청을-처리할까--"><em><strong>[ 웹 서버와 서블릿 컨테이너는 어떻게 요청을 처리할까 ? ]</strong></em></h2>
<p><img src="https://images.velog.io/images/han_been/post/b6a06db4-33a2-4bfc-a822-81a8dafe90d1/image.png" alt=""></p>
<blockquote>
<ol>
<li>웹서버가 HTTP 요청을 받는다</li>
<li>웹서버는 요청을 서블릿 컨테이너로 전달합니다. </li>
<li>서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드한다</li>
<li>컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿이 초기화된다 
: 서블릿이 처음 로드됬을 때 한번만 호출</li>
<li>컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리한다. 
(요청의 데이터를 읽고, 응답을 만들어낸다)
서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.</li>
<li>웹서버는 동적으로 생성된 결과를 올바른 위치에 반환한다. </li>
</ol>
</blockquote>
<h2 id="-이-과정에서-jvm의-역할은--"><em><strong>[ 이 과정에서 JVM의 역할은 ? ]</strong></em></h2>
<ul>
<li>각 요청들을 &#39;분리된 스레드&#39; 내부에서 처리한다</li>
<li>즉, 서블릿을 사용하는 것은 JVM이 각 요청을 <em><strong>분리된 자바 스레드 내부에서 처리하도록</strong></em> 하는 것</li>
<li>이는 <em><strong>서블릿 컨테이너의 주요 장점</strong></em> 중 하나이다.</li>
<li>각 서블릿은 HTTP 요청에 응답하는 특정한 요소들이 있는 자바 클래스이다.</li>
<li>대부분의 사례에 서블릿 컨테이너는 하나의 JVM에서 동작하지만 컨테이너가 여러개의 JVM들을 필요로하는 문제들이 존재하기도 한다.</li>
</ul>
<blockquote>
<p><em><strong>서블릿 컨테이너</strong></em> 의 가장 중요한 기능은 <em><strong>요청을 올바른 서블릿에 전달해서 처리</strong>_되도록하고, **_JVM이 해당 요청을 처리</em>** 한 후에는 <strong><em>생성된 결과를 올바른 장소에 동적으로 반환</em></strong> 해주는 것이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 10809번 알파벳 찾기]]></title>
            <link>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-10809%EB%B2%88-%EC%95%8C%ED%8C%8C%EB%B2%B3-%EC%B0%BE%EA%B8%B0</link>
            <guid>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-10809%EB%B2%88-%EC%95%8C%ED%8C%8C%EB%B2%B3-%EC%B0%BE%EA%B8%B0</guid>
            <pubDate>Sat, 03 Oct 2020 07:49:33 GMT</pubDate>
            <description><![CDATA[<h3 id="주어진-문제">주어진 문제</h3>
<p><img src="https://images.velog.io/images/han_been/post/b8813f23-cc1a-4c59-a66b-f4c86bb15017/image.png" alt=""></p>
<h3 id="접근-방법">접근 방법</h3>
<blockquote>
<ol>
<li>입력받은 문자열을 split으로 구분하여 String 배열에 저장</li>
<li>모두 소문자로 입력을 받기때문에 소문자로 변환하는 아스키 코드를 활용</li>
<li><em>a : 97, b : 98 <del>~</del> z: 112</em> 이므로 크기가 26(알파벳 수)인 int 배열을 선언</li>
<li>String 배열을 반복문으로 돌리면서 현재 값에서 -97을 하면 알파벳의 순서에 따른 인덱스가 된다.</li>
</ol>
</blockquote>
<blockquote>
<p><strong>Ex</strong> : b를 alpha 인덱스에 저장하기 </p>
</blockquote>
<ol>
<li>S라는 String형 배열의 첫번째 값인 &quot;b&quot;를 charAt을 통해 character형으로 변환</li>
<li>Integer형인 &#39;b&#39;에 값을 넣으면 아스키 코드값인 정수형인 &#39;98&#39;로 입력된다.</li>
<li>&#39;a&#39;의 아스키 코드값인 97을 빼주면,,</li>
<li>98-97을 하면 &#39;1&#39;이 나오고 alpha라는 배열의 인덱스가 1인 곳은 알파벳 b의 순서에 맞게 두번째 인덱스에 값을 대입할 수 있다.</li>
</ol>
<blockquote>
<p><strong>Ex</strong> : z를 alpha 인덱스에 저장하기 </p>
</blockquote>
<ol>
<li>&#39;z&#39;또한 아스키 코드로 변환하면 &#39;112&#39;</li>
<li>97(a의 아스키코드값)을 빼주면 25</li>
<li>0부터 25의 인덱스까지 있는 alpha배열의 맨 마지막 인덱스 번호가 된다.</li>
<li>알파벳 상 z의 위치와 같다.</li>
</ol>
<h4 id="해결-알고리즘">해결 알고리즘</h4>
<pre><code>import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] S = sc.next().split(&quot;&quot;);
        int[] alpha = new int[26];
        Arrays.fill(alpha, -1);
        for (int i = 0; i &lt; S.length; i++) {
            int b = S[i].charAt(0);
            if (alpha[b - 97] == -1) {
                alpha[b - 97] = i;
            }
        }
        for (int i = 0; i &lt; alpha.length; i++) {
            System.out.print(alpha[i] + &quot; &quot;);
        }
        sc.close();
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 1546번 평균]]></title>
            <link>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-1546%EB%B2%88-%ED%8F%89%EA%B7%A0</link>
            <guid>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-1546%EB%B2%88-%ED%8F%89%EA%B7%A0</guid>
            <pubDate>Sat, 03 Oct 2020 06:19:03 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/1546">백준 1546 평균</a></p>
<h3 id="주어진-내용">주어진 내용</h3>
<p><img src="https://images.velog.io/images/han_been/post/61864b9f-7225-4375-8195-1d2fae3c5a27/image.png" alt=""></p>
<h3 id="입-출력-예제">입 출력 예제</h3>
<p><img src="https://images.velog.io/images/han_been/post/dd092d55-cd03-4623-9f5f-88069d980bd5/image.png" alt=""></p>
<h4 id="접근-방법">접근 방법</h4>
<blockquote>
<ol>
<li>과목의 개수에 따른 입력을 받는다</li>
<li>각 과목의 점수들을 &#39;score&#39; ArrayList에 Add한다</li>
<li>Collections.max(score) 함수를 통해 &#39;score&#39; ArrayList의 최댓값을 얻어낸다.</li>
<li>&#39;average&#39; ArrayList에 최댓값으로 나눈 후 </li>
</ol>
<p>*100을 한 값을 각 &#39;score&#39; ArrayList에 Add한다.
5. &#39;average&#39; ArrayList의 모든 인덱스의 값을 더한 뒤 T(과목개수)로 나누면 새로운 평균이 된다.</p>
</blockquote>
<pre><code>import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList&lt;Float&gt; score = new ArrayList&lt;&gt;();
        ArrayList&lt;Float&gt; average = new ArrayList&lt;&gt;();
        int T = sc.nextInt();
        float ans = 0;
        for (int i = 0; i &lt; T; i++) {
            float input = sc.nextInt();
            score.add(input);
        }
        for (int i = 0; i &lt; score.size(); i++) {
            float max = Collections.max(score);
            average.add(score.get(i) / max * 100);
        }
        for (int i = 0; i &lt; average.size(); i++) {
            ans +=average.get(i);
        }
        System.out.println(ans/T);
        sc.close();
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 8393번 합]]></title>
            <link>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-8393%EB%B2%88-%ED%95%A9</link>
            <guid>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-8393%EB%B2%88-%ED%95%A9</guid>
            <pubDate>Fri, 02 Oct 2020 08:29:55 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.acmicpc.net/problem/8393">백준 8393번 합 / 자바 풀이</a></p>
<p><img src="https://images.velog.io/images/han_been/post/af5c1c7c-d0c1-4d4e-887d-c7edc2f9e33f/image.png" alt=""></p>
<h3 id="for문을-활용한-풀이">for문을 활용한 풀이</h3>
<pre><code>public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        int ans = 0;
        for (int i = 1; i &lt;= T; i++) {
            ans += i;
        }
        System.out.println(ans);
    }

}
</code></pre><h3 id="재귀를-활용한-풀이">재귀를 활용한 풀이</h3>
<pre><code>
import java.util.Scanner;

public class Main {
    static int ans = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        PLUS(N);
    }

    private static void PLUS(int n) {
        ans += n;
        if (n == 1) {
            System.out.println(ans);
            return;
        }
        PLUS(n - 1);
    }

}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[백준 2739번 구구단]]></title>
            <link>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-2739%EB%B2%88-%EA%B5%AC%EA%B5%AC%EB%8B%A8</link>
            <guid>https://velog.io/@han_been/%EB%B0%B1%EC%A4%80-2739%EB%B2%88-%EA%B5%AC%EA%B5%AC%EB%8B%A8</guid>
            <pubDate>Fri, 02 Oct 2020 08:18:50 GMT</pubDate>
            <description><![CDATA[<p>프로그래밍의 시작이라 할 수 있겠다...
<a href="https://www.acmicpc.net/problem/2739">백준 구구단</a></p>
<h3 id="for-문을-활용한-구구단">&lt;for 문을 활용한 구구단&gt;</h3>
<p><img src="https://images.velog.io/images/han_been/post/9ee56feb-52e9-4f14-8f55-04dde1d013c6/image.png" alt=""></p>
<p>출력 결과에서 바뀌는 것은 2 * (1<del>9) = ? 
1</del>9 부분이다. 
이 부분을 for문으로 구현하면 된다.</p>
<pre><code>
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int dan = sc.nextInt();
        for (int i = 1; i &lt;= 9; i++) {
            System.out.println(dan+&quot; * &quot;+i+&quot; = &quot;+dan*i);
        }
    }

}</code></pre>]]></description>
        </item>
    </channel>
</rss>