<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>명품호세의 개발 공부 및 기록 블로그</title>
    <link>https://hose.tistory.com/</link>
    <description>공부와 개발하면서 배운점을 기록합니다.</description>
    <language>ko</language>
    <pubDate>Sun, 12 Jul 2026 11:40:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>명품호세</managingEditor>
    <item>
      <title>백준 온라인저지 2292번 Java</title>
      <link>https://hose.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 그림만 보고 생각하면 어떻게 풀어야 할지 감이 잘 안온다. 표를 만들어서 한번 보자&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 120px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;최소 방번호 ~ 최대 방번호&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;해당 층의 방 갯수&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;거리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;1 - 1층&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;2 ~ 7&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;6 - 2층&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;8 ~ 19&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;12 - 3층&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;20 ~ 37&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;18 - 4층&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;38 ~ 61&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;24 - 5층&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표를 자세히 보면 방이 1개일때를 제외하고는 층이 바뀔때 마다 방이 6의 배수로 늘어나는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 1층을 제외한 층의 최소 방번호 역시 &lt;b&gt;최소 방번호 + 해당 층의 방 갯수를 더하면 다음 층의 최소 방번호&lt;/b&gt;가 나오는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 힌트로 코드를 작성해보자&lt;/p&gt;
&lt;pre id=&quot;code_1624184925099&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int range = 2;
int count = 1;

while (range &amp;lt;= N) {
    range += 6 * count;
    count ++;
}

System.out.println(count);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1층일 때는 어차피 1이므로 제외하고 range를 2층의 최소 방번호 부터 시작해보자. (여기서 N은 입력 방 번호값이다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 N을 입력하면 range를 2층부터 방의 수를 계속 더해주어 N보다 커지면 중지시키는 알고리즘이다.&lt;/p&gt;
&lt;pre id=&quot;code_1624185402641&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());

        if (N == 1) {
            System.out.println(N);
            return;
        } else {
            int range = 2;
            int count = 1;

            while (range &amp;lt;= N) {
                range += 6 * count;
                count ++;
            }

            System.out.println(count);
        }
    }
}
&lt;/code&gt;&lt;/pre&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://st-lab.tistory.com/73&quot;&gt;[백준] 2292번 : 벌집 - JAVA [자바] (tistory.com)&lt;/a&gt;&lt;/p&gt;</description>
      <category>알고리즘/문제풀이</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/51</guid>
      <comments>https://hose.tistory.com/51#entry51comment</comments>
      <pubDate>Sun, 20 Jun 2021 19:36:59 +0900</pubDate>
    </item>
    <item>
      <title>백준 온라인저지 2941번 Java</title>
      <link>https://hose.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;주어진 문자열을 모두 순회하면서 변경할 크로아티아 알파벳이 나올경우 비교하여 순회하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면 c가 나올경우 c다음에 =가 나올지 -가 나올지 비교하며 진행하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 알아보자&lt;/p&gt;
&lt;pre id=&quot;code_1624163008868&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();

for (int i = 0; i &amp;lt; length; i++) {
        char ch = s.charAt(i);

        char nextCh;

        if (ch == 'c' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
            nextCh = s.charAt(i + 1);

            if (nextCh == '=' || nextCh == '-') {
                    i += 1;
            }
        }
 }&lt;/code&gt;&lt;/pre&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;위 코드에서 문장 s의 길이로 전체 순회를 돈다.&lt;/li&gt;
&lt;li&gt;문자열의 해당 인덱스에 단어를 가져온다.&lt;/li&gt;
&lt;li&gt;크로아티아 알파벳에 해당할 경우 그 다음 단어까지 비교한다.&lt;/li&gt;
&lt;li&gt;만약 문장 끝에 c가 있을 경우 nextCh를 가져올때 IndexOutofBounds 에러가 발생하니 문장의 끝이 아닌지 확인한다.&lt;/li&gt;
&lt;li&gt;변경된 크로아티아 알파벳에 해당할 경우 2단어를 1단어로 취급해야 하니 인덱스 i를 +1 해준다.&lt;/li&gt;
&lt;/ol&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;pre id=&quot;code_1624163299966&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();

        int count = 0;
        int length = s.length();

        for (int i = 0; i &amp;lt; length; i++) {
            char ch = s.charAt(i);

            char nextCh;

            if (ch == 'c' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
                nextCh = s.charAt(i + 1);

                if (nextCh == '=' || nextCh == '-') {
                    i += 1;
                }
            } else if (ch == 'd' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
                nextCh = s.charAt(i + 1);

                if (nextCh == 'z' &amp;amp;&amp;amp; i &amp;lt; length - 2) {
                    nextCh = s.charAt(i + 2);
                    if (nextCh == '=') {
                        i += 2;
                    }
                } else if (nextCh == '-') {
                    i += 1;
                }
            } else if (ch == 'l' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
                nextCh = s.charAt(i + 1);

                if (nextCh == 'j') {
                    i += 1;
                }
            } else if (ch == 'n' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
                nextCh = s.charAt(i + 1);

                if (nextCh == 'j') {
                    i += 1;
                }
            } else if (ch == 's' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
                nextCh = s.charAt(i + 1);

                if (nextCh == '=') {
                    i += 1;
                }
            } else if (ch == 'z' &amp;amp;&amp;amp; i &amp;lt; length - 1) {
                nextCh = s.charAt(i + 1);

                if (nextCh == '=') {
                    i += 1;
                }
            }

            count++;
        }

        System.out.println(count);
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/문제풀이</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/50</guid>
      <comments>https://hose.tistory.com/50#entry50comment</comments>
      <pubDate>Sun, 20 Jun 2021 13:28:39 +0900</pubDate>
    </item>
    <item>
      <title>동시성과 병렬성</title>
      <link>https://hose.tistory.com/49</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;동시성 (Concurrency)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소프트웨어 적으로 동시에 실행되는 것처럼 보이게 하는것이다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;싱글 코어에서 멀티 스레드를 동작시키기 위한 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;멀티 코어에서도 동시성은 사용 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;멀티 태스킹을 위해 여러 개의 스레드가 번갈아가면서 실행되는 방식&lt;/li&gt;
&lt;li&gt;동시성을 이용한 싱글 코어의 멀티 태스킹은 각 스레드들이 병렬적으로 실행되는 것처럼 보이지만 사실은 번갈아 가면서 조금씩 실행되고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;병렬성 (Parallelism)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물리적으로 같은 시간동안 작업이 동시에 실행되고 있는것&lt;/li&gt;
&lt;li&gt;멀티코어에서 멀티 스레드를 동작시키는 방식&lt;/li&gt;
&lt;li&gt;병렬성은 데이터 병렬성과 작업 병렬성으로 구분된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 병렬성 : 전체 데이터를 나누어 서브데이터를 만든 뒤, 서브 데이터들을 병렬 처리하여 작업을 빠르게 수행하는것&lt;/li&gt;
&lt;li&gt;작업 병렬성 : 서로 다른 작업을 병렬처리하는것&lt;/li&gt;
&lt;/ul&gt;
&lt;/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;출처 : &lt;a href=&quot;https://atin.tistory.com/567&quot;&gt;동시성(Concurrency) vs 병렬성(Parallelism) Atin (tistory.com)&lt;/a&gt;&lt;/p&gt;</description>
      <category>개발 지식</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/49</guid>
      <comments>https://hose.tistory.com/49#entry49comment</comments>
      <pubDate>Tue, 8 Jun 2021 12:35:02 +0900</pubDate>
    </item>
    <item>
      <title>RDB와 NOSQL 차이점 간단 정리</title>
      <link>https://hose.tistory.com/48</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;RDB&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDB는 Relation DataBase의 약자이다. RDB를 만든 핵심 개념이 관계형 대수학이다. 자료를 관계형 대수학 개념으로 묶고 이를 바탕으로 테이블을 만든다. 뿐만 아니라 SQL문법역시 관계형 대수학을 기반으로 한다. 그리하여 &quot;관계형&quot;데이터베이스 라는 이름을 얻었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 테이블에 레코드로 저장되는데, 각 테이블마다 명확하게 정의된 구조(스키마)가 있다. &lt;b&gt;데이터를 저장할때 스키마를 준수하지 않은 레코드는 저장할 수 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;NOSQL&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nosql은 RDB의 확장성이슈를 해결하기 위해 나온 데이터베이스 모델이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스키마가 없기때문에 RDB보다 자유롭게 데이터를 관리할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NoSQL 에서는 Document에 데이터가 저장된다. 여기서 Document는 RDB의 레코드이며 테이블은 Collection이라는 형태로 데이터를 관리한다.&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-origin-width=&quot;464&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bahdox/btq6EVUacp9/vbFdhMtwSsY7yO35eU5RY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bahdox/btq6EVUacp9/vbFdhMtwSsY7yO35eU5RY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bahdox/btq6EVUacp9/vbFdhMtwSsY7yO35eU5RY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbahdox%2Fbtq6EVUacp9%2FvbFdhMtwSsY7yO35eU5RY0%2Fimg.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;283&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 데이터가 있다면 RDB는 필요한 정보만 따로 빼서 각각의 테이블에 저장해야 하지만 NoSQL의 경우 위 데이터를 통째로 저장할 수 있는 차이점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDB의 경우 성능상 이슈가 있을경우 Scale-Up을 통해 업그레이드를 할수밖에 없지만 NoSql의 경우 데이터 모델 자체가 독립적으로 설계되어있어 데이터를 여러 서버에 분산 시키는 Scale-Out을 통해 개선이 가능하다. 물론 RDB도 샤딩을 통해 충분히 Scale-Out할 수 있지만 어플리케이션 레벨에서 모든 샤딩을 제어해야 한다 (어떤 데이터를 요청하면 어느 클러스터에서 처리해라) 그러나 NoSql은 자체적으로 지원하기 때문에 복잡한 제어가 필요하지 않다.&lt;/p&gt;</description>
      <category>데이터베이스</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/48</guid>
      <comments>https://hose.tistory.com/48#entry48comment</comments>
      <pubDate>Mon, 7 Jun 2021 19:10:45 +0900</pubDate>
    </item>
    <item>
      <title>서블릿, 서블릿 컨테이너</title>
      <link>https://hose.tistory.com/47</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;서블릿이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 HTML을 사용하여 웹페이지를 개발했다. 그러나 HTML만 사용할 경우 사용자 변경이나, 시간에따라 데이터를 바꿀 수 없다. 즉 데이터가 고정되어있어 정적인 웹페이지밖에 만들 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 글을 등록하거나 삭제할 경우 동적으로 데이터를 보여주고 싶다면 동적인 웹페이지를 작성해야 하는데 &lt;b&gt;JAVA 진영에서 동적인 웹페이지를 개발하기위한 기술중 하나가 서블릿이다.&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;톰캣이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서블릿을 실행하는 역할을 한다. 사용자의 요청을받아 사용자 요청에 해당하는 Path를 추출하고 Path에 해당하는 서블릿을 찾아 그 서블릿에 요청을 하고 서블릿이 작업 처리가 끝나고 응답을 하면 클라이언트에게 데이터를 전달하는 역할을 한다. 이런 톰캣서버를 총칭해서 Web Application Server라고 하고 줄여서 WAS라고 한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;서블릿 컨테이너란?&lt;/h2&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;</description>
      <category>JAVA</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/47</guid>
      <comments>https://hose.tistory.com/47#entry47comment</comments>
      <pubDate>Fri, 4 Jun 2021 12:52:28 +0900</pubDate>
    </item>
    <item>
      <title>람다</title>
      <link>https://hose.tistory.com/46</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;람다식은 객체지향 언어보다는 함수지향 언어에 가깝다. 객체지향 언어인 자바가 람다식을 수용한 이유는 코드가 매우 간결해지고 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있기 때문이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다식은 &quot;(매개변수) -&amp;gt; { 실행코드 }&quot; 형태로 작성되는데, 마치 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다.&amp;nbsp;&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;람다식의 기본 문법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다식을 작성하는 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(타입, 매개변수) -&amp;gt; { 실행문 }&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 int 매개 변수 a의 값을 콘솔에 출력하기 위해 다음과 같이 람다식을 작성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1621832845871&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(int a) -&amp;gt; { System.out.println(a); }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매개 변수의 타입은 대입되는 값에 따라 자동으로 인식될 수 있기 때문에 &lt;b&gt;생략해도 무방하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 매개변수만 있다면 괄호를 생략 할 수 있고, 하나의 실행문만 있다면 중괄호도 생략이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1621832918328&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a -&amp;gt; System.out.println(a)&lt;/code&gt;&lt;/pre&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;만약 어떤 작업을 수행후 리턴해야 하는 값이 있으면 return을 적어주고 만약 return만 있다면 return 생략 하여 작성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1621832991952&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(x, y) -&amp;gt; x + y&lt;/code&gt;&lt;/pre&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;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;자바 8부터는 빈번하게 사용되는 함수적 인터페이스는 표준 API 패키지로 제공한다. 크게 Consumer, Supplier, Function, Operator, Predicate로 구분된다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;종류&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;특징&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Consumer&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;매개값은 있고 리턴값은 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Supplier&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;매개값은 없고, 리턴값은 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Function&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;매개값도 있고 리턴값도 있음&lt;br /&gt;주로 매개값을 리턴값으로 매핑(타입 변환)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Operator&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;매개값도 있고, 리턴값도 있음&lt;br /&gt;주로 매개값을 연산하고 결과를 리턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;Predicate&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;매개값은 있고, 리턴값은 boolean&lt;br /&gt;매개값을 조사해서 true/false를 리턴&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메소드 참조&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에 불필요한 매개 변수를 제거하는 것이 목적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 두개의 값을 받아 큰 수를 리턴하는 Math 클래스의 max() 정적 메소드를 호출하는 람다식은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1621840448957&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(left, right) -&amp;gt; Math.max(left, right);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우에는 다음과 같이 메소드 참조를 이용하면 매우 깔끔하게 처리할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1621840475076&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Math::max&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적(static)메서드를 참조할 경우에는 클래스 이름 뒤에 :: 기호를 붙이고 정적 메소드 이름을 적으면된다.&lt;/p&gt;
&lt;pre id=&quot;code_1621840527867&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;클래스 :: 메소드&lt;/code&gt;&lt;/pre&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;pre id=&quot;code_1621840557550&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;참조변수 :: 메서드&lt;/code&gt;&lt;/pre&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;</description>
      <category>JAVA</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/46</guid>
      <comments>https://hose.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 24 May 2021 16:07:07 +0900</pubDate>
    </item>
    <item>
      <title>mysql 컨테이너 띄우는 docker-compose 명령어</title>
      <link>https://hose.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose.yml 파일을 만들고 아래와 같이 만들어준다.&lt;/p&gt;
&lt;pre id=&quot;code_1621748600029&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: &quot;3&quot; # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:5.7.34 # 사용할 이미지
    container_name: mysql_container # 컨테이너 이름 설정
    ports:
      - &quot;3306:3306&quot; # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: &quot;password&quot;  # MYSQL 패스워드 설정 옵션
    command: # 명령어 실행
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/bell/mysql_data:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성 후 터미널에서&amp;nbsp;docker-compose up을 입력하면 mysql 컨테이너가 만들어진다.&lt;/p&gt;</description>
      <category>도커</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/45</guid>
      <comments>https://hose.tistory.com/45#entry45comment</comments>
      <pubDate>Sun, 23 May 2021 14:45:07 +0900</pubDate>
    </item>
    <item>
      <title>웹 서버와 WAS 의 차이점</title>
      <link>https://hose.tistory.com/43</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹서버&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;/li&gt;
&lt;li&gt;하드웨어 : Web 서버가 설치되어있는 컴퓨터&lt;/li&gt;
&lt;li&gt;소프트웨어 : 웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠 (html, css 등)를 제공하는 컴퓨터 프로그램&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;웹서버의 기능&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;기능 1
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적인 컨텐츠 제공&lt;/li&gt;
&lt;li&gt;WAS를 거치지 않고 바로 자원을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기능 2
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동적인 컨텐츠 제공을 위한 요청 전달&lt;/li&gt;
&lt;li&gt;클라이언트의 요청(Request)을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답, Response)한다.&lt;/li&gt;
&lt;li&gt;클라이언트는 일반적으로 웹 브라우저를 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;웹 서버의 예 : Nginx, Apache Server 등&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;WAS ( Web Application Server)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAS의 개념&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server&lt;/li&gt;
&lt;li&gt;HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)이다.&lt;/li&gt;
&lt;li&gt;'웹 컨테이너' 혹은 '서블릿 컨테이너' 라고도 불린다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말한다. WAS는 JSP, Servlet 구동 환경을 제공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAS의 역할&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WAS = Web Server + Web Container&lt;/li&gt;
&lt;li&gt;웹서버의 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시되었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용된다.&lt;/li&gt;
&lt;li&gt;주로 DB 서버와 같이 수행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;현재는 WAS가 가지고 있는 웹 서버도 정적인 컨텐츠를 처리 하는데 있어서 성능상 큰 차이가 없다.&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;WAS의 주요 기능&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 실행 환경과 DB 접속 기능 제공&lt;/li&gt;
&lt;li&gt;여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능&lt;/li&gt;
&lt;li&gt;업무를 처리한느 비즈니스 로직 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WAS의 예 : Tomcat 등&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹 서버와 WAS를 구분하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지는 정적 컨텐츠와 동적컨텐츠가 모두 존재한다. 이를 WAS에서 모두 처리하기에는 정적데이터 처리로 인해 부하가 커지게되어 동적 컨텐츠의 처리가 지연되어 수행속도가 저하된다. 웹서버를 사용하여 정적인 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있다.&lt;/p&gt;</description>
      <category>개발 지식</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/43</guid>
      <comments>https://hose.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 19 May 2021 16:03:19 +0900</pubDate>
    </item>
    <item>
      <title>Index</title>
      <link>https://hose.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Index의 목적 : &lt;span style=&quot;color: #404040;&quot;&gt;SELECT 쿼리의 WHERE절이나 JOIN 예약어를 사용했을때만 인덱스를 사용되며 SELECT 쿼리의 검색 속도를 빠르게 하는데 목적을 두고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 칼럼을 색인화하여 데이터베이스 안의 레코드를 처음부터 풀스캔하지 않고, B+ Tree로 구성된 구조에서 Index 파일 검색으로 속도를 향상시키는 기술이다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FRM : 테이블 구조 저장 파일&lt;/li&gt;
&lt;li&gt;MYD : 실제 데이터 파일&lt;/li&gt;
&lt;li&gt;MYI : Index 정보 파일 (Index 사용 시 생성)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 컬럼을 인덱스로 설정해 놓으면 SELECT를 할때 MYI파일의 내용을 검색한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스의 장점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상시킨다.&lt;/li&gt;
&lt;li&gt;질의나 보고서에서 그룹화 작업의 속도를 향상시킨다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>데이터베이스</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/42</guid>
      <comments>https://hose.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 18 May 2021 14:05:54 +0900</pubDate>
    </item>
    <item>
      <title>Transaction</title>
      <link>https://hose.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Transaction : 데이터베이스의 데이터를 조작하는 작업의 단위이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;transaction은 ACID원칙을 보장해야 한다.&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;Atomicity (원자성) : 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다. All or Nothing의 개념&lt;/li&gt;
&lt;li&gt;Consistency (일관성) : 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야 한다.&lt;/li&gt;
&lt;li&gt;Isolation (독립성) : 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는것을 말한다.&lt;/li&gt;
&lt;li&gt;Durability (영구성) : 성공적으로 수행된 트랜잭션은 영원히 반영되는것을 말한다.&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;Commit : 하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우, 트랜잭션의 시작상태로 롤 백 할 수 있음.&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;하지만 ACID 원칙은 종종 지켜지지 않는다. 원칙을 완벽하게 지키려 하면 동시성이 매우 떨어지기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 DB 엔진은 ACID 원칙을 희생하여 동시성을 얻을 수 있는 방법을 제공한다. 바로 transaction의 Isolation level이다. Isolation 원칙을 덜 지키는 level을 사용할수록 문제가 발생할 가능성은 커지지만 동시성은 얻을 수 있다.&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;&lt;b&gt;&lt;span&gt;1. Dirty Read&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 데이터 캐시에는 변경이 되었지만, 디스크에는 변경되지 않은 데이터를 Dirty Page라하고, 이를 읽는 작업을 Dirty Read&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;2. Non-Repeatable Read&lt;/span&gt;&lt;/b&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;b&gt;&lt;span&gt;3. Phantom Read&lt;/span&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션 격리 Level&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;1. Read Uncommitted&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜잭션이 완료(Commit)되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용&lt;/li&gt;
&lt;li&gt;해당 데이터를 SELECT할 경우 Shared-Lock이 걸리지 않는다.&lt;/li&gt;
&lt;li&gt;발생할 수 있는 격리성 문제 : Dirty Read, Non-repeatable Read, Phantom Read&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;&lt;b&gt;&lt;span&gt;2. Read Committed&lt;/span&gt;&lt;/b&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;/li&gt;
&lt;li&gt;해당 데이터를 SELECT할 경우 Shared-Lock 이 적용된다.&lt;/li&gt;
&lt;li&gt;SELECT가 끝날때까지만 Shared-Lock이 적용된다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;발생할 수 있는 격리성 문제 : Non-repeatable Read, Phantom Read&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;&lt;b&gt;&lt;span&gt;3. Repeatable Read&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랜잭션이 완료되기 전까지 Shared-Lock을 적용하여 다른 트랜잭션에서 해당 데이터를 읽을 수 없다.&lt;/li&gt;
&lt;li&gt;따라서 트랜잭션이 완료 되기 전까지 일관된 데이터가 보장된다. (Non-Repeatable Read 예방)&lt;/li&gt;
&lt;li&gt;Shared-Lock이 해제 되기 전에도 다른 트랜잭션에서 새로운 데이터를 삽입하는 것은 가능하기때문에 Phantom Read는 발생할 수 있다.&lt;/li&gt;
&lt;li&gt;발생할 수 있는 격리성 문제 : Phantom Read&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;4. Serializable&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Shared-Lock이 범위(Range) 단위로 적용되고, 트랜잭션이 완료된 이후에 해제가 된다.&lt;/li&gt;
&lt;li&gt;범위 단위의 Lock 덕분에 Phantom Read까지 예방할 수 있다.&lt;/li&gt;
&lt;li&gt;발생할 수 있는 격리성 문제 : 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;출처:&amp;nbsp;&lt;a href=&quot;https://s1107.tistory.com/45&quot;&gt;https://s1107.tistory.com/45&lt;/a&gt;&amp;nbsp;[개발자]&lt;/p&gt;</description>
      <category>데이터베이스</category>
      <author>명품호세</author>
      <guid isPermaLink="true">https://hose.tistory.com/41</guid>
      <comments>https://hose.tistory.com/41#entry41comment</comments>
      <pubDate>Mon, 17 May 2021 22:02:53 +0900</pubDate>
    </item>
  </channel>
</rss>