<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>프로찍먹러</title>
    <link>https://llshl.tistory.com/</link>
    <description>개발+기타등등 아무거나 정리하는 공간</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 06:34:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>llshl</managingEditor>
    <image>
      <title>프로찍먹러</title>
      <url>https://tistory1.daumcdn.net/tistory/4786279/attach/847245d15fb64d409992f70e1042646e</url>
      <link>https://llshl.tistory.com</link>
    </image>
    <item>
      <title>[WebClient] Connection reset by peer 에러</title>
      <link>https://llshl.tistory.com/118</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;상황&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청을 받으면 외부 기관의 API를 호출하여 그대로 반환해주는 내부 API가 있음&lt;/li&gt;
&lt;li&gt;해당 API를 호출할 때 간헐적으로 다음의 500에러가 발생함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1740315982420&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...

Connection reset by peer

...&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;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주로 한참동안 호출하지 않다가 오랜만에 호출할 경우 1회 발생하고, 이후의 요청부터는 정상동작했음&lt;/li&gt;
&lt;li&gt;혹은 서버배포 후 최초 1회 호출시 발생함&lt;/li&gt;
&lt;li&gt;Spring Webflux는 사용하지 않았지만 외부 통신용으로 Webclient를 사용중이었음&lt;/li&gt;
&lt;li&gt;Webclient는 HTTP요청을 보내기 위한 도구이며 비동기적으로 구현할 수 있다는 특징이 있음&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;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Webclient를 사용해서 외부에 요청을 보낼때, Client(우리서버)가 요청을 보냈는데 Server(외부 기관)쪽에서 연결이 닫혔다고 다시 연결하라는 RST (Reset) 패킷을 보내는 경우에 이 에러가 발생한다(고한다)&lt;/li&gt;
&lt;li&gt;즉, 우리서버와 외부기관간의 연결이 한쪽만 연결되어있는 상태라는 의미&lt;/li&gt;
&lt;li&gt;즉즉, &lt;b&gt;&lt;u&gt;우리서버는 외부기관과 연결이 돼있는줄 알고있고, 외부기관은 이미 우리서버와 연결을 끊은 상태라는 것&lt;/u&gt;&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;그것은 아마 TCP 타임아웃 설정때문일 것이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP 프로토콜에서 두 주체는 통신 전 3way handshaking을 통해 연결을 맺는다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8VeSU/btsMsOTDOok/cjZpBmn88f7rXOFTPkJoJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8VeSU/btsMsOTDOok/cjZpBmn88f7rXOFTPkJoJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8VeSU/btsMsOTDOok/cjZpBmn88f7rXOFTPkJoJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8VeSU%2FbtsMsOTDOok%2FcjZpBmn88f7rXOFTPkJoJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;431&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 연결이 맺어졌지만 한 쪽이 갑자기 묵묵무답이 될 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 계속 연결을 유지하는것은 자원의 낭비이기에 연결이 끊어진다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;클라이언트 입장에서의 Connection Timeout&lt;/h3&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;따라서 요청에 대한 응답이 안오면 몇번의 retry후 연결을 끊는다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서버&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;입장에서의 Connection Timeout&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버는 자신과 연결되어있는(tcp 3way handshake를 맺은) 클라이언트들을 굳이 알 필요 없다&lt;/li&gt;
&lt;li&gt;하지만 너무 많은 클라이언트들과 연결되어있으면 서버의 커넥션풀의 낭비가 되기에 적절한 본인의 Connection Timeout에 따라 클라이언트들과 연결을 끊어준다&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내가 겪은 에러의 경우&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;따라서 외부기관 입장에서 우리서버는 Connection Timeout에 걸리는 불필요한 리소스였고, 요청이 한동안 뜸할때마다 외부기관은 우리서버와의 커넥션을 계속 끊었던 것&lt;/li&gt;
&lt;li&gt;근데 오랜만에 우리서버의 요청이 발생하면 우리서버는 외부기관이 연결을 끊은것도 모르고 HTTP 요청을 보냄&lt;/li&gt;
&lt;li&gt;근데 연결은 끊겨있기에 500에러가 1회 발생하고, 그 요청을 통해서 즉각 re-connection이 이루어졌기에 이후 요청들은 정상동작했음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;u&gt;따라서 대상 서버가 연결을 끊을때 마다 우리서버도 연결을 끊게해줘야했음&lt;/u&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;u&gt;&lt;b&gt;우리 서버도 연결을 종료할 수 있도록 유휴시간을 설정해주면 된다&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;외부기관의 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Connection Timeout을 알 수 있다면 그것보다 조금 더 빠르게 연결이 끊기도록 &lt;b&gt;&lt;u&gt;maxIdleTime(유휴시간)&lt;/u&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;을 해주면 됨&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;예를들어 외부기관의 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Connection Timeout이 180초라면 우리서버는 179초정도로 해서 우리서버의 연결이 먼저 끊기도록&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;우리서버는 요청을 보낼때 연결이 끊겨있다면 re connection 과정을 먼저 할 수 있기에 Connection reset by peer가 발생하지 않는다&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;만약 외부기관의 Connection Timeout을 모른다고 우리서버의 maxIdleTIme을 매우 짧게 설정한다면 우리 서버는 툭하면 연결을 끊게되고, 연결을 새로 맺는 횟수가 늘어나게되고, 이는 서버 자원을 많이 사용하게 되는 것&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;다른 해결 방법은 이 &lt;a href=&quot;https://velog.io/@youngerjesus/Connection-Reset-by-Peer-%EB%AC%B8%EC%A0%9C-%ED%95%B4%EA%B2%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;블로그&lt;/a&gt;에 나와있으나 나는 그냥 &lt;u&gt;&lt;b&gt;우리서버의 &lt;b&gt;&lt;u&gt;maxIdleTime&lt;/u&gt;&lt;/b&gt;을 적당히 짧게 설정해주었다&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;그러고나니 에러 발생하지 않음&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1740315956368&quot; class=&quot;kotlin&quot; data-ke-language=&quot;kotlin&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    private fun defaultWebClient(): ReactorClientHttpConnector {
        val provider = ConnectionProvider.builder(&quot;custom&quot;)
            .maxIdleTime(Duration.ofSeconds(30)) // 요거 추가해줌
            .build()

        val httpClient = HttpClient.create(provider)
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, TimeUnit.SECONDS.toMillis(TIMEOUT_SEC).toInt())
            .responseTimeout(Duration.ofSeconds(TIMEOUT_SEC))
            .doOnConnected { conn -&amp;gt;
                conn.addHandlerLast(ReadTimeoutHandler(TIMEOUT_SEC, TimeUnit.SECONDS))
                    .addHandlerLast(WriteTimeoutHandler(TIMEOUT_SEC, TimeUnit.SECONDS))
            }

        return ReactorClientHttpConnector(httpClient)
    }&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devpanpan.tistory.com/118&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devpanpan.tistory.com/118&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740315917502&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;TCP/HTTP 타임아웃(Timeout), 이 글 하나로 개념 완전 정복&quot; data-og-description=&quot;개요클라이언트와 서버 간 통신 과정에서, 어떠한 이유로든 둘 중 하나가 제 기능을 할 수 없게 되는 일이 종종 발생한다. 그러나 한 쪽의 무응답으로 인해 다른 한 쪽이 영영 응답을 대기할 수&quot; data-og-host=&quot;devpanpan.tistory.com&quot; data-og-source-url=&quot;https://devpanpan.tistory.com/118&quot; data-og-url=&quot;https://devpanpan.tistory.com/118&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bki4Bi/hyYjwMwKZg/BVr57dOUKgaTsUDUmlcZPK/img.png?width=600&amp;amp;height=552&amp;amp;face=0_0_600_552,https://scrap.kakaocdn.net/dn/YeKIR/hyYjxdn84c/RjkssiNksxKn8k3aNpDOak/img.png?width=600&amp;amp;height=552&amp;amp;face=0_0_600_552,https://scrap.kakaocdn.net/dn/EJ6py/hyYjyXMEd6/5Wj9nvX6E6VjnuebXFp7zK/img.png?width=600&amp;amp;height=552&amp;amp;face=0_0_600_552&quot;&gt;&lt;a href=&quot;https://devpanpan.tistory.com/118&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devpanpan.tistory.com/118&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bki4Bi/hyYjwMwKZg/BVr57dOUKgaTsUDUmlcZPK/img.png?width=600&amp;amp;height=552&amp;amp;face=0_0_600_552,https://scrap.kakaocdn.net/dn/YeKIR/hyYjxdn84c/RjkssiNksxKn8k3aNpDOak/img.png?width=600&amp;amp;height=552&amp;amp;face=0_0_600_552,https://scrap.kakaocdn.net/dn/EJ6py/hyYjyXMEd6/5Wj9nvX6E6VjnuebXFp7zK/img.png?width=600&amp;amp;height=552&amp;amp;face=0_0_600_552');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;TCP/HTTP 타임아웃(Timeout), 이 글 하나로 개념 완전 정복&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개요클라이언트와 서버 간 통신 과정에서, 어떠한 이유로든 둘 중 하나가 제 기능을 할 수 없게 되는 일이 종종 발생한다. 그러나 한 쪽의 무응답으로 인해 다른 한 쪽이 영영 응답을 대기할 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devpanpan.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yangbongsoo.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yangbongsoo.tistory.com/30&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740316222069&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Webclient Timeout 과 connection pool 전략&quot; data-og-description=&quot;1) Webclient timeout 아래 코드를 보자. 다양한 timeout 옵션들이 있다. new ReactorClientHttpConnector( reactorResourceFactory, httpClient -&amp;gt; httpClient .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .doOnConnected(connection -&amp;gt; connectio&quot; data-og-host=&quot;yangbongsoo.tistory.com&quot; data-og-source-url=&quot;https://yangbongsoo.tistory.com/30&quot; data-og-url=&quot;https://yangbongsoo.tistory.com/30&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tUosE/hyYjpfw3Bg/cdpnu5foMJUlGim21jy5r1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/JLG3u/hyYjKDSARk/wNpO5DKZy9DrVDyOjIkIgK/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552&quot;&gt;&lt;a href=&quot;https://yangbongsoo.tistory.com/30&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yangbongsoo.tistory.com/30&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tUosE/hyYjpfw3Bg/cdpnu5foMJUlGim21jy5r1/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552,https://scrap.kakaocdn.net/dn/JLG3u/hyYjKDSARk/wNpO5DKZy9DrVDyOjIkIgK/img.png?width=800&amp;amp;height=552&amp;amp;face=0_0_800_552');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Webclient Timeout 과 connection pool 전략&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1) Webclient timeout 아래 코드를 보자. 다양한 timeout 옵션들이 있다. new ReactorClientHttpConnector( reactorResourceFactory, httpClient -&amp;gt; httpClient .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .doOnConnected(connection -&amp;gt; connectio&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yangbongsoo.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>삽질</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/118</guid>
      <comments>https://llshl.tistory.com/118#entry118comment</comments>
      <pubDate>Sun, 23 Feb 2025 22:06:56 +0900</pubDate>
    </item>
    <item>
      <title>함께 자라기 : 애자일로 가는 길</title>
      <link>https://llshl.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-180413.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xgbvW/btsLKabXS6i/ePXqUke1KnmFhSXZzfqC21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xgbvW/btsLKabXS6i/ePXqUke1KnmFhSXZzfqC21/img.png&quot; data-alt=&quot;를 읽고 나눠보면 좋은걸들 정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xgbvW/btsLKabXS6i/ePXqUke1KnmFhSXZzfqC21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxgbvW%2FbtsLKabXS6i%2FePXqUke1KnmFhSXZzfqC21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;475&quot; height=&quot;633&quot; data-filename=&quot;image-20241215-180413.png&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;를 읽고 나눠보면 좋은걸들 정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 id=&quot;목차&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;27&quot;&gt;목차&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;/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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1 id=&quot;자라기&quot; style=&quot;color: #000000;&quot; data-renderer-start-pos=&quot;60&quot;&gt;자라기&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id=&quot;당신은-몇-년차?&quot; style=&quot;color: #000000;&quot; data-renderer-start-pos=&quot;65&quot; data-ke-size=&quot;size26&quot;&gt;당신은 몇 년차?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-180404.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKjPzh/btsLKbu5nsr/w21uttucrs7xPnRaZm23jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKjPzh/btsLKbu5nsr/w21uttucrs7xPnRaZm23jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKjPzh/btsLKbu5nsr/w21uttucrs7xPnRaZm23jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKjPzh%2FbtsLKbu5nsr%2Fw21uttucrs7xPnRaZm23jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;294&quot; data-filename=&quot;image-20241215-180404.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-renderer-start-pos=&quot;76&quot; data-node-type=&quot;mediaSingle&quot; data-width-type=&quot;pixel&quot; data-width=&quot;450&quot; data-layout=&quot;align-start&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-context-id=&quot;4195746657&quot; data-renderer-start-pos=&quot;77&quot; data-alt=&quot;image-20241215-180404.png&quot; data-file-mime-type=&quot;image/png&quot; data-file-size=&quot;206237&quot; data-file-name=&quot;image-20241215-180404.png&quot; data-collection=&quot;contentId-4195746657&quot; data-id=&quot;45db40fc-69d6-461f-ac6b-4fc9c788d236&quot; data-height=&quot;147&quot; data-width=&quot;309&quot; data-node-type=&quot;media&quot; data-type=&quot;file&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-context-id=&quot;4195746657&quot; data-renderer-start-pos=&quot;77&quot; data-alt=&quot;image-20241215-180404.png&quot; data-file-mime-type=&quot;image/png&quot; data-file-size=&quot;206237&quot; data-file-name=&quot;image-20241215-180404.png&quot; data-collection=&quot;contentId-4195746657&quot; data-id=&quot;45db40fc-69d6-461f-ac6b-4fc9c788d236&quot; data-height=&quot;147&quot; data-width=&quot;309&quot; data-node-type=&quot;media&quot; data-type=&quot;file&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-context-id=&quot;4195746657&quot; data-renderer-start-pos=&quot;77&quot; data-alt=&quot;image-20241215-180404.png&quot; data-file-mime-type=&quot;image/png&quot; data-file-size=&quot;206237&quot; data-file-name=&quot;image-20241215-180404.png&quot; data-collection=&quot;contentId-4195746657&quot; data-id=&quot;45db40fc-69d6-461f-ac6b-4fc9c788d236&quot; data-height=&quot;147&quot; data-width=&quot;309&quot; data-node-type=&quot;media&quot; data-type=&quot;file&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;92&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;무엇이-소프트웨어-기술자의-등급을-판가름할까?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;92&quot; data-ke-size=&quot;size23&quot;&gt;무엇이 소프트웨어 기술자의 등급을 판가름할까?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한국소프트웨어산업협회에서는 [학력 + 경력 + 자격]을 본다&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-184630.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Vjl5/btsLJfLLvWt/tru82IpDwJPxIRONuarlr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Vjl5/btsLJfLLvWt/tru82IpDwJPxIRONuarlr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Vjl5/btsLJfLLvWt/tru82IpDwJPxIRONuarlr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Vjl5%2FbtsLJfLLvWt%2Ftru82IpDwJPxIRONuarlr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;693&quot; data-filename=&quot;image-20241215-184630.png&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;163&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;경험이-길수록-잘하는-개발자일까?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;163&quot; data-ke-size=&quot;size23&quot;&gt;경험이 길수록 잘하는 개발자일까?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;230&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;그렇다면-직원을-뽑을때-무엇을-기준으로-그-사람의-실력을-예측할-수-있을까?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;232&quot; data-ke-size=&quot;size23&quot;&gt;그렇다면 직원을 뽑을때 무엇을 기준으로 그 사람의 실력을 예측할 수 있을까?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;존 헌터와 프랭크 슈미트의 연구
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;채용시 가장 효과적인 예측변수가 무엇인지?&lt;/li&gt;
&lt;li&gt;= 즉, 사람을 뽑을때 무엇을 봐야 잘 뽑았다 소문이 나는지에 대한 연구&lt;/li&gt;
&lt;li&gt;= 채용시 선발 여부를 고려하는 변수와 직무 성과라는 변수간에 &lt;b&gt;상관성&lt;/b&gt;에 대한 연구&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;423&quot; data-ke-size=&quot;size16&quot;&gt;상관성이란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나가 변하면 다른 하나가 변하는지 안변하는지
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예를들어
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;3&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;/li&gt;
&lt;li&gt;상관성 지표는 다음과 같이 해석할 수 있다
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;0.5 이상 - 높은 상관성&lt;/li&gt;
&lt;li&gt;0.2 ~ 0.5 - 중간 상관성&lt;/li&gt;
&lt;li&gt;0.2 이하 - 약한 상관성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;627&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;629&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;연구결과&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;629&quot; data-ke-size=&quot;size23&quot;&gt;연구결과&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;635&quot; data-ke-size=&quot;size16&quot;&gt;우리가 높을것이라 예상했던 예측변수의 상관성&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연차 - 0.18&lt;/li&gt;
&lt;li&gt;학력 - 0.10&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;689&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;691&quot; data-ke-size=&quot;size16&quot;&gt;상관성이 높았던 예측변수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 샘플 테스트 - 0.54(채용 후 할 작업의 일부를 테스트하는것(과제전형느낌))&lt;/li&gt;
&lt;li&gt;지능테스트(아이큐테스트같은거) - 0.51&lt;/li&gt;
&lt;li&gt;성실성, 꼼꼼함 - 0.41&lt;/li&gt;
&lt;li&gt;레퍼런스 체크 - 0.26&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;823&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;825&quot; data-ke-size=&quot;size16&quot;&gt;상관성이 매우 낮았던 것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나이 - 0.02&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;855&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;857&quot; data-ke-size=&quot;size16&quot;&gt;저자의 제안&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행동중심의 구조화된 인터뷰
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예를들어
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;3&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;/li&gt;
&lt;li&gt;작업 샘플 테스트 (과제전형)&lt;/li&gt;
&lt;li&gt;짧은기간 같이 일해보기 (수습기간)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1007&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1009&quot; data-ke-size=&quot;size16&quot;&gt;잘뽑는것보다 중요한것&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미 뽑은 사람을 어떻게 할 것인지
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;흔히들 채용에는 신경쓰지만 이후의 교육, 훈련은 고민하지 않는다&lt;/li&gt;
&lt;li&gt;마치, 운동기구를 사놓고 운동하지 않는 것&lt;/li&gt;
&lt;li&gt;전문성 관리를 개인에게만 맡긴 후 회사는 손을 떼고 하위10%는 해고하는것은 회사에게나 개인에게나 손해다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1177&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1179&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1181&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;1만시간의-법칙?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1181&quot; data-ke-size=&quot;size26&quot;&gt;1만시간의 법칙?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-181514.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l4Dtm/btsLJgRrpn8/SQlPKlAlJf5sIR4YgHXD8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l4Dtm/btsLJgRrpn8/SQlPKlAlJf5sIR4YgHXD8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l4Dtm/btsLJgRrpn8/SQlPKlAlJf5sIR4YgHXD8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl4Dtm%2FbtsLJgRrpn8%2FSQlPKlAlJf5sIR4YgHXD8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;317&quot; data-filename=&quot;image-20241215-181514.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 분야의 전문가가 되려면 1만시간의 투자가 필요하다&lt;/li&gt;
&lt;li&gt;내 경력이 6년이고, 야근도 좀 했고, 계산해보면 1만시간이 넘었는데? 싶지만 이건 잘못된 계산이다
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;우리는 어릴때부터 하루에 3번씩 이를 닦지만 우리는 이닦기의 고수라고 말 하지 못한다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;중요한 것은 &lt;b&gt;의도적 수련&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;악기 연주자들에게 공연은 의도적 수련이 되지 못한다&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개인기량 향상을 목적으로 하는 애쓰는 수련이 의도적 수련&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1429&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1431&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 계산하면 터무니없이 많은 시간이 필요하게됨&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하지만 우리는 &lt;b&gt;업무를 하면서도 의도적 수련을 할 수 있음&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;애자일 철학을 활용하는 것이다&lt;/li&gt;
&lt;li&gt;실수를 교정할 기회가 있는것 + 피드백을 짧게 가져가는것
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;골프 퍼팅연습을 하는데 공이 어디로가는지 보지않고 공만 친다? &amp;rarr; 교정기회 x&lt;/li&gt;
&lt;li&gt;퍼팅의 결과를 1년뒤에 피드백해준다면 기억이 날까? &amp;ldquo;당신이 작년 이맘때 쳤던 공은 들어갔습니다&amp;rdquo; &amp;rarr; 피드백 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1670&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1672&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1672&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1672&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;당신이-제자리걸음인-이유&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1674&quot; data-ke-size=&quot;size26&quot;&gt;당신이 제자리걸음인 이유&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실력을 높이기 위해서는 &lt;b&gt;의도적 수련&lt;/b&gt;이 중요한데, &lt;b&gt;실력과 작업의 난이도가 비슷해야 한다&lt;/b&gt;.
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;작업 난이도가 너무 낮으면 지루함을,&lt;/li&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 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1962&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1964&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1966&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 id=&quot;이소룡의-이야기&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;1966&quot; data-ke-size=&quot;size26&quot;&gt;이소룡의 이야기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-182116.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSuFU3/btsLKLbx0w5/cqLkhFBNPoJl4P1xcXJOTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSuFU3/btsLKLbx0w5/cqLkhFBNPoJl4P1xcXJOTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSuFU3/btsLKLbx0w5/cqLkhFBNPoJl4P1xcXJOTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSuFU3%2FbtsLKLbx0w5%2FcqLkhFBNPoJl4P1xcXJOTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;366&quot; height=&quot;715&quot; data-filename=&quot;image-20241215-182116.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;715&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이소룡에게 의도적 수련을 배울 수 있는 한 가지 이야기가 있다
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;전통무술을 하던 사람이 이소룡에게 도전을 하러옴&lt;/li&gt;
&lt;li&gt;이소룡은 그를 3분만에 쓰러트렸음&lt;/li&gt;
&lt;li&gt;하지만 이소룡은 3분이 되기전에 그를 쓰러트리지 못한것에 화가 났음&lt;/li&gt;
&lt;li&gt;원본: &lt;a href=&quot;https://www.youtube.com/watch?v=OotAYyK08Ro&amp;amp;t=2419s&amp;amp;ab_channel=THEHistoryChannel&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=OotAYyK08Ro&amp;amp;t=2419s&amp;amp;ab_channel=THEHistoryChannel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=OotAYyK08Ro&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/h1z6L/hyX0uVDaFX/RQ0ZKko8EJMg8xEW6mNnz1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=292_124_377_217,https://scrap.kakaocdn.net/dn/cv1h8E/hyXWA4ggTf/scx3UaqeJ8pu8kgNs7MtS1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=292_124_377_217&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;How Bruce Lee Changed the World (2009)&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/OotAYyK08Ro&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2140&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;의도적-수련&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2140&quot; data-ke-size=&quot;size26&quot;&gt;의도적 수련&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의도적 수련을 위해서는 나의 실력과 작업 난이도가 비슷해야한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-182317.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RhvWB/btsLKrqZ6XX/kwGaEezA6wNkL6U0aAVuLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RhvWB/btsLKrqZ6XX/kwGaEezA6wNkL6U0aAVuLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RhvWB/btsLKrqZ6XX/kwGaEezA6wNkL6U0aAVuLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRhvWB%2FbtsLKrqZ6XX%2FkwGaEezA6wNkL6U0aAVuLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;317&quot; data-filename=&quot;image-20241215-182317.png&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-182341.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oXXVX/btsLJhQhurA/5BWEU1wlYHfWS2o2NS6kqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oXXVX/btsLJhQhurA/5BWEU1wlYHfWS2o2NS6kqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oXXVX/btsLJhQhurA/5BWEU1wlYHfWS2o2NS6kqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoXXVX%2FbtsLJhQhurA%2F5BWEU1wlYHfWS2o2NS6kqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;311&quot; data-filename=&quot;image-20241215-182341.png&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2283&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2285&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;의도적-수련을-위해-몰입으로-가는-4가지-방법&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2285&quot; data-ke-size=&quot;size26&quot;&gt;의도적 수련을 위해 몰입으로 가는 4가지 방법&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 id=&quot;지루함을-느낄때-a1---실력-낮추기&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2312&quot; data-ke-size=&quot;size23&quot;&gt;지루함을 느낄때 a1 - 실력 낮추기&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;/li&gt;
&lt;li&gt;개발자라면, 보조도구 사용하지 않기(데이터그립같은거..?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2419&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;지루함을-느낄때-a2---난이도-높이기&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2421&quot; data-ke-size=&quot;size23&quot;&gt;지루함을 느낄때 a2 - 난이도 높이기&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이소룡의 경우, 3분안에 적을 쓰러트리기&lt;/li&gt;
&lt;li&gt;개발자라면 하루분량의 작업을 한시간안에 하기&lt;/li&gt;
&lt;li&gt;tps 개선하기&lt;/li&gt;
&lt;li&gt;코드리뷰 코멘트 평소보다 더 달기&lt;/li&gt;
&lt;li&gt;혹은 당장 안해도 되는 옵셔널한 일 하기
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;리팩토링하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2572&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;불안함을-느낄때-b1---난이도-낮추기&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2574&quot; data-ke-size=&quot;size23&quot;&gt;불안함을 느낄때 b1 - 난이도 낮추기&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신의 맡은일에서 핵심 기능만 구현한 아기버전 만들기 0.0.1&lt;/li&gt;
&lt;li&gt;테트리스 만들기가 어렵다면, 화면에 네모 하나만 그려보기
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자료구조나 회전알고리즘따위를 알고나서 구현하는게 아니다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2709&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;불안함을-느낄때-b2---실력-높이기&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2711&quot; data-ke-size=&quot;size23&quot;&gt;불안함을 느낄때 b2 - 실력 높이기&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;/li&gt;
&lt;li&gt;이전에 비슷했던 일을 했던 경험을 떠올려보기&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2813&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;의도적-수련을-위해-팀장이-할-수-있는-일&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2815&quot; data-ke-size=&quot;size26&quot;&gt;의도적 수련을 위해 팀장이 할 수 있는 일&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;몰입 영역 밖으로 몰아내는 행동을 하지않는다
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&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 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2973&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2975&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2977&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2977&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1 id=&quot;함께&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2980&quot;&gt;함께&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id=&quot;소프트웨어-개발-비용을-차지하는-4가지-요소&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;2984&quot; data-ke-size=&quot;size26&quot;&gt;소프트웨어 개발 비용을 차지하는 4가지 요소&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3010&quot; data-ke-size=&quot;size16&quot;&gt;품질 전문가 제럴드 와인버그가 쓴 책 Quality Software Management에서는 소프트웨어 개발 비용을 차지하는 4요소로 다음 것들을 정함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;/li&gt;
&lt;li&gt;관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3123&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;이-중-무엇이-가장-큰-요소일까?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3125&quot; data-ke-size=&quot;size23&quot;&gt;이 중 무엇이 가장 큰 요소일까?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모 대기업에서 설문조사한 결과&lt;/li&gt;
&lt;li&gt;[관리 &amp;rarr; 시스템 &amp;rarr; 사람 &amp;rarr; 도구] 순이었다&lt;/li&gt;
&lt;li&gt;하지만 보통 관리자들이 선호하는 개선순위는 역순이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-182917.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYWJo5/btsLKa31Vhl/69G3hG3s1ncHv5OVSBayb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYWJo5/btsLKa31Vhl/69G3hG3s1ncHv5OVSBayb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYWJo5/btsLKa31Vhl/69G3hG3s1ncHv5OVSBayb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYWJo5%2FbtsLKa31Vhl%2F69G3hG3s1ncHv5OVSBayb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;411&quot; data-filename=&quot;image-20241215-182917.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3237&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;전문가팀이-실패하는-이유&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3237&quot; data-ke-size=&quot;size26&quot;&gt;전문가팀이 실패하는 이유&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뛰어난 사람을 뽑아놓으면 잘할거라는 막연한 기대&amp;hellip; 정말그럴까?&lt;/li&gt;
&lt;li&gt;가장 뛰어낫던 선수들만 뽑아서 만든 올스타팀은 성적이 그다지 좋지 않다(&lt;a style=&quot;color: #000000;&quot; href=&quot;https://namu.wiki/w/%EA%B0%88%EB%9D%BD%ED%8B%B0%EC%BD%94%EC%8A%A4&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;예시&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;스타들이 한명씩 팀에 추가될때마다 성적향상은 한계효용을 보이며 어느 수준을 지나면 음의 방향이 된다(팀의 성과를 깎아먹음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736622621716&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[슬램덩크] 북산은 어떻게 산왕공고를 이길 수 있었을까 : 강점 리더십/경영&quot; data-og-description=&quot;최근 3040 X세대의 추억을 소환하여 영화 '더 퍼스트 슬램덩크'가 열풍을 일으키고 있다. 필자도 옛추억을 소환하여 재미있게 다시 슬램덩크를 찾아보게 되었다. 그런데 10대 때는 느끼지 못했던 &quot; data-og-host=&quot;blog.tanagement.co.kr&quot; data-og-source-url=&quot;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&quot; data-og-url=&quot;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8ByRg/hyX0uORFW0/UKDkiZ5UOmNoM78azU83gK/img.jpg?width=774&amp;amp;height=543&amp;amp;face=244_43_405_307,https://scrap.kakaocdn.net/dn/dEdOjd/hyX0uVDapR/dsBhmGI2hZtocSuV6P5w11/img.jpg?width=774&amp;amp;height=543&amp;amp;face=244_43_405_307,https://scrap.kakaocdn.net/dn/NMc89/hyX0tvDLwr/kAdc7t6eVAcKh93x0X4NmK/img.png?width=592&amp;amp;height=879&amp;amp;face=76_105_230_540&quot;&gt;&lt;a href=&quot;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8ByRg/hyX0uORFW0/UKDkiZ5UOmNoM78azU83gK/img.jpg?width=774&amp;amp;height=543&amp;amp;face=244_43_405_307,https://scrap.kakaocdn.net/dn/dEdOjd/hyX0uVDapR/dsBhmGI2hZtocSuV6P5w11/img.jpg?width=774&amp;amp;height=543&amp;amp;face=244_43_405_307,https://scrap.kakaocdn.net/dn/NMc89/hyX0tvDLwr/kAdc7t6eVAcKh93x0X4NmK/img.png?width=592&amp;amp;height=879&amp;amp;face=76_105_230_540');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[슬램덩크] 북산은 어떻게 산왕공고를 이길 수 있었을까 : 강점 리더십/경영&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 3040 X세대의 추억을 소환하여 영화 '더 퍼스트 슬램덩크'가 열풍을 일으키고 있다. 필자도 옛추억을 소환하여 재미있게 다시 슬램덩크를 찾아보게 되었다. 그런데 10대 때는 느끼지 못했던&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.tanagement.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-card-url=&quot;https://blog.tanagement.co.kr/insight_management/?bmode=view&amp;amp;idx=14218037&quot; data-block-card=&quot;true&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #000000;&quot; data-testid=&quot;smart-block-resolved-view&quot; data-smart-link-container=&quot;true&quot;&gt;
&lt;div style=&quot;color: #000000;&quot; data-testid=&quot;smart-block-title-resolved-view&quot; data-smart-block=&quot;true&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&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;h3 id=&quot;이에대한-한-가지-실험&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3418&quot; data-ke-size=&quot;size23&quot;&gt;이에대한 한 가지 실험&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3432&quot; data-ke-size=&quot;size16&quot;&gt;두가지 팀으로 나눔&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3481&quot; data-ke-size=&quot;size16&quot;&gt;두가지 협력방법으로 나눔&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;45분의 실험중 10분간은 어떻게 협력할지 계획을 세우도록함 (개입)&lt;/li&gt;
&lt;li&gt;45분의 실험 전체에 대해서 아무런 개입을 하지 않음 (개입x)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3579&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3581&quot; data-ke-size=&quot;size16&quot;&gt;이런 상황에서 성과를 비교해보면 다음과 같다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-183128.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b12sHw/btsLLBsM3Dt/2KVA8w4aqyg70fPhSJxrs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b12sHw/btsLLBsM3Dt/2KVA8w4aqyg70fPhSJxrs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b12sHw/btsLLBsM3Dt/2KVA8w4aqyg70fPhSJxrs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb12sHw%2FbtsLLBsM3Dt%2F2KVA8w4aqyg70fPhSJxrs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;306&quot; data-filename=&quot;image-20241215-183128.png&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3581&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3581&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3581&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3581&quot; data-ke-size=&quot;size16&quot;&gt;주목할 부분은,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[협력한 비전문가팀]&lt;/b&gt;이 &lt;b&gt;[협력하지 않는 전문가팀]&lt;/b&gt; 보다 좋은 성과를 냈다는 것&lt;/li&gt;
&lt;li&gt;이유는 정보공유의 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3687&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3689&quot; data-ke-size=&quot;size16&quot;&gt;정리하자면&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3798&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3800&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3800&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3802&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;구글이-밝힌-탁월한-팀의-비밀&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;3804&quot; data-ke-size=&quot;size26&quot;&gt;구글이 밝힌 탁월한 팀의 비밀&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구글이 뛰어난 팀의 특징을 찾기위해 진행했던 프로젝트 &amp;ldquo;아리스토텔레스 프로젝트&amp;rdquo;&lt;/li&gt;
&lt;li&gt;연구결과 주목할 부분은
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;팀에 누가 있는지(전문가, 내향/외향인, 지능)보다 &lt;b&gt;팀원이 어떻게 상호작용하는지&lt;/b&gt;가 중요&lt;/li&gt;
&lt;li&gt;&lt;b&gt;심리적 안정감&lt;/b&gt;이 큰 영향을 준다&lt;/li&gt;
&lt;li&gt;팀 토론등 특별히 고안된 활동을 통해 심리적 안정감을 개선할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4005&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;심리적-안정감이란&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4007&quot; data-ke-size=&quot;size23&quot;&gt;심리적 안정감이란&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내 생각이나 의견, 질문, 걱정, 실수가 드러났을때 처벌받거나 놀림받지 않을것이라는 믿음&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4073&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;팀-토론과-같은-특별히-고안된-활동?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4075&quot; data-ke-size=&quot;size23&quot;&gt;팀 토론과 같은 특별히 고안된 활동?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토론 주제를 안전한 환경에서 이야기하게 해주는것 자체가 심리적 안전감을 높일 수 있는것&lt;/li&gt;
&lt;li&gt;관리자가 매일매일 팀원들과 같은 상호작용에서 변화가 필요함
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;일상적으로 일어나는 상호작용에는 변화가 없으면서 토론회같은 특별한 걸 한다고 하면 오히려 신뢰가 깎인다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4250&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4250&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4252&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;쾌속-학습팀&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4254&quot; data-ke-size=&quot;size26&quot;&gt;쾌속 학습팀&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4262&quot; data-ke-size=&quot;size16&quot;&gt;패러다임 전환, 죽느냐 사느냐&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PHP를 사용하던 회사에서 사장님이 컨퍼런스를 다녀오더니 갑자기 자바로 바꾸라고함&lt;/li&gt;
&lt;li&gt;어떤팀은 잘 바꿧지만 어떤팀은 잘 바꾸지 못했음&lt;/li&gt;
&lt;li&gt;왜일까?&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4369&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;하버드-비즈니스-리뷰에-심장수술에-대한-논문이-실렸음&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4371&quot; data-ke-size=&quot;size23&quot;&gt;하버드 비즈니스 리뷰에 심장수술에 대한 논문이 실렸음&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제목은 &amp;lt;팀 학습 속도 높이기&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-183351.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1FN96/btsLJxrSPR6/quLQ3lZUfz0rdOkw6UkCb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1FN96/btsLJxrSPR6/quLQ3lZUfz0rdOkw6UkCb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1FN96/btsLJxrSPR6/quLQ3lZUfz0rdOkw6UkCb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1FN96%2FbtsLJxrSPR6%2FquLQ3lZUfz0rdOkw6UkCb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;663&quot; height=&quot;329&quot; data-filename=&quot;image-20241215-183351.png&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 방식의 최신 수술방법 &amp;ldquo;최소 심습 수술법&amp;rdquo;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이를 도입한 두 병원을 비교함
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;실선은 첼시아 병원&lt;/li&gt;
&lt;li&gt;점선은 마운틴 메디컬 센터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;두 병원 다 처음 수술법을 도입했을때는 수술시간이 6시간이었음&lt;/li&gt;
&lt;li&gt;하지만 횟수가 반복되자 마운틴 메디컬 병원은 3시간으로 개선됨&lt;/li&gt;
&lt;li&gt;주목할점은
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;첼시아 병원의 리더는 저명한 심장외과의사&lt;/li&gt;
&lt;li&gt;마운틴 메디컬 센터의 리더는 경험이 부족한 젊은 외과의사&lt;/li&gt;
&lt;li&gt;즉, &lt;b&gt;리더의 기술적 깊이는 팀 학습속도에 영향을 크게 줄 수 없다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4701&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;리더가-팀-학습-속도에-미치는-영향&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4703&quot; data-ke-size=&quot;size23&quot;&gt;리더가 팀 학습 속도에 미치는 영향&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기술적으로 탁월한 리더보다다는 &lt;b&gt;학습 환경을 만들 수 있는 리더가 중요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4768&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;학습-환경의-차이&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4770&quot; data-ke-size=&quot;size23&quot;&gt;학습 환경의 차이&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마운틴 메디컬 센터는 팀원을 선발할때 업무수행 능력이 아니라
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;협력을 잘하는지,&lt;/li&gt;
&lt;li&gt;애매모호한 상황을 즐길수있는지,&lt;/li&gt;
&lt;li&gt;자신보다 지위가 높은 사람에게도 자신있게 의견을 말할수있는지를 봤다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;새로운 수술 방법을 도입할때 개개인이 새로운 기술을 획득하는것이라고 생각하지 않았고 &lt;b&gt;함께 일하는 새로운 방법을 만들어야한다고 생각했다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4978&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4980&quot; data-ke-size=&quot;size16&quot;&gt;다시 돌아와서,&lt;/p&gt;
&lt;h3 id=&quot;PHP에서-자바로-성공적으로-전환한-팀의-특징&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;4990&quot; data-ke-size=&quot;size23&quot;&gt;PHP에서 자바로 성공적으로 전환한 팀의 특징&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리더와 팀원들이 학슴에 대한 태도가 달랐다
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;같이 학습해야한다고 받아들임&lt;/li&gt;
&lt;li&gt;리더는 기회와 가능성, 큰 변화의 흐름에 동참하라는 중요성과 즐거움을 강조함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실패한 팀은
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&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 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5184&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5186&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5186&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5188&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;프로젝트-확률론&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5190&quot; data-ke-size=&quot;size26&quot;&gt;프로젝트 확률론&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;당신은 프로젝트 매니저다&lt;/li&gt;
&lt;li&gt;당신에겐 7명의 팀원이 있다&lt;/li&gt;
&lt;li&gt;당신은 기가막히게 맡은 일감을 정확히 7등분했다&lt;/li&gt;
&lt;li&gt;각각의 일감은 독립적이라 담당자들은 자신의 일만 잘 하면 된다&lt;/li&gt;
&lt;li&gt;당신의 팀원들에게 질문한다 &amp;ldquo;일정안에 끝낼 수 있나요?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;7명의 팀원들은 모두 똑같은 답변을 한다 &amp;ldquo;90% 확률로 끝낼수 있다&amp;rdquo;고&lt;/li&gt;
&lt;li&gt;그러면 이 프로젝트는 기간안에 끝날 수 있을까?
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;흔히 범하는 실수는 이 프로젝트의 성공률이 90%라고 착각하는 것이다&lt;/li&gt;
&lt;li&gt;프로젝트가 기간안에 끝날 확률은 90%가 아니다&lt;/li&gt;
&lt;li&gt;0.9의 7승인 0.48, 즉 48%가 나온다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5518&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5520&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;이러한-업무진행방식을-애자일하게-바꾼다면?&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5522&quot; data-ke-size=&quot;size23&quot;&gt;이러한 업무진행방식을 애자일하게 바꾼다면?&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5547&quot; data-ke-size=&quot;size16&quot;&gt;워드 커닝햄은 이렇게 말했다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;12가지 할일이 있고 12명의 개발자가 있다면&lt;/li&gt;
&lt;li&gt;1인 1일을 주는게 아니라&lt;/li&gt;
&lt;li&gt;12명에게 3가지 일을 준다&lt;/li&gt;
&lt;li&gt;3가지 일이 끝나면 다음 3가지 일을 준다&lt;/li&gt;
&lt;li&gt;왜냐?
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;유연하게 협력을 하게되며
&lt;ul style=&quot;list-style-type: disc;&quot; data-indent-level=&quot;3&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;ldquo;관심사의 섞임&amp;rdquo;이 일어나게되고 &lt;b&gt;정보를 빠르게 공유&lt;/b&gt;할 수 있게 된다&lt;/li&gt;
&lt;li&gt;빠른 정보 공유를 통해 &lt;b&gt;학습도 빠르게 가능&lt;/b&gt;하고,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;병목지점이 발생하면 내가 도와줄 수 있게된다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5786&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5788&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;애자일은-다음-성질이-있다&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5790&quot; data-ke-size=&quot;size23&quot;&gt;애자일은 다음 성질이 있다&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좋은 일에 대해서는 &amp;ldquo;그리고&amp;rdquo; 확률을 &amp;ldquo;또는&amp;rdquo; 확률로 바꾸고&lt;/li&gt;
&lt;li&gt;나쁜 일에 대해서는 &amp;ldquo;또는&amp;rdquo; 확률을 &amp;ldquo;그리고&amp;rdquo; 확률로 바꾸는 성질&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5885&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;5887&quot; data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 명이라도 좋은 통찰이 있었다면 공유를 해서 좋은 영향을 줄 수 있다(&amp;ldquo;또는&amp;rdquo; 확률)&lt;/li&gt;
&lt;li&gt;버그가 있더라도 모든사람이 버그를 발견하지 못해야만 구멍이 발생하도록 제한한다(&amp;ldquo;그리고&amp;rdquo; 확률)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6002&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6004&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6006&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6008&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1 id=&quot;애자일&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6011&quot;&gt;애자일&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;h2 id=&quot;애자일이란&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6016&quot; data-ke-size=&quot;size26&quot;&gt;애자일이란&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그래서 애자일이 뭔데?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-183832.png&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BQ3Kd/btsLKboiWpL/Fn48oXEDNCZ4AeOptuNMhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BQ3Kd/btsLKboiWpL/Fn48oXEDNCZ4AeOptuNMhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BQ3Kd/btsLKboiWpL/Fn48oXEDNCZ4AeOptuNMhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBQ3Kd%2FbtsLKboiWpL%2FFn48oXEDNCZ4AeOptuNMhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;241&quot; height=&quot;92&quot; data-filename=&quot;image-20241215-183832.png&quot; data-origin-width=&quot;241&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애자일은,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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;/li&gt;
&lt;li&gt;따라서 &lt;b&gt;애자일 방법론은 불확실성에도 유연하게 대처하기위해&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;다양한 사람으로부터&lt;/li&gt;
&lt;li&gt;짧은 주기로&lt;/li&gt;
&lt;li&gt;잦은 피드백을 받으며&lt;/li&gt;
&lt;li&gt;유연하게 개발하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이런 애자일 방법을 실천하기 위해서는 위에서 설명한
&lt;ul style=&quot;list-style-type: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;함께(협력) 자라기(학습)가 필요하다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6308&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6308&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6310&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;애자일을-애자일스럽게-도입하기&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6312&quot; data-ke-size=&quot;size26&quot;&gt;애자일을 애자일스럽게 도입하기&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&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: circle;&quot; data-indent-level=&quot;2&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;애자일은 불확실성을 대처하는 방법론&lt;/li&gt;
&lt;li&gt;근데 애자일을 도입할때 확실성 위에서 진행하려고해서 문제가 발생한다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #172b4d; text-align: left;&quot;&gt;애자일을 도입하려면 어떤것을 해야할지 명확하게 알려달라고한다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;하지만, 이것 자체가 애자일스럽지 않다&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot;&gt;사실 이 사람도 애자일하게 가자는 말을 하고싶었던것은 아닐까 싶다&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image-20241215-185757.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rTguL/btsLJsYq8ii/1LDVLxnwwKrMSH4WjikER0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rTguL/btsLJsYq8ii/1LDVLxnwwKrMSH4WjikER0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rTguL/btsLJsYq8ii/1LDVLxnwwKrMSH4WjikER0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrTguL%2FbtsLJsYq8ii%2F1LDVLxnwwKrMSH4WjikER0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;439&quot; data-filename=&quot;image-20241215-185757.png&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1736622672780&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;한국까지 조롱 이어지는 '펀쿨섹좌' 황당 발언들 | 중앙일보&quot; data-og-description=&quot;동어반복, 논점이탈, 순환논법 등의 화법 때문에 그의 발언을 '시'라고 부르며 조롱하는 사람들이 많습니다.&quot; data-og-host=&quot;www.joongang.co.kr&quot; data-og-source-url=&quot;https://www.joongang.co.kr/article/23780743&quot; data-og-url=&quot;https://www.joongang.co.kr/article/23780743&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b0wYsg/hyX0zJqImi/xtWeGyZksexxkZJNX0mFx0/img.jpg?width=486&amp;amp;height=254&amp;amp;face=189_90_279_188&quot;&gt;&lt;a href=&quot;https://www.joongang.co.kr/article/23780743&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.joongang.co.kr/article/23780743&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b0wYsg/hyX0zJqImi/xtWeGyZksexxkZJNX0mFx0/img.jpg?width=486&amp;amp;height=254&amp;amp;face=189_90_279_188');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;한국까지 조롱 이어지는 '펀쿨섹좌' 황당 발언들 | 중앙일보&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;동어반복, 논점이탈, 순환논법 등의 화법 때문에 그의 발언을 '시'라고 부르며 조롱하는 사람들이 많습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.joongang.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6592&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6592&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1 id=&quot;책의-한-줄-요약&quot; style=&quot;background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-renderer-start-pos=&quot;6592&quot;&gt;책의 한 줄 요약&lt;span&gt;&lt;span data-vc=&quot;icon-undefined&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #172b4d; text-align: start;&quot; data-indent-level=&quot;1&quot; data-ke-list-type=&quot;disc&quot;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기록</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/117</guid>
      <comments>https://llshl.tistory.com/117#entry117comment</comments>
      <pubDate>Sun, 12 Jan 2025 04:16:39 +0900</pubDate>
    </item>
    <item>
      <title>[Real MySQL] 인덱스</title>
      <link>https://llshl.tistory.com/116</link>
      <description>&lt;h1&gt;디스크 읽기 방식&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 성능 튜닝은 디스크 IO를 어떻게 줄이느냐가 관건&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;SSD &amp;rarr; 하드디스크와 비교해서 용량이 적으며 비싸지만 더 사용된다 왜? 랜덤IO가 빨라서&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;순차IO와 랜덤IO&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디스크 헤더가 안움직이고 한번에 읽는다 &amp;rarr; 순차IO&lt;/li&gt;
&lt;li&gt;헤더 이동없이 얼마나 많이 읽을 수 있는가 &amp;rarr; 디스크의 성능&lt;/li&gt;
&lt;li&gt;순차IO가 랜덤IO보다 항상 성능이 좋다 (약 3배정도)(SSD의 경우도 그렇다)&lt;/li&gt;
&lt;li&gt;so, 쿼리튜닝 == 랜덤IO를 줄인다&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;인덱스란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DBMS가 데이터베이스 테이블의 모든 데이터를 검색해 원하는 결과를 가져오려면 시간이 오래 걸린다.&lt;/li&gt;
&lt;li&gt;그래서 컬럼들의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 삼아 인덱스를 만들어두는 것&lt;/li&gt;
&lt;li&gt;DBMS의 인덱스는 컬럼의 값을 주어진 순서로 미리 정렬해서 보관한다.&lt;/li&gt;
&lt;li&gt;키밸류로 컬럼값과 레코드가 저장된 주소를 미리 저장해두는 자료구조&lt;/li&gt;
&lt;li&gt;INSERT, UPDATE, DELETE 성능을 포기하고 읽기 속도에 몰빵하는 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;인덱스 알고리즘&lt;/h1&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;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;B-Tree 인덱스&lt;/h1&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.35.17.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqvSpl/btsKp6axAMX/LElYpU0aO6y9KdxipYHJ5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqvSpl/btsKp6axAMX/LElYpU0aO6y9KdxipYHJ5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqvSpl/btsKp6axAMX/LElYpU0aO6y9KdxipYHJ5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqvSpl%2FbtsKp6axAMX%2FLElYpU0aO6y9KdxipYHJ5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1672&quot; height=&quot;1202&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.35.17.png&quot; data-origin-width=&quot;1672&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;B-Tree는 왜 빠른가?&lt;/h1&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;리프노드를 선형 탐색한다면 71이라는 값을 찾기위해 O(n)&lt;/li&gt;
&lt;li&gt;B-tree는 O(logN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.35.26.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzCTGB/btsKqrelsTb/UGSDVLjW6LD2QPc52n6xg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzCTGB/btsKqrelsTb/UGSDVLjW6LD2QPc52n6xg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzCTGB/btsKqrelsTb/UGSDVLjW6LD2QPc52n6xg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzCTGB%2FbtsKqrelsTb%2FUGSDVLjW6LD2QPc52n6xg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1682&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.35.26.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;B+Tree&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리프노드끼리 LinkedList형태로 연결됨&lt;/li&gt;
&lt;li&gt;하나의 노드에 더 많은 데이터를 담기에 트리의 높이가 낮아짐&lt;/li&gt;
&lt;li&gt;리프노드에 모든 데이터가 있기에 풀스캔시 리프노드의 LinkedList를 한번만 선형탐색하면 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.35.36.png&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FKxfW/btsKo7uFaTS/XHI0CtQ3RnsfYxLIpSSvO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FKxfW/btsKo7uFaTS/XHI0CtQ3RnsfYxLIpSSvO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FKxfW/btsKo7uFaTS/XHI0CtQ3RnsfYxLIpSSvO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFKxfW%2FbtsKo7uFaTS%2FXHI0CtQ3RnsfYxLIpSSvO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1780&quot; height=&quot;784&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.35.36.png&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;784&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;B-Tree 인덱스 사용에 영향을 미치는 요소&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인덱스 키 값의 크기&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;인덱스를 구성하는 키값의 크기가 커지면 디스크로부터 페이지를 읽는 횟수가 늘어난다 &amp;rarr; 느려진다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이노디비의 기본 페이지 크기는 16KB&lt;/li&gt;
&lt;li&gt;추가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;비트리의 깊이&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;인덱스 키 값이 커지면 하나의 인덱스 페이지에 더 적은 수의 키 값이 저장되고, 비트리의 깊이가 깊어짐 &amp;rarr; 더 많은 디스크 읽기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인덱스의 선택도(기수성)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선택도(Selectivity) or 기수성(Cardinality)&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;100개중에 유니크한게 10개라면 기수성은 10&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;선택도가 높다면 검색 대상이 줄어들기에 빠르다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT * FROM tb_city
WHERE country='KOREA' AND city='SEOUL';
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음과 같은 조건
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;tb_city 테이블에는 1만건의 데이터&lt;/li&gt;
&lt;li&gt;country 컬럼에만 인덱스&lt;/li&gt;
&lt;li&gt;country와 city 컬럼은 중복없다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;country 컬럼의 유니크 값이 10개일 때
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;country=&amp;rsquo;KOREA&amp;rsquo; 라는 조건으로 인덱스를 검색하면 1만 건의 데이터 중 1,000건(10,000 / 10)의 데이터가 일치할 것이라 예상할 수 있다.&lt;/li&gt;
&lt;li&gt;city=&amp;rsquo;SEOUL&amp;rsquo;인 레코드는 1건이므로 1,000건 중 999건이 불필요하게 읽히는 것으로 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;country 컬럼의 유니크 값이 1,000개일 때
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;country=&amp;rsquo;KOREA&amp;rsquo; 라는 조건으로 인덱스를 검색하면 1만 건의 데이터 중 10건(10,000 / 1,000)의 데이터가 일치할 것이라 예상할 수 있다.&lt;/li&gt;
&lt;li&gt;city=&amp;rsquo;SEOUL&amp;rsquo;인 레코드는 1건이므로 10건 중 9건이 불필요하게 읽히는 것으로 볼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;읽어야하는 레코드의 수&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인덱스로 읽어야하는 데이터가 전체 테이블 레코드의 20~25%를 넘어가면 보통 인덱스를 안쓰고 풀스캔
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예시로, 100만건중에 50만건을 읽는 쿼리가 있다면 인덱스 사용안하고 풀스캔&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;MySQL의 인덱스 사용방법&lt;/h1&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;루스 인덱스 스캔 (Loose)&lt;/li&gt;
&lt;li&gt;인덱스 스킵 스캔&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인덱스 레인지 스캔&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;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1730313390188&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM employees WHERE first.name BETWEEN 'Ebbe' AND 'Gad';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.36.06.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpF3w7/btsKrbu2p8e/L3S5cn2keGSv9FLKCH2QF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpF3w7/btsKrbu2p8e/L3S5cn2keGSv9FLKCH2QF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpF3w7/btsKrbu2p8e/L3S5cn2keGSv9FLKCH2QF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpF3w7%2FbtsKrbu2p8e%2FL3S5cn2keGSv9FLKCH2QF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;1004&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.36.06.png&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1004&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AAkxC/btsKq1lRV2k/Zchvo0HShm7HKsLuXPhEa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AAkxC/btsKq1lRV2k/Zchvo0HShm7HKsLuXPhEa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AAkxC/btsKq1lRV2k/Zchvo0HShm7HKsLuXPhEa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAAkxC%2FbtsKq1lRV2k%2FZchvo0HShm7HKsLuXPhEa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;890&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&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;루트노드 &amp;rarr; 브랜치노드 &amp;rarr; 리프노드를 거쳐 필요한 레코드의 시작점을 찾는다&lt;/li&gt;
&lt;li&gt;리프노드에서 Ebbe와 Gad를 찾았다면 그 사이를 스캔한다&lt;/li&gt;
&lt;li&gt;그 사이에 대해서는 실제 데이터 파일로 랜덤엑세스를 통해 가져오는 과정이 필요하다&lt;/li&gt;
&lt;li&gt;만약 &lt;b&gt;커버링 인덱스&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&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;customer_id에만 인덱스가 있다고 했을때&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;select *
from temp_ad_offset
where customer_id = 7;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.37.13.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmfCeh/btsKpiikBiQ/bY8rjHskoHkQyvyvHrjrOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmfCeh/btsKpiikBiQ/bY8rjHskoHkQyvyvHrjrOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmfCeh/btsKpiikBiQ/bY8rjHskoHkQyvyvHrjrOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmfCeh%2FbtsKpiikBiQ%2FbY8rjHskoHkQyvyvHrjrOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1046&quot; height=&quot;514&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.37.13.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;select customer_id
from temp_ad_offset
where customer_id = 7;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.37.27.png&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLAZmL/btsKq4bOVTj/TmHRIz164q4Hxe1p5ytQc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLAZmL/btsKq4bOVTj/TmHRIz164q4Hxe1p5ytQc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLAZmL/btsKq4bOVTj/TmHRIz164q4Hxe1p5ytQc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLAZmL%2FbtsKq4bOVTj%2FTmHRIz164q4Hxe1p5ytQc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1088&quot; height=&quot;682&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.37.27.png&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Extra 항목은 옵티마이저가 어떻게 동작하는지에 대해 알려주는 힌트 값&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Using filesort: Orderby처리가 인덱스를 사용하지 못할때&lt;/li&gt;
&lt;li&gt;Using index: 커버링 인덱스 사용할때&lt;/li&gt;
&lt;li&gt;Using temporary: 쿼리의 중간결과를 위해 임시테이블을 생성했을때&lt;/li&gt;
&lt;li&gt;Using index for skip scan: 인덱스 스킵 스캔 최적화를 한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://zzang9ha.tistory.com/436&quot;&gt;https://zzang9ha.tistory.com/436&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730313421504&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MySQL EXPLAIN 실행계획 마스터하기(feat. RealMySQL 8.0)&quot; data-og-description=&quot;  MySQL EXPLAIN 실행계획 마스터하기(feat. RealMySQL 8.0) 실행 계획(EXPLAIN) 이란? 대부분의 DBMS는 많은 데이터를 안전하고, 빠르게 저장 및 관리하는 것이 주목적이다. 이러한 목적을 달성하기 위해 사&quot; data-og-host=&quot;zzang9ha.tistory.com&quot; data-og-source-url=&quot;https://zzang9ha.tistory.com/436&quot; data-og-url=&quot;https://zzang9ha.tistory.com/436&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pAbB1/hyXsPL60BF/FnEVyo44Hy6yXrvcEGUYY0/img.png?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480,https://scrap.kakaocdn.net/dn/40VEy/hyXpBhHHNS/eFan1cVN5XmFFKLpYuIbH0/img.png?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480,https://scrap.kakaocdn.net/dn/PptB6/hyXs1TjrPo/OiqulrDyDT0fPegeCNQsJ0/img.png?width=2142&amp;amp;height=486&amp;amp;face=0_0_2142_486&quot;&gt;&lt;a href=&quot;https://zzang9ha.tistory.com/436&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://zzang9ha.tistory.com/436&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pAbB1/hyXsPL60BF/FnEVyo44Hy6yXrvcEGUYY0/img.png?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480,https://scrap.kakaocdn.net/dn/40VEy/hyXpBhHHNS/eFan1cVN5XmFFKLpYuIbH0/img.png?width=640&amp;amp;height=480&amp;amp;face=0_0_640_480,https://scrap.kakaocdn.net/dn/PptB6/hyXs1TjrPo/OiqulrDyDT0fPegeCNQsJ0/img.png?width=2142&amp;amp;height=486&amp;amp;face=0_0_2142_486');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MySQL EXPLAIN 실행계획 마스터하기(feat. RealMySQL 8.0)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  MySQL EXPLAIN 실행계획 마스터하기(feat. RealMySQL 8.0) 실행 계획(EXPLAIN) 이란? 대부분의 DBMS는 많은 데이터를 안전하고, 빠르게 저장 및 관리하는 것이 주목적이다. 이러한 목적을 달성하기 위해 사&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;zzang9ha.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인덱스 풀 스캔&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;(A, B, C) 라는 인덱스가 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM employees WHERE B = 'b' AND C = 'c';
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건절에 사용된 컬럼이 A를 포함하지 않기에 풀스캔 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.37.48.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;972&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9VZWi/btsKqNnQDDQ/VUuQPqe4rLDDkCFGXJKRjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9VZWi/btsKqNnQDDQ/VUuQPqe4rLDDkCFGXJKRjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9VZWi/btsKqNnQDDQ/VUuQPqe4rLDDkCFGXJKRjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9VZWi%2FbtsKqNnQDDQ%2FVUuQPqe4rLDDkCFGXJKRjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1364&quot; height=&quot;972&quot; data-filename=&quot;스크린샷 2024-10-31 오전 3.37.48.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;972&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;루스 인덱스 스캔&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;일반적으로 groupby나 max(), min() 함수에 대한 최적화로서 옵티마이저가 판단한다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인덱스 스킵 스캔&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL8.0부터 추가된 기능&lt;/li&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;where절에 포함되지않은 인덱스 컬럼의 유니크한 개수가 적어야함(A컬럼의 선택도가 낮아야함)&lt;/li&gt;
&lt;li&gt;그렇지 않다면 인덱스에서 스캔해야 할 시작지점을 검색하는 작업이 많아지며 오히려 더 느려진다&lt;/li&gt;
&lt;li&gt;커버링 인덱스를 사용할 수 있는 경우에만 스킵스캔이 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;멀티밸류 인덱스&lt;/h1&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;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;&amp;hellip;&lt;/li&gt;
&lt;/ul&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;where절에서 자주 사용되는 조건을 앞쪽으로&lt;/li&gt;
&lt;li&gt;join조건에서 자주 사용되는 조건을 앞쪽으로&lt;/li&gt;
&lt;li&gt;orderby절에서 자주 사용되는 조건을 앞쪽으로&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;인덱스 스캔 방향&lt;/h1&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;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;ORDER BY 처리나 MIN() 또는 MAX() 함수 등의 최적화가 필요한 경우 인덱스를 읽는 순서만 변경해서 인덱스 생성 시 지정한 정렬 규칙에 대한 문제점을 해결할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내림차순 인덱스는 느리다&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;li&gt;쿼리에서 자주 사용되는 정렬 순서대로 인덱스를 생성하는 것이 잠금 병목 현상을 줄이는 데 도움됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLYzLL/btsKp62Bz9V/WSBRRCRNemu1jLWIoLcTwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLYzLL/btsKp62Bz9V/WSBRRCRNemu1jLWIoLcTwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLYzLL/btsKp62Bz9V/WSBRRCRNemu1jLWIoLcTwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLYzLL%2FbtsKp62Bz9V%2FWSBRRCRNemu1jLWIoLcTwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;690&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;B-tree 인덱스의 가용성과 효율성&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;where조건이나 groupby, orderby절이 어떤 경우에 인덱스를 사용하는지 알아야함&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;비교 조건의 종류와 효율성&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM dept_emp
WHERE dept_no= 'd002' AND emp_no &amp;gt;= 10114 ;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1번: 인덱스가 (dept_no, emp_no)인 경우&lt;/li&gt;
&lt;li&gt;2번: 인덱스가 (emp_no, dept_no)인 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 케이스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dept_no가 &amp;lsquo;d002&amp;rsquo;이고 emp_no가 10114보다 큰 레코드를 찾는다.&lt;/li&gt;
&lt;li&gt;이후에는 dept_no가 &amp;lsquo;d002&amp;rsquo;가 아닐 때까지 인덱스를 쭉 읽기만 하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Zctq/btsKqXX6rRw/unQ9IaJdMtkQxjmMK1pPj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Zctq/btsKqXX6rRw/unQ9IaJdMtkQxjmMK1pPj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Zctq/btsKqXX6rRw/unQ9IaJdMtkQxjmMK1pPj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Zctq%2FbtsKqXX6rRw%2FunQ9IaJdMtkQxjmMK1pPj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;251&quot; height=&quot;1222&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;1222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 케이스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;emp_no가 10114 보다 큰 레코드이고 dept_no가 &amp;lsquo;d002&amp;rsquo;인 레코드를 찾는다.&lt;/li&gt;
&lt;li&gt;이후 찾은 모든 레코드에 dept_no가 &amp;lsquo;d002&amp;rsquo;인지 비교하는 작업을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5U7x6/btsKpmSGT12/CLh0x23jCNIhemAehT3YS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5U7x6/btsKpmSGT12/CLh0x23jCNIhemAehT3YS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5U7x6/btsKpmSGT12/CLh0x23jCNIhemAehT3YS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5U7x6%2FbtsKpmSGT12%2FCLh0x23jCNIhemAehT3YS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;552&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인덱스의 가용성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;B-Tree 인덱스의 특징은 왼쪽 값에 기준해서 오른쪽 값이 정렬돼 있다는 것이다.&lt;/li&gt;
&lt;li&gt;하나의 칼럼으로 검색해도 값의 왼쪽 부분이 없으면 인덱스 레인지 스캔 방식의 검색이 불가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM employees WHERE first_name LIKE '%mer1';
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 쿼리는 인덱스를 못탄다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;first_name 컬럼에 저장된 값의 왼쪽부터 비교해가며 일치하는 레코드를 찾아야 하는데,&lt;/li&gt;
&lt;li&gt;조건 값의 왼쪽 부분(&amp;rsquo;%mer1&amp;rsquo;)이 정해져 있지 &lt;b&gt;않기&lt;/b&gt; 때문이다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM dept_emp WHERE emp_no&amp;gt;=10144;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인덱스가 (dep_no, emp_no)로 생성되어 있다면 아래의 쿼리는 인덱스를 효율적으로 사용하지 못한다&lt;/li&gt;
&lt;li&gt;다중 컬럼 인덱스로 생성된 인덱스이므로 dept_no를 먼저 정렬한 후, 다시 emp_no 컬럼값으로 정렬돼 있기 때문 (랜덤IO)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;B-tree에서 인덱스를 효율적으로 사용하지 못하는 케이스&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NOT-EQUAL로 비교된 경우 (NOT IN, NOT BETWEEN, IS NOT NULL)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE column &amp;lt;&amp;gt; 'N'&lt;/li&gt;
&lt;li&gt;WHERE column NOT IN (10,11,12)&lt;/li&gt;
&lt;li&gt;WHERE column IS NOT NULL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LIKE %xxx 형태 문자열 패턴 비교인 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WHERE column LIKE '%test&amp;lsquo;&lt;/li&gt;
&lt;li&gt;WHERE column LIKE '%test%&amp;lsquo;&lt;/li&gt;
&lt;li&gt;WHERE column LIKE '_test&amp;lsquo;&lt;/li&gt;
&lt;/ul&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;WHERE SUBSTRING(column,1, 1) = 'X'&lt;/li&gt;
&lt;li&gt;WHERE DAYOFMONTH(column) = 1&lt;/li&gt;
&lt;/ul&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;WHERE char_column = 10 &amp;rarr; char를 int와 비교&lt;/li&gt;
&lt;/ul&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;WHERE utf8_bin_char_column = euckr_bin_char_column&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;클러스터링 인덱스&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;pk가 비슷한 레코드끼리 묶어서 인덱스로 저장한 것&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클러스터링 인덱스의 리프노드에는 모든 레코드의 컬럼이 저장되어있다&lt;/b&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;MySQL 서버에서 클러스터링은 테이블의 레코드를 비슷한 것을 기준으로 묶어서 저장하는 형태&lt;/li&gt;
&lt;li&gt;비슷한 것 = pk&lt;/li&gt;
&lt;li&gt;pk설정시 그 컬럼은 자동으로 클러스터링 인덱스가 된다&lt;/li&gt;
&lt;li&gt;주로 비슷한 값을 동시에 조회하는 경우가 많다는 점에서 착안된 설계&lt;/li&gt;
&lt;li&gt;테이블의 레코드가 pk 기준으로 정렬되어 저장되는 경우를 &amp;rarr; 클러스터링 인덱스 or 클러스터링 테이블&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pk에 따라 레코드의 저장위치가 결정되므로 테이블의 레코드 저장 방식으로 볼 수 있다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인덱스 자체의 리프노드가 곧 데이터다. &amp;rarr; 테이블 자체가 인덱스다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클러스터 인덱스&lt;/b&gt;는 페이지를 알기 때문에 바로 그 페이지를 펴는 것&lt;/li&gt;
&lt;li&gt;&lt;b&gt;넌 클러스터 인덱스&lt;/b&gt;는 뒤에 목차에서 찾고자 하는 내용의 페이지를 찾고 그 페이지로 이동하는 것.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테이블 스캔&lt;/b&gt;은 처음부터 한 장씩 넘기면서 내용을 찾는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pk가 없다면 다음 기준으로 이노디비 스토리지 엔진이 pk를 대체할 컬럼을 선정한다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pk가 있다면 pk를 클러스터링 키로 선택&lt;/li&gt;
&lt;li&gt;not null인 유니크 인덱스중에 첫번째를 클러스터링 키로 선택&lt;/li&gt;
&lt;li&gt;자동으로 유니크한 값을 가지도록 증가되는 컬럼을 내부적으로 고른 후 클러스터링 키로 선택&lt;/li&gt;
&lt;/ul&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;pk(클러스터링키)로 검색할때 성능이 매우 빠름(특히 pk를 범위검색에 사용하는 경우)&lt;/li&gt;
&lt;li&gt;테이블의 모든 세컨더리 인덱스가 pk를 가지고있기 때문에 인덱스만으로 쿼리를 처리할 수 있을 확률이 높음(커버링 인덱스)&lt;/li&gt;
&lt;/ul&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;테이블의 모든 세컨더리 인덱스가 pk를 가지고있기 때문에 클러스터링 키값이 클수록 전체적으로 인덱스의 크기가 커짐&lt;/li&gt;
&lt;li&gt;세컨더리 인덱스로 검색할때 pk로 한번 다시 검색해야하기에 처리성능이 느림&lt;/li&gt;
&lt;li&gt;INSERT를 할 때 pk에 의해 레코드 저장 위치가 결정되기에 처리 성능이 느림&lt;/li&gt;
&lt;li&gt;pk를 변경할 때 레코드를 DELETE하고 INSERT해야하기에 처리성능이 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Xx19n/btsKqoBVLR2/XQ8tNHpbbaGaee1utk0Dc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Xx19n/btsKqoBVLR2/XQ8tNHpbbaGaee1utk0Dc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Xx19n/btsKqoBVLR2/XQ8tNHpbbaGaee1utk0Dc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXx19n%2FbtsKqoBVLR2%2FXQ8tNHpbbaGaee1utk0Dc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;694&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLLQJt/btsKqMvL73g/JcexTsRBOiJUDw9kyPr8Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLLQJt/btsKqMvL73g/JcexTsRBOiJUDw9kyPr8Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLLQJt/btsKqMvL73g/JcexTsRBOiJUDw9kyPr8Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLLQJt%2FbtsKqMvL73g%2FJcexTsRBOiJUDw9kyPr8Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;854&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 데이터 페이지는 정렬되지 않기에 INSERT, UPDATE, DELETE 성능 좋음&lt;/li&gt;
&lt;/ul&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;논 클러스터링 인덱스(세컨더리 인덱스)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클러스터링 인덱스(PK 인덱스)를 제외한 모든 인덱스&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;리프 노드에서 레코드의 물리적인 주소값이 아닌 PK를 가지기 때문에 레코드를 접근할 때 바로 접근할 수 없다&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;pk가 변경되면 레코드의 물리적 주소가 바뀜&lt;/li&gt;
&lt;li&gt;논 클러스터링 인덱스는 실제 레코드 주소값(pk)이 아닌 논리적인 pk만 참조하기에 레코드의 값이 변경되어도 논 클러스터링 인덱스는 바뀌지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클러스터링 인덱스 &amp;rarr; pk(데이터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논 클러스터링 인덱스 &amp;rarr; 클러스터링 인덱스 &amp;rarr; pk(데이터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpXjcr/btsKqo9Jxfx/Ao5u749xC8JHKIGvEtcUxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpXjcr/btsKqo9Jxfx/Ao5u749xC8JHKIGvEtcUxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpXjcr/btsKqo9Jxfx/Ao5u749xC8JHKIGvEtcUxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpXjcr%2FbtsKqo9Jxfx%2FAo5u749xC8JHKIGvEtcUxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1354&quot; height=&quot;538&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7EVCA/btsKra3YRMm/ZrD6F9sXke1KvhVODHouKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7EVCA/btsKra3YRMm/ZrD6F9sXke1KvhVODHouKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7EVCA/btsKra3YRMm/ZrD6F9sXke1KvhVODHouKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7EVCA%2FbtsKra3YRMm%2FZrD6F9sXke1KvhVODHouKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;698&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&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;논 클러스터링 인덱스: 인덱스를 가지고 리프노드에 탐색해서 실제 데이터 위치를 얻음 &amp;rarr; 실제 데이터는 힙영역에서 얻는다&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클러스터링 테이블 사용시 주의사항&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;모든 논 클러스터링(세컨더리) 인덱스가 pk를 포함한다&lt;/li&gt;
&lt;li&gt;그래서 pk의 크기가 커지면 세컨더리 인덱스도 커진다&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;pk는 auto_increment 보다는 업무적인 컬럼으로 생성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이노디비에서 pk는 클러스터링 키로 사용되며, 이 값에 따라서 레코드의 위치가 결정됨&lt;/li&gt;
&lt;li&gt;즉, pk로 검색하는 경우 클러스터링 되지 않은 테이블에 비해서 매우 빠르다는 뜻&lt;/li&gt;
&lt;li&gt;따라서 검색에서 빈번하게 사용되고 &amp;rarr; 업무적으로 pk가 해당 레코드를 대표할 수 있다면 pk로 설정하는 것이 좋다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pk는 반드시 명시할 것
&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;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;auto_increment 컬럼을 인조 식별자로 사용할 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세컨더리 인덱스도 필요하고 프라이머리 키의 크기도 길다면 AUTO-INCREMENT 칼럼을 추가하고 이를 프라이머리 키로 설정하면 된다.&lt;/li&gt;
&lt;li&gt;이를 인조 식별자라고 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;유니크 인덱스&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 값이 2개 이상 저장될 수 없음을 의미&lt;/li&gt;
&lt;li&gt;인덱스라기보단 제약조건에 가깝다 &amp;rarr; 하지만 인덱스 없이 유니크 제약만 설정할 방법이 없다&lt;/li&gt;
&lt;li&gt;유니크 인덱스가 걸린 컬럼에 null도 저장될 수 있지만 null은 중복 허용임&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;그렇긴한데 유니크&amp;rdquo;인덱스&amp;rdquo;라서 빠른건 아니다&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;유니크 인덱스는 1개뿐이라서 빠른것 (1개뿐임이 보장되기에 실행계획이 다름)&lt;/li&gt;
&lt;li&gt;인덱스 자체에 대한 차이는 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;li&gt;pk를 유니크 인덱스로 쓰지말자 중복이다&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고:&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jjingho.tistory.com/168&quot;&gt;https://jjingho.tistory.com/168&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@syeeuns/Real-MySQL-08.-인덱스&quot;&gt;https://velog.io/@syeeuns/Real-MySQL-08.-인덱스&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jojoldu.tistory.com/476&quot;&gt;https://jojoldu.tistory.com/476&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developers-haven.tistory.com/55&quot;&gt;https://developers-haven.tistory.com/55&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ksh-coding.tistory.com/123&quot;&gt;https://ksh-coding.tistory.com/123&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hyeonproject.medium.com/mysql-unique-index에-대해서-31d03db00b55&quot;&gt;https://hyeonproject.medium.com/mysql-unique-index에-대해서-31d03db00b55&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/116</guid>
      <comments>https://llshl.tistory.com/116#entry116comment</comments>
      <pubDate>Thu, 31 Oct 2024 03:40:12 +0900</pubDate>
    </item>
    <item>
      <title>[GC] 가비지와 GC, 메모리 누수에 대해 ARABOZA</title>
      <link>https://llshl.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정말 오오오오오랜만에 글을쓴다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 잘 써보자고&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1 data-pm-slice=&quot;0 0 []&quot;&gt;가비지란?&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JVM의 힙영역에 할당됐던 메모리중 필요없게 된 메모리를 가비지라고 한다&lt;/li&gt;
&lt;li&gt;C언어의 경우 free() 함수를 통해 직접 메모리 해제&lt;/li&gt;
&lt;li&gt;자바는 gc가 해준다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;abnf&quot;&gt;&lt;code&gt;Person person = new Person();
person.setName(&quot;lsh&quot;);
person = null;

// 가비지 발생
person = new Person();
person.setName(&quot;ksh&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;div data-pm-slice=&quot;0 0 []&quot; data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4GyMK/btsJDU9lkYh/XgrHvlsXU828f2jHkEHc21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4GyMK/btsJDU9lkYh/XgrHvlsXU828f2jHkEHc21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4GyMK/btsJDU9lkYh/XgrHvlsXU828f2jHkEHc21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4GyMK%2FbtsJDU9lkYh%2FXgrHvlsXU828f2jHkEHc21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;369&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&amp;nbsp;&lt;/div&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;b&gt;는&lt;/b&gt; 신경쓰지 않아도 된다&lt;/li&gt;
&lt;/ul&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;GC 동작중에는 STW, 오버헤드 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;GC란&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;힙 영역에서 유효하지 않은(사용하지 않는) 메모리를 자동으로 수거하는 기능&lt;/b&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;대부분의 객체는 금방 unreachable 상태가 된다&lt;/li&gt;
&lt;li&gt;오래된 객체 -&amp;gt; 새로운 객체로의 참조는 아주 적다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;따라서 힙 영역은 객체의 생존 기간에 따라 Young 영역과 Old 영역으로 나눔&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;576&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg4kzm/btsJDtEpkNs/ehQWkYYHykPpRVgo5iUY50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg4kzm/btsJDtEpkNs/ehQWkYYHykPpRVgo5iUY50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg4kzm/btsJDtEpkNs/ehQWkYYHykPpRVgo5iUY50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg4kzm%2FbtsJDtEpkNs%2FehQWkYYHykPpRVgo5iUY50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;588&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;young영역&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;young은 eden과 survivor1, 2로 구성
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;eden
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;eden은 new를 통해 새로 생성된 객체가 위치함&lt;/li&gt;
&lt;li&gt;정기적인 gc 수행 후 살아남은 객체들은 survivor1,2로 넘김&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;survivor
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;최소 1번 이상의 gc에서 살아남은 객체가 위치한 영역&lt;/li&gt;
&lt;li&gt;survivor1이나 survivor2중 하나는 꼭 비어있어야 한다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;이곳에서의 gc 동작을 Minor gc라고함&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;old영역&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;young영역에서 reachable 상태를 유지하여 살아남은 객체가 복사되어 이곳에 위치하게된다&lt;/li&gt;
&lt;li&gt;이곳에서의 gc를 메이저gc 혹은 full gc라고함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvkSzv/btsJDUauVeN/HBVZYa92nWkn1iSkciBlm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvkSzv/btsJDUauVeN/HBVZYa92nWkn1iSkciBlm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvkSzv/btsJDUauVeN/HBVZYa92nWkn1iSkciBlm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvkSzv%2FbtsJDUauVeN%2FHBVZYa92nWkn1iSkciBlm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1454&quot; height=&quot;576&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;576&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;card table
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예외적으로 old영역에 있는 객체가 Young영역에 있는 객체를 참조하는 경우도 있다&lt;/li&gt;
&lt;li&gt;이럴때를 대비하여 512바이트의 덩어리(청크)로 되어있는 카드테이블이라는 것이 있다&lt;/li&gt;
&lt;li&gt;마이너 gc가 발생할때 old영역에서 참조하는 young으로 참조하는 객체가 있는지 old영역을 확인안해도 되기에 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdBCsZ/btsJDwVg0yp/JkfiDhHxKAmlakkJbEKxTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdBCsZ/btsJDwVg0yp/JkfiDhHxKAmlakkJbEKxTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdBCsZ/btsJDwVg0yp/JkfiDhHxKAmlakkJbEKxTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdBCsZ%2FbtsJDwVg0yp%2FJkfiDhHxKAmlakkJbEKxTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;472&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 굳이 영역을 나누는가?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;heap 영역을 나누는 이유는 heap 전체를 탐색하여 메모리를 해제하는 full gc로 인한 성능상의 이슈를 최소화 시키기 위함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;weak generational hypothesis의 장점을 극대화 시키기 위함&lt;/li&gt;
&lt;li&gt;주로 old 영역의 객체는 크기가 큰 것들이 대부분이고 gc 소요시간이 Minor gc보다 오래걸린다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Minor gc와 Major gc의 비율간의 트레이드 오프&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;survivor 영역을 두개로 나누는 이유는 메모리 단편화 문제를 해결하기 위함&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehwwSe/btsJCZRloSg/gUkiE7vGxKbKHPPvIXHT51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehwwSe/btsJCZRloSg/gUkiE7vGxKbKHPPvIXHT51/img.png&quot; data-alt=&quot;내부단편화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehwwSe/btsJCZRloSg/gUkiE7vGxKbKHPPvIXHT51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehwwSe%2FbtsJCZRloSg%2FgUkiE7vGxKbKHPPvIXHT51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;274&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;내부단편화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;748&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkqYtl/btsJCObwWHt/qyMkGEiXKa1cPmKFCFKn10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkqYtl/btsJCObwWHt/qyMkGEiXKa1cPmKFCFKn10/img.png&quot; data-alt=&quot;외부단편화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkqYtl/btsJCObwWHt/qyMkGEiXKa1cPmKFCFKn10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkqYtl%2FbtsJCObwWHt%2FqyMkGEiXKa1cPmKFCFKn10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;328&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;외부단편화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;737&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GC 동작 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;young 영역과 old 영역의 세부적인 동작방식은 다르나 다음 두가지는 공통이다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stop the world
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gc 실행을 위해 jvm이 애플리케이션의 실행을 멈추는 작업&lt;/li&gt;
&lt;li&gt;gc를 실행하는 쓰레드를 제외한 모든 스레드가 중단됨&lt;/li&gt;
&lt;li&gt;gc튜닝은 대부분 이 시간을 줄이는것&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mark and sweep
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마크 -&amp;gt; 사용되는 메모리와 그렇지 않은 메모리를 식별하는 작업&lt;/li&gt;
&lt;li&gt;스윕 -&amp;gt; 마크단계에서 사용되지 않는것으로 판별된 메모리를 해제하는 작업&lt;/li&gt;
&lt;li&gt;컴팩션 -&amp;gt; 파편화된 메모리 영역을 앞에서부터 채워나가는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;745&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/647zV/btsJCTRgPSz/ZJlTCYxHkz5f0tOYBhVenK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/647zV/btsJCTRgPSz/ZJlTCYxHkz5f0tOYBhVenK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/647zV/btsJCTRgPSz/ZJlTCYxHkz5f0tOYBhVenK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F647zV%2FbtsJCTRgPSz%2FZJlTCYxHkz5f0tOYBhVenK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;408&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Minor GC 동작 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사진출처: &lt;a href=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726298149625&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;☕ 가비지 컬렉션 동작 원리 &amp;amp; GC 종류   총정리&quot; data-og-description=&quot;Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; data-og-url=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ZhjF6/hyW2VmDRkJ/PUXkSay5ddxQTVneZnKqA1/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/c0s5oN/hyW2T3rs23/WlKCkv0CWUHErkjMXdpxQ1/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/zT7GB/hyW2XLxlsv/O5EMRsfzY2EE6dllEQNcUK/img.png?width=1200&amp;amp;height=728&amp;amp;face=0_0_1200_728&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ZhjF6/hyW2VmDRkJ/PUXkSay5ddxQTVneZnKqA1/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/c0s5oN/hyW2T3rs23/WlKCkv0CWUHErkjMXdpxQ1/img.png?width=800&amp;amp;height=485&amp;amp;face=0_0_800_485,https://scrap.kakaocdn.net/dn/zT7GB/hyW2XLxlsv/O5EMRsfzY2EE6dllEQNcUK/img.png?width=1200&amp;amp;height=728&amp;amp;face=0_0_1200_728');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;☕ 가비지 컬렉션 동작 원리 &amp;amp; GC 종류   총정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;687&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;1432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kL9Bo/btsJD87lBE2/52UoPzLNEJFmpelAGI8CM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kL9Bo/btsJD87lBE2/52UoPzLNEJFmpelAGI8CM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kL9Bo/btsJD87lBE2/52UoPzLNEJFmpelAGI8CM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkL9Bo%2FbtsJD87lBE2%2F52UoPzLNEJFmpelAGI8CM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;1432&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;1432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;664&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPUoU/btsJD7AAuNm/0ZNnE7e4ZWWjEqzKezGQM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPUoU/btsJD7AAuNm/0ZNnE7e4ZWWjEqzKezGQM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPUoU/btsJD7AAuNm/0ZNnE7e4ZWWjEqzKezGQM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPUoU%2FbtsJD7AAuNm%2F0ZNnE7e4ZWWjEqzKezGQM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;1094&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KPRpD/btsJEjt6DVf/7lUSdxGmQNfNDbl35Vz7m1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KPRpD/btsJEjt6DVf/7lUSdxGmQNfNDbl35Vz7m1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KPRpD/btsJEjt6DVf/7lUSdxGmQNfNDbl35Vz7m1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKPRpD%2FbtsJEjt6DVf%2F7lUSdxGmQNfNDbl35Vz7m1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1262&quot; height=&quot;1038&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;638&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;age란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Survivor 영역에서 객체가 gc로부터 살아남은 횟수&lt;/li&gt;
&lt;li&gt;임계점에 다다르면 Promotion되어 old영역으로 이동한다&lt;/li&gt;
&lt;li&gt;JVM중 일반적인 HotSpot JVM의 경우 age 임계값이 31이다&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;646&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;646&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baRqzg/btsJDHvBWBg/IkhWNYifEVkGR1BidGTQ00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baRqzg/btsJDHvBWBg/IkhWNYifEVkGR1BidGTQ00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baRqzg/btsJDHvBWBg/IkhWNYifEVkGR1BidGTQ00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaRqzg%2FbtsJDHvBWBg%2FIkhWNYifEVkGR1BidGTQ00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1426&quot; height=&quot;1262&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRS68Y/btsJEnb436Y/fknZtPbCOkZxeiRBIigEl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRS68Y/btsJEnb436Y/fknZtPbCOkZxeiRBIigEl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRS68Y/btsJEnb436Y/fknZtPbCOkZxeiRBIigEl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRS68Y%2FbtsJEnb436Y%2FfknZtPbCOkZxeiRBIigEl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;1470&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;1470&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;664&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2Wjrb/btsJDaSIMbF/aHc5RKQyYK7ljahUoNtX60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2Wjrb/btsJDaSIMbF/aHc5RKQyYK7ljahUoNtX60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2Wjrb/btsJDaSIMbF/aHc5RKQyYK7ljahUoNtX60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2Wjrb%2FbtsJDaSIMbF%2FaHc5RKQyYK7ljahUoNtX60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1324&quot; height=&quot;606&quot; data-origin-width=&quot;1324&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Major GC 동작 방식&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;young에서 age가 차서 넘어온 객체들&lt;/li&gt;
&lt;li&gt;old 영역의 메모리가 부족해지면 major gc 수행&lt;/li&gt;
&lt;li&gt;old 영역에서 한번에 삭제함&lt;/li&gt;
&lt;li&gt;old 영역은 young 영역보다 상대적으로 큰 공간을 가지고있기에 gc 수행시간 길다 &amp;rarr; STW&lt;/li&gt;
&lt;li&gt;STW를 줄이기위해 여러 가비지 컬렉션 알고리즘이 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Minor Major GC 비교&lt;/h2&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;630&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7ED0y/btsJD6uUC3L/JTcLEwzgzvckyTaF5vtE81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7ED0y/btsJD6uUC3L/JTcLEwzgzvckyTaF5vtE81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7ED0y/btsJD6uUC3L/JTcLEwzgzvckyTaF5vtE81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7ED0y%2FbtsJD6uUC3L%2FJTcLEwzgzvckyTaF5vtE81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;312&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 gc가 동작해도 모든 객체가 reachable해서 삭제될 객체가 없다면? &amp;rarr; OOM 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;GC 알고리즘&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Serial GC&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;1 core cpu일때 사용하기위함&lt;/li&gt;
&lt;li&gt;Gc를 처리하는 스레드가 1개라서 STW시간이 제일 길다&lt;/li&gt;
&lt;li&gt;실무에서 사용하는 케이스가 거의 없다고한다&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;323&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zwTOC/btsJDpB9uW0/ZZkJNw9Lz3pURPNpIQ0hD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zwTOC/btsJDpB9uW0/ZZkJNw9Lz3pURPNpIQ0hD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zwTOC/btsJDpB9uW0/ZZkJNw9Lz3pURPNpIQ0hD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzwTOC%2FbtsJDpB9uW0%2FZZkJNw9Lz3pURPNpIQ0hD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;462&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Parallel GC&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바8의 default gc&lt;/li&gt;
&lt;li&gt;Minor gc를 멀티스레드로 수행함 (Major gc는 여전히 싱글스레드)&lt;/li&gt;
&lt;li&gt;Serial gc에 비해선 STW 감소&lt;/li&gt;
&lt;li&gt;스레드는 기본적으로 cpu 개수만큼 할당됨&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kw9AP/btsJDy6GtsS/sneloahDAnOicOXir9YYjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kw9AP/btsJDy6GtsS/sneloahDAnOicOXir9YYjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kw9AP/btsJDy6GtsS/sneloahDAnOicOXir9YYjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkw9AP%2FbtsJDy6GtsS%2FsneloahDAnOicOXir9YYjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;289&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Parallel old GC&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Parallel gc를 개선함&lt;/li&gt;
&lt;li&gt;old영역에서도 멀티스레드로 메이저 gc수행&lt;/li&gt;
&lt;li&gt;Mark - summary - compact 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;660&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYbcZA/btsJDucghBC/KcfuseSkNxFkLhSE6Mba31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYbcZA/btsJDucghBC/KcfuseSkNxFkLhSE6Mba31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYbcZA/btsJDucghBC/KcfuseSkNxFkLhSE6Mba31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYbcZA%2FbtsJDucghBC%2FKcfuseSkNxFkLhSE6Mba31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;441&quot; data-origin-width=&quot;1242&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Cms GC&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어플리케이션의 쓰레드와 GC 쓰레드가 동시에 실행되어 stop-the-world 시간을 최대한 줄이기 위해 고안된 GC&lt;/li&gt;
&lt;li&gt;단, GC 과정이 매우 복잡해짐.&lt;/li&gt;
&lt;li&gt;GC 대상을 파악하는 과정이 복잡한 여러단계로 수행되기 때문에 다른 GC 대비 CPU 사용량이 높다&lt;/li&gt;
&lt;li&gt;메모리 파편화 문제&lt;/li&gt;
&lt;li&gt;CMS GC는 Java9 버전부터 deprecated 되었고 결국 Java14에서는 사용이 중지&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OqAyx/btsJDnK1rX8/y61f2UNAS4kKWJd1YwQLU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OqAyx/btsJDnK1rX8/y61f2UNAS4kKWJd1YwQLU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OqAyx/btsJDnK1rX8/y61f2UNAS4kKWJd1YwQLU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOqAyx%2FbtsJDnK1rX8%2Fy61f2UNAS4kKWJd1YwQLU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;315&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;G1GC&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 9 이상부터 default GC&lt;/li&gt;
&lt;li&gt;기존의 GC 알고리즘에서는 Heap 영역을 물리적으로 고정된 Young / Old 영역으로 나누어 사용하였지만, G1 gc는 아예 이러한 개념을 뒤엎는 &lt;b&gt;Region&lt;/b&gt;이라는 개념을 새로 도입하여 사용.&lt;/li&gt;
&lt;li&gt;전체 Heap 영역을 Region이라는 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 등 역할을 고정이 아닌 &lt;b&gt;동적으로 부여&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Garbage로 가득찬 영역을 빠르게 회수하여 빈 공간을 확보하므로, 결국 &lt;b&gt;GC 빈도가 줄어드는 효과를 얻게 되는 원리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이전의 GC들처럼 일일히 메모리를 탐색해 객체들을 제거하지 않는다&lt;/b&gt;.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;대신 메모리가 많이 차있는 영역(region)을 인식하는 기능을 통해 메모리가 많이 차있는 영역을 우선적으로 GC 한다.&amp;nbsp;&amp;rarr; 영역(region)을 나눠 탐색하고 영역(region)별로 GC가 일어난다.&lt;/li&gt;
&lt;li&gt;또한 이전의 GC 들은 Young Generation에 있는 객체들이 GC가 돌때마다 살아남으면 Eden &amp;rarr; Survivor0 &amp;rarr; Survivor1으로 순차적으로 이동했지만, G1 GC에서는 순차적으로 이동하지는 않는다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;대신 &lt;b&gt;G1 GC는 더욱 효율적이라고 생각하는 위치로 객체를 Reallocate(재할당) 시킨다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;예를 들어 Survivor1 영역에 있는 객체가 Eden 영역으로 할당하는 것이 더 효율적이라고 판단될 경우 Eden 영역으로 이동시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBJ4Y/btsJEpnsggl/gYPCTQQ416z3Pi6mWa1mc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBJ4Y/btsJEpnsggl/gYPCTQQ416z3Pi6mWa1mc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBJ4Y/btsJEpnsggl/gYPCTQQ416z3Pi6mWa1mc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBJ4Y%2FbtsJEpnsggl%2FgYPCTQQ416z3Pi6mWa1mc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1488&quot; height=&quot;472&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;ZGC&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Java 15에 release됨&lt;/li&gt;
&lt;li&gt;대량의 메모리(8MB ~ 16TB)를&amp;nbsp;low-latency로 잘 처리하기 위해 디자인 된 GC&lt;/li&gt;
&lt;li&gt;G1의 Region 처럼,&amp;nbsp; ZGC는 ZPage라는 영역을 사용하며, G1의 Region은 크기가 고정인데 비해, ZPage는 2mb 배수로 동적으로 운영됨. (큰 객체가 들어오면 2^ 로 영역을 구성해서 처리)&lt;/li&gt;
&lt;li&gt;ZGC가 내세우는 최대 장점 중 하나는 힙 크기가 증가하더도 STW의 시간이 절대 10ms를 넘지 않는다는 것&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;646&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZz0Z4/btsJDZ3Lfbu/LI9OZtaz6cStdLe6N1eKdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZz0Z4/btsJDZ3Lfbu/LI9OZtaz6cStdLe6N1eKdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZz0Z4/btsJDZ3Lfbu/LI9OZtaz6cStdLe6N1eKdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZz0Z4%2FbtsJDZ3Lfbu%2FLI9OZtaz6cStdLe6N1eKdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;421&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://velog.io/@gehwan96/Garbage-CollectionGC-2#%EC%84%B1%EB%8A%A5%EB%B9%84%EA%B5%90-%EC%A2%85%ED%95%A9&quot;&gt;GC 성능 비교&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;G1GC&lt;/h1&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;760&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JoVVH/btsJEESkIDW/KI1zcdnAXyKghRYPQit2Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JoVVH/btsJEESkIDW/KI1zcdnAXyKghRYPQit2Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JoVVH/btsJEESkIDW/KI1zcdnAXyKghRYPQit2Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJoVVH%2FbtsJEESkIDW%2FKI1zcdnAXyKghRYPQit2Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1492&quot; height=&quot;968&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;G1은 Garbage First 라는 뜻&lt;/li&gt;
&lt;li&gt;&lt;b&gt;조기 승격(Promotion)에 덜 취약하다&lt;/b&gt;. &amp;rarr; old로 너무 빠르게 이동되는 문제 &amp;rarr; STW&lt;/li&gt;
&lt;li&gt;대용량 heap에서 확장성(특히 중단시간)이 우수하다.&lt;/li&gt;
&lt;li&gt;full STW GC를 없애거나 확 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;Java 9 부터 default GC&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RSet(Remembered Set)을 통해 어떤 객체가 어떤 리전에 저장되어있는지 추적 가능 &amp;rarr; 전체 힙을 뒤질필요가 없어짐&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;G1GC 동작 과정&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Initial Mark - &lt;b&gt;SWT&lt;/b&gt; : Old 영역에서 존재하는 객체들이 참조하는 Survivor 영역을 찾는다. SWT가 발생한다.&lt;/li&gt;
&lt;li&gt;Root Region Scanning : Initial Mark 단계에서 식별한 Survivor 영역에서 Old 영역을 가리키는 레퍼런스를 식별한다.&lt;/li&gt;
&lt;li&gt;Concurrent Mark : 힙 전체에 걸쳐 접근 가능한 살아있는 객체를 찾는다.&lt;/li&gt;
&lt;li&gt;Remark - &lt;b&gt;STW&lt;/b&gt; : Concurrent Mark 단계를 검증하고, 최종적으로 살아남을 객체들을 식별한다. 이 단계에서는 SATB(Snapshot-At-The-Beginning) 알고리즘이 사용된다. STW가 발생한다.&lt;/li&gt;
&lt;li&gt;Cleanup - &lt;b&gt;STW&lt;/b&gt; : 어플리케이션을 멈추고(STW) 살아있는 객체가 가장 적은 리전에 대한 미사용 객체를 제거한다. 이후 STW를 끝내고, 앞서 GC 과정에서 완전히 비워진 리전을 FreeList에 추가하여 재사용할 수 있게 한다.&lt;/li&gt;
&lt;li&gt;Copy : GC 대상 리전이었지만 Cleanup 과정에서 완전히 비워지지 않은 리전의 살아남은 객체들을 새로운 리전에 복사하여 Compaction 작업을 수행한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;gc튜닝&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;언제 튜닝해야하는가? &amp;rarr; &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;성능저하의 원인이 명백히 gc때문일때&lt;/b&gt;&lt;/span&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;old영역으로 넘어가는 객체 최소화하기&lt;/li&gt;
&lt;li&gt;Major gc 시간 짧게 유지하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;Major gc를 적게발생시키고, 발생했다면 빠르게 끝내야함&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GC튜닝 방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙 크기 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙이 크면 gc수행시간이 늘어남, 힙이 작으면 gc가 더 자주 수행됨 -&amp;gt; 잘 조절해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Young영역과 Old영역 크기 비율 + Eden과 Survivor의 크기 비율
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;old영역이 커지면 &amp;rarr; Major gc가 자주발생하지않음 하지만 발생하면 오래걸림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-width-type=&quot;pixel&quot; data-width=&quot;630&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6IIDk/btsJEMvXiNy/173ul0upsMIRK5WqWJM4h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6IIDk/btsJEMvXiNy/173ul0upsMIRK5WqWJM4h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6IIDk/btsJEMvXiNy/173ul0upsMIRK5WqWJM4h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6IIDk%2FbtsJEMvXiNy%2F173ul0upsMIRK5WqWJM4h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1268&quot; height=&quot;380&quot; data-origin-width=&quot;1268&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&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;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;G1GC 튜닝포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;G1GC가 제공하는 파라미터가 많기에 튜닝 포인트도 많다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Maximum GC Pause Time&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-XX:MaxGCPauseMillis 설정을 통해 GC 실행 중에 최대 일시 중지 시간을 지정함으로써 높은 지연 시간을 최소화 하거나 높은 처리량을 설정할 수 있다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Young Gen 사이즈 세팅을 하지 말 것(-XX:MaxGcPauseMillis 설정을 할 경우)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-Xmn(new 영역)이나 -XX:NewRatio 설정을 피해야 한다.&lt;/li&gt;
&lt;li&gt;G1GC 알고리즘은 일시 중지 목표 시간을 충족하기 위해 &lt;b&gt;Young 영역을 임의로 수정&lt;/b&gt;하게 되는데 Young 영역을 명시적으로 설정할 경우 일시 중지 목표 설정이 정상적으로 작동하지 않는다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;다른 GC 알고리즘에서 사용하던 JVM 인수 제거&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 G1GC의 경우 다른 GC 알고리즘(Serial, Parallel, CMS)에서 사용하던 JVM 인수와 같이 사용할 경우 G1GC의 파라미터가 정상적으로 동작하지 않을 수 있다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;문자열 중복 제거&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-XX:+UseStringDeduplication 설정을 통해 문자열 중복을 제거 한다.&lt;/li&gt;
&lt;li&gt;JDK 개발팀의 조사에 따르면 다음과 같은 자바 애플리케이션의 특징이 있다고 한다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 25%는 문자열임&lt;/li&gt;
&lt;li&gt;그 중 13.5%는 중복 문자열임&lt;/li&gt;
&lt;li&gt;평균 문자열의 길이는 45자임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예를들어 멤버리스트 조회시 status가 &amp;ldquo;ACTIVE&amp;rdquo;라는 동일한 문자열이나 다 다른 메모리 공간 점유&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;div data-width-type=&quot;pixel&quot; data-width=&quot;681&quot; data-layout=&quot;center&quot; data-node-type=&quot;mediaSingle&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;1386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAznX/btsJDwAZwfT/5WIQf5ru0DFvHGyfO6yLL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAznX/btsJDwAZwfT/5WIQf5ru0DFvHGyfO6yLL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAznX/btsJDwAZwfT/5WIQf5ru0DFvHGyfO6yLL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAznX%2FbtsJDwAZwfT%2F5WIQf5ru0DFvHGyfO6yLL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;746&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;1386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1&gt;&amp;nbsp;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;GC 튜닝보다 메모리 누수 예방이 우선&lt;/h1&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Static 변수에 의한 누수&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;Static 변수는 클래스가 로드될때 생성되어 JVM이 종료될때까지 메서드 영역에 남아있는다 (사용 여부와 관계x)&lt;/li&gt;
&lt;li&gt;Static 변수가 객체를 참조 중이라면 해당 객체는 GC의 대상이 되지 않는다&lt;/li&gt;
&lt;li&gt;더 이상 사용하지 않는다면 null을 할당하여 참조를 제거하자&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;무분별한 Autoboxing&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;axapta&quot;&gt;&lt;code&gt;public class Adder {
       public long addIncremental(long l)
       {
              Long sum = 0L;
              sum = sum + l;
              return sum;
       }
       public static void main(String[] args) {
              Adder adder = new Adder();
              for(long i ; i &amp;lt; 1000 ; i++) {
                adder.addIncremental(i);
              }
       }
}&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&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;List, Map, Set 같은 컬렉션 클래스들에 객체가 담겨있는 경우 객체의 참조가 해제되지 않음&lt;/li&gt;
&lt;li&gt;null 참조로 해제한다&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;      public Object pop() {
        if (size == 0)
            throw new EmptyStackException();
        Object result = elements[--size];
        elements[size] = null; // 다 쓴 객체 참조 해제
        return result;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Weak reference를 사용한다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 key 값이 더 이상 사용되지 않는다고 판단되면 해당 Key - Value 쌍을 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자바에서 참조 종류는 다음 4가지가 있다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강한 참조(Strong Reference)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;강한 참조는 Java의 기본 참조 유형으로 new 할당 후 새로운 객체를 만들어 해당객체를 참조하는 방식&lt;/li&gt;
&lt;li&gt;강함 참조를 통해 참조되고 있는 객체는 참조가 해제되지 않는 이상 가비지 컬렉션의 대상에서 제외된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;Object obj = new Object();
// 만약 GC 를 원한다면 명시적으로 null 표시를 해줘야 한다.
obj = null;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;약한 참조(Weak Reference)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;약한 참조는 java의 lang 패키지의 WeakReference 클래스를 사용하여 생성한다.&lt;/li&gt;
&lt;li&gt;약한 참조는 GC가 발생하면 무조건 수거된다.&lt;/li&gt;
&lt;li&gt;WeakReference가 사라지는 시점이 GC의 실행 주기와 일치한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Object obj = new Object();
WeakReference&amp;lt;Object&amp;gt; weakRef = new WeakReference&amp;lt;&amp;gt;(obj);
obj = null;

System.gc();

// 무조건 null 을 확인하게 된다.
System.out.println(weakRef.get());&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Soft Reference
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Soft 참조는 강한 참조와 약한 참조와는 다르게 GC에 의해 수거될 수도 있고, 수거되지 않을 수도 있다.&lt;/li&gt;
&lt;li&gt;메모리에 충분한 여유가 있다면 GC가 수행된다 하더라도 수거되지 않는다. 하지만 메모리가 부족하면 수거될 확률이 높다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;Object obj = new Object();
SoftReference&amp;lt;Object&amp;gt; softRef = new SoftReference&amp;lt;&amp;gt;(obj);
obj = null;

System.gc();

// GC 가 여유롭다면 해시코드를 확인할 수 있다.
System.out.println(softRef.get());&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Phantom Reference?
&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;객체의 finalize() 메서드가 호출된 직후에 GC 에 의해 수거됩니다.&lt;/li&gt;
&lt;li&gt;java.lang.ref PhantomReference class 로 만들 수 있습니다.&lt;/li&gt;
&lt;li&gt;생성자에는 넣고자 하는 클래스와 함께 ReferenceQueue 를 인자로 받습니다.&lt;/li&gt;
&lt;li&gt;PhantomReference 는 객체가 참조되지 않습니다.&lt;/li&gt;
&lt;li&gt;객체의 finalize 메서드가 호출된 직후 Phantom Reference 가 ReferenceQueue 에 등록됩니다.&lt;/li&gt;
&lt;li&gt;이를 통해 객체의 finalize() 메서드가 호출되었음을 알 수 있습니다.&lt;/li&gt;
&lt;li&gt;일반적으로 Phantom Reference 는 Native 객체나 Direct Memory 와 같이 JVM 에서 관리되지 않는 자원들을 해제하기 위해 사용됩니다.&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;b&gt;CustomKey 사용으로 인한 누수&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;Map을 사용할 때 custom key를 사용할 때는 equals()와 hashcode()를 값을 기반으로 구현해야한다&lt;/li&gt;
&lt;li&gt;아래의 경우 &lt;b&gt;Key값이 같은 객체로 인식하지 못해서 계속 Map에 쌓이게 되면서 메모리를 점유하게 된다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class CustomKey {
    private String name;
    
    public CustomKey(String name) {
        this.name=name;
    }
    
    public staticvoid main(String[] args) {
        Map&amp;lt;CustomKey,String&amp;gt; map = new HashMap&amp;lt;CustomKey,String&amp;gt;();
        map.put(new CustomKey(&quot;Shamik&quot;), &quot;Shamik Mitra&quot;);
   }
}&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&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;close()나 try with resources 구문으로 리소스 반환해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        try (FileWriter file = new FileWriter(&quot;data.txt&quot;)) { // 파일을 열고 모두 사용되면 자동으로 닫아준다
            file.write(&quot;Hello World&quot;);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Java</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/109</guid>
      <comments>https://llshl.tistory.com/109#entry109comment</comments>
      <pubDate>Sat, 14 Sep 2024 16:17:54 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] OSI 7Layer를 통해 알아보는 데이터의 전달과정</title>
      <link>https://llshl.tistory.com/107</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로토콜&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;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오전 12.59.31.png&quot; data-origin-width=&quot;2970&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vfzjn/btsHe0qZjgf/FFXV03uKfmfw4ACE38OXLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vfzjn/btsHe0qZjgf/FFXV03uKfmfw4ACE38OXLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vfzjn/btsHe0qZjgf/FFXV03uKfmfw4ACE38OXLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvfzjn%2FbtsHe0qZjgf%2FFFXV03uKfmfw4ACE38OXLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2970&quot; height=&quot;1190&quot; data-filename=&quot;스크린샷 2024-05-08 오전 12.59.31.png&quot; data-origin-width=&quot;2970&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;OSI 7계층과 TCP/IP 프로토콜&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오전 1.27.50.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcwP2/btsHjTRNia0/xkdCL7xw5MtcSrT4yIoBeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcwP2/btsHjTRNia0/xkdCL7xw5MtcSrT4yIoBeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcwP2/btsHjTRNia0/xkdCL7xw5MtcSrT4yIoBeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcwP2%2FbtsHjTRNia0%2FxkdCL7xw5MtcSrT4yIoBeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1488&quot; height=&quot;728&quot; data-filename=&quot;스크린샷 2024-05-09 오전 1.27.50.png&quot; data-origin-width=&quot;1488&quot; data-origin-height=&quot;728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 모델의 공통점&lt;/h4&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;두 모델의 차이점&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OSI의 7,6,5층을 TCPIP에서는 한 층으로 퉁침&lt;/li&gt;
&lt;li&gt;이 측면에서는 OSI가 문제해결과 성능개선이 더 좋음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@sj_dev_js/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%99%9C-%EB%B0%B0%EC%9A%B8%EA%B9%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@sj_dev_js/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%99%9C-%EB%B0%B0%EC%9A%B8%EA%B9%8C&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715185798953&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[네트워크] OSI 7계층을 왜 배울까?&quot; data-og-description=&quot;네트워크를 공부할 때 가장 먼저 배우게 되는 것이 TCP/IP 모델 혹은 OSI 모델이다.오늘날의 네트워크에서 OSI모델은 참조적 모델일 뿐이고 실제로 쓰이는 것은 TCP/IP 모델이라는데 그렇다면 OSI 모&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@sj_dev_js/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%99%9C-%EB%B0%B0%EC%9A%B8%EA%B9%8C&quot; data-og-url=&quot;https://velog.io/@sj_dev_js/네트워크-OSI-7계층을-왜-배울까&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/9Fjwa/hyVZgT4DUx/Qfd0c73GWT5kCgeOHvV8ZK/img.jpg?width=721&amp;amp;height=364&amp;amp;face=0_0_721_364,https://scrap.kakaocdn.net/dn/eZ1YF/hyVZpXPQ3R/I2xf6hg3FZ5gmKBnoWMQW1/img.jpg?width=721&amp;amp;height=364&amp;amp;face=0_0_721_364,https://scrap.kakaocdn.net/dn/cNbgJ8/hyVZjce0ka/ni5iJO8FbykC0OME65aAm1/img.jpg?width=2048&amp;amp;height=2048&amp;amp;face=0_0_2048_2048&quot;&gt;&lt;a href=&quot;https://velog.io/@sj_dev_js/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%99%9C-%EB%B0%B0%EC%9A%B8%EA%B9%8C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@sj_dev_js/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-OSI-7%EA%B3%84%EC%B8%B5%EC%9D%84-%EC%99%9C-%EB%B0%B0%EC%9A%B8%EA%B9%8C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/9Fjwa/hyVZgT4DUx/Qfd0c73GWT5kCgeOHvV8ZK/img.jpg?width=721&amp;amp;height=364&amp;amp;face=0_0_721_364,https://scrap.kakaocdn.net/dn/eZ1YF/hyVZpXPQ3R/I2xf6hg3FZ5gmKBnoWMQW1/img.jpg?width=721&amp;amp;height=364&amp;amp;face=0_0_721_364,https://scrap.kakaocdn.net/dn/cNbgJ8/hyVZjce0ka/ni5iJO8FbykC0OME65aAm1/img.jpg?width=2048&amp;amp;height=2048&amp;amp;face=0_0_2048_2048');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[네트워크] OSI 7계층을 왜 배울까?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;네트워크를 공부할 때 가장 먼저 배우게 되는 것이 TCP/IP 모델 혹은 OSI 모델이다.오늘날의 네트워크에서 OSI모델은 참조적 모델일 뿐이고 실제로 쓰이는 것은 TCP/IP 모델이라는데 그렇다면 OSI 모&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-09 오전 1.27.34.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyjaGe/btsHghmQJZk/Z2vSnshDFzFirUHtSVL0M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyjaGe/btsHghmQJZk/Z2vSnshDFzFirUHtSVL0M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyjaGe/btsHghmQJZk/Z2vSnshDFzFirUHtSVL0M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyjaGe%2FbtsHghmQJZk%2FZ2vSnshDFzFirUHtSVL0M0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;368&quot; data-filename=&quot;스크린샷 2024-05-09 오전 1.27.34.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;1계층 : 물리계층&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfUKYe/btsHg5Gb304/9zBjZBp1KreMWK7kOmGjFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfUKYe/btsHg5Gb304/9zBjZBp1KreMWK7kOmGjFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfUKYe/btsHg5Gb304/9zBjZBp1KreMWK7kOmGjFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfUKYe%2FbtsHg5Gb304%2F9zBjZBp1KreMWK7kOmGjFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1098&quot; height=&quot;578&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상위계층(2계층)에서 받은 비트 스트림을 상대방의 물리계층으로 보내는 기능&lt;/li&gt;
&lt;li&gt;단지 데이터만 전달함&lt;/li&gt;
&lt;li&gt;전송단위(PDU)는 비트&lt;/li&gt;
&lt;li&gt;프로토콜: Modem, Cable, Fiber, RS-232C&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;h3 data-ke-size=&quot;size23&quot;&gt;리피터란?&lt;/h3&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyjC5k/btsHge4IzbY/FpOgF1vxVVd88kzVVu8kvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyjC5k/btsHge4IzbY/FpOgF1vxVVd88kzVVu8kvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyjC5k/btsHge4IzbY/FpOgF1vxVVd88kzVVu8kvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyjC5k%2FbtsHge4IzbY%2FFpOgF1vxVVd88kzVVu8kvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;145&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;허브란?&lt;/h3&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;리피터는 1대1 연결만 가능&lt;/li&gt;
&lt;li&gt;허브는 다대다로 연결 가능&lt;/li&gt;
&lt;li&gt;얘도 리피터와 마찬가지로 전기신호의 증폭을 위해 사용&lt;/li&gt;
&lt;li&gt;CSMA/CD 방식을 적용하기에 여러 장비에서 동시에 데이터를 전송하지는 못함 (A장비에서 데이터 전송중일때 B도 전송하면 충돌발생)&lt;/li&gt;
&lt;li&gt;특정 포트로만 데이터를 전송할수없고 모든 포트에 데이터를 전송하게 되기에 과도한 트래픽, 충돌 발생 -&amp;gt; 스위칭 허브 사용(레이어2에서 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXvTFm/btsHjwP2qGw/nNGpJQh7bbGMDTuGRgBzq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXvTFm/btsHjwP2qGw/nNGpJQh7bbGMDTuGRgBzq1/img.png&quot; data-alt=&quot;이렇게 생김&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXvTFm/btsHjwP2qGw/nNGpJQh7bbGMDTuGRgBzq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXvTFm%2FbtsHjwP2qGw%2FnNGpJQh7bbGMDTuGRgBzq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;326&quot; height=&quot;198&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이렇게 생김&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/newZa/btsHiJWBsMh/0riOFPLaiX7oPt47R4vo81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/newZa/btsHiJWBsMh/0riOFPLaiX7oPt47R4vo81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/newZa/btsHiJWBsMh/0riOFPLaiX7oPt47R4vo81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnewZa%2FbtsHiJWBsMh%2F0riOFPLaiX7oPt47R4vo81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;275&quot; height=&quot;257&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;782&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;2계층 : 데이터링크 계층&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUnRcM/btsHjwvJ6LO/yXBvLNNTKC7GpcWnFuki40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUnRcM/btsHjwvJ6LO/yXBvLNNTKC7GpcWnFuki40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUnRcM/btsHjwvJ6LO/yXBvLNNTKC7GpcWnFuki40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUnRcM%2FbtsHjwvJ6LO%2FyXBvLNNTKC7GpcWnFuki40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1166&quot; height=&quot;626&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;3계층에서 내려준 패킷을 받아 헤더와 테일에 각각 주소와 제어정보를 추가함&lt;/li&gt;
&lt;li&gt;1계층을 통해 송수신되는 데이터의 전송 오류를 감지하여 재전송도 해줌&lt;/li&gt;
&lt;li&gt;맥주소를 가지고 통신&lt;/li&gt;
&lt;li&gt;맥주소란 컴퓨터의 물리적인 주소&lt;/li&gt;
&lt;li&gt;ip주소가 시작점과 끝점의 주소라면 맥주소는 중간중간지점들의 주소&lt;/li&gt;
&lt;li&gt;ex) 서울에서 부산으로 편지를 보낸다면 ip주소는 서울, 부산이 되고 맥주소는 서울우체국, 부산우체국1 등등이 된다&lt;/li&gt;
&lt;li&gt;프로토콜 : 이더넷, MAC, PPP, ATM, LAN, Wifi&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;h3 data-ke-size=&quot;size23&quot;&gt;브릿지란?&lt;/h3&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;LAN과 LAN을 연결하거나 컴퓨터 그룹(세그먼트)를 연결해주는 기능&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;Learning : A라는 호스트가 데이터를 주면 A의 맥주소를 브릿지의 맥주소 테이블에 저장&lt;/li&gt;
&lt;li&gt;Flooding : 목적지 정보가 맥주소 테이블에 없다면 모든 포트로 데이터 전파&lt;/li&gt;
&lt;li&gt;Forwarding : 목적지 정보가 맥주소 테이블에 있다면 해당 포트로 전송, 없다면 플로딩&lt;/li&gt;
&lt;li&gt;Filtering : 브릿지를 건너지 못하게 막는 기능&lt;/li&gt;
&lt;li&gt;Aging : 맥주소 테이블 데이터를 자동으로 삭제하는 일종의 TTL&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;h3 data-ke-size=&quot;size23&quot;&gt;스위치란?&lt;/h3&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;브릿지와의 차이는 -&amp;gt; 스위치는 하드웨어, 브릿지는 소프트웨어 방식이기에 스위치가 속도가 더 빠르다&lt;/li&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;L2스위치 : 기본적인 스위치. 데이터링크 계층에서 사용, 맥주소 기반으로 패킷 전달, 가격저렴&lt;/li&gt;
&lt;li&gt;L3스위치 : L2스위치에 라우팅 기능이 추가됨, IP 정보를 보고 스위칭한다, 기능적으로 라우터와 똑같지만 라우터는 소프트웨어방식이기에 하드웨어 방식인 L3스위치가 더 빠르고 저렴&lt;/li&gt;
&lt;li&gt;L4스위치 : 4계층 프로토콜인 TCP/UDP를 사용, IP와 포트 기반으로 스위칭, L4스위치에는 로드밸런싱 기능이 있음&lt;/li&gt;
&lt;li&gt;L7스위치 : L4스위치와 기능,역할이 동일하나, L7스위치에서는 페이로드를 분석하여 패킷 처리. 페이로드를 분석함으로서 Dos, SYN Attack등 네트워크 공격 방어 가능. 가격 비쌈&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;&amp;nbsp;&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;3계층 : 네트워크 계층&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djFc12/btsHi5SIzEg/9LctcwnH2dUZkxKn65O8Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djFc12/btsHi5SIzEg/9LctcwnH2dUZkxKn65O8Mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djFc12/btsHi5SIzEg/9LctcwnH2dUZkxKn65O8Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjFc12%2FbtsHi5SIzEg%2F9LctcwnH2dUZkxKn65O8Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;630&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&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;li&gt;라우팅 알고리즘을 통해 최적의 경로를 선택&lt;/li&gt;
&lt;li&gt;데이터를 목적지까지 안전하고 빠르게 전달하는게 중요 -&amp;gt; 이거를 라우팅이라고 한다&lt;/li&gt;
&lt;li&gt;전송단위 : 패킷&lt;/li&gt;
&lt;li&gt;프로토콜 : IP, ICMP&lt;/li&gt;
&lt;li&gt;장비 : 라우터, L3스위치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;라우터란?&lt;/h3&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;L3와 기능 비슷, 하지만 소프트웨어 방식이기에 더 비싸고 느리고 초기설정 어려움&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;코어라우터, 센터라우터, 엣지라우터, 브로드밴드라우터, 핫스팟라우터, ISP라우터&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uKdhw/btsHisU6cBQ/V7RbBhKQo21KqNy0CCow7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uKdhw/btsHisU6cBQ/V7RbBhKQo21KqNy0CCow7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uKdhw/btsHisU6cBQ/V7RbBhKQo21KqNy0CCow7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuKdhw%2FbtsHisU6cBQ%2FV7RbBhKQo21KqNy0CCow7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;769&quot; height=&quot;169&quot; data-origin-width=&quot;1848&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdKKWp/btsHid4LsLX/8pratHpDBL8lXJrkGrpGWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdKKWp/btsHid4LsLX/8pratHpDBL8lXJrkGrpGWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdKKWp/btsHid4LsLX/8pratHpDBL8lXJrkGrpGWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdKKWp%2FbtsHid4LsLX%2F8pratHpDBL8lXJrkGrpGWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;517&quot; height=&quot;328&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;4계층 : 전송계층&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D6OXU/btsHjwWPyzC/EgCcvZpOW9rjfj63yALbRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D6OXU/btsHjwWPyzC/EgCcvZpOW9rjfj63yALbRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D6OXU/btsHjwWPyzC/EgCcvZpOW9rjfj63yALbRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD6OXU%2FbtsHjwWPyzC%2FEgCcvZpOW9rjfj63yALbRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;562&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/li&gt;
&lt;li&gt;단위 : 세그먼트&lt;/li&gt;
&lt;li&gt;프로토콜 : TCP, UDP, ARP, RTR
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분 TCP&lt;/li&gt;
&lt;li&gt;ACK을 통해 신뢰성있는 전송&lt;/li&gt;
&lt;li&gt;UDP는 비연결성, 비신뢰성임. 수신자가 잘 받든말든 일단 데이터보냄, 에러나면 어플리케이션에서 알아서 처리해야함, 하지만 빠름, 실시간 서비스에서 적절&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장비: 게이트웨이, L4스위치&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;5계층 : 세션계층&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1Wj83/btsHjuY1ae7/btD4WVt89hTDXhEiJjaNYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1Wj83/btsHjuY1ae7/btD4WVt89hTDXhEiJjaNYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1Wj83/btsHjuY1ae7/btD4WVt89hTDXhEiJjaNYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1Wj83%2FbtsHjuY1ae7%2FbtD4WVt89hTDXhEiJjaNYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1214&quot; height=&quot;536&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&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;li&gt;네트워크상 양쪽 연결을 관리하고 연결을 지속시켜줌&lt;/li&gt;
&lt;li&gt;TCP/IP 세션을 만들고 없애는 역할&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;&amp;nbsp;&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;6계층 : 표현계층&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VRWHz/btsHi38sCrb/2zn4BTOEhKX6CpT57FNj40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VRWHz/btsHi38sCrb/2zn4BTOEhKX6CpT57FNj40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VRWHz/btsHi38sCrb/2zn4BTOEhKX6CpT57FNj40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVRWHz%2FbtsHi38sCrb%2F2zn4BTOEhKX6CpT57FNj40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1168&quot; height=&quot;578&quot; data-origin-width=&quot;1168&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;송신, 수신측 사이에서 데이터 형식을 정해줌(jpg, png등)&lt;/li&gt;
&lt;li&gt;7계층으로부터 받거나 주는 데이터의 인코딩, 디코딩이 이루어지는 계층&lt;/li&gt;
&lt;li&gt;프로토콜 : JPG, MPEG, SMB 등&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;&amp;nbsp;&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;7계층 : 응용계층&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfI5Ze/btsHkiYe6JA/g283jqFwNExmxnm6AFDRI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfI5Ze/btsHkiYe6JA/g283jqFwNExmxnm6AFDRI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfI5Ze/btsHkiYe6JA/g283jqFwNExmxnm6AFDRI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfI5Ze%2FbtsHkiYe6JA%2Fg283jqFwNExmxnm6AFDRI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;674&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&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;응용 SW&lt;/li&gt;
&lt;li&gt;프로토콜 : HTTP, DNS, Telnet, FTP등&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;&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;&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;a href=&quot;https://youtu.be/8kI5OIrfZtI?si=-gZMcolC217Aht7y&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/8kI5OIrfZtI?si=-gZMcolC217Aht7y&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=8kI5OIrfZtI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bdCOWG/hyVZkPIGqH/nACD9mNJ3UWV2FHNDeEdb0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;1.[Data 전달 과정] protocol 이란?&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/8kI5OIrfZtI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://backendcode.tistory.com/167&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://backendcode.tistory.com/167&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715187408559&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[네트워크] OSI 7 계층 (OSI 7 Layer)&quot; data-og-description=&quot;이번에는 네트워크의 기본인 OSI 7 계층에 대해 정리할 것이다. 이번 글에서는 OSI 7 계층에 대해 다루고, 다음 글에서는 TCP/IP 4 계층에 대해 다루기 때문에 이어서 보면 이해하기 쉽다.  ️ 목차 &quot; data-og-host=&quot;backendcode.tistory.com&quot; data-og-source-url=&quot;https://backendcode.tistory.com/167&quot; data-og-url=&quot;https://backendcode.tistory.com/167&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nxmBW/hyV2AwCICU/wWgnEuVFJ6h5kffTjocp80/img.jpg?width=800&amp;amp;height=558&amp;amp;face=0_0_800_558,https://scrap.kakaocdn.net/dn/b0DAqQ/hyV2Ey1brS/GJ3EN7gkYWmpkqWoVBpigk/img.jpg?width=800&amp;amp;height=558&amp;amp;face=0_0_800_558,https://scrap.kakaocdn.net/dn/tpPoB/hyV2Acjcp5/0xoGnjlgH2IJ8UkZzEYVKk/img.png?width=1280&amp;amp;height=960&amp;amp;face=0_0_1280_960&quot;&gt;&lt;a href=&quot;https://backendcode.tistory.com/167&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://backendcode.tistory.com/167&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nxmBW/hyV2AwCICU/wWgnEuVFJ6h5kffTjocp80/img.jpg?width=800&amp;amp;height=558&amp;amp;face=0_0_800_558,https://scrap.kakaocdn.net/dn/b0DAqQ/hyV2Ey1brS/GJ3EN7gkYWmpkqWoVBpigk/img.jpg?width=800&amp;amp;height=558&amp;amp;face=0_0_800_558,https://scrap.kakaocdn.net/dn/tpPoB/hyV2Acjcp5/0xoGnjlgH2IJ8UkZzEYVKk/img.png?width=1280&amp;amp;height=960&amp;amp;face=0_0_1280_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[네트워크] OSI 7 계층 (OSI 7 Layer)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 네트워크의 기본인 OSI 7 계층에 대해 정리할 것이다. 이번 글에서는 OSI 7 계층에 대해 다루고, 다음 글에서는 TCP/IP 4 계층에 대해 다루기 때문에 이어서 보면 이해하기 쉽다.  ️ 목차&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;backendcode.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://heisyoung.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://heisyoung.tistory.com/52&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1715187414015&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;OSI 7계층 장비(리피터, 허브, 브리지, 스위치, 라우터)&quot; data-og-description=&quot;1계층(물리 계층) - 리피터, 허브 리피터(Repeater) 긴 케이블일수록 신호가 약해지기 때문에 신호를 멀기 보내기 위한 증폭 장치이다. 지금은 다른 네트워크 장비에 기본적으로 리피터 기능이 탑재&quot; data-og-host=&quot;heisyoung.tistory.com&quot; data-og-source-url=&quot;https://heisyoung.tistory.com/52&quot; data-og-url=&quot;https://heisyoung.tistory.com/52&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/edcY1G/hyVZiYEbkX/5Gy1e6Yu7trTmBdyMt8Kk0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jGC36/hyV2Dz7Exy/BENsYSLP5KmQVCuqc6JYGk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://heisyoung.tistory.com/52&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://heisyoung.tistory.com/52&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/edcY1G/hyVZiYEbkX/5Gy1e6Yu7trTmBdyMt8Kk0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/jGC36/hyV2Dz7Exy/BENsYSLP5KmQVCuqc6JYGk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;OSI 7계층 장비(리피터, 허브, 브리지, 스위치, 라우터)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1계층(물리 계층) - 리피터, 허브 리피터(Repeater) 긴 케이블일수록 신호가 약해지기 때문에 신호를 멀기 보내기 위한 증폭 장치이다. 지금은 다른 네트워크 장비에 기본적으로 리피터 기능이 탑재&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;heisyoung.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층형 모델 (OSI 7Layer)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 통신 장비들끼리 호환되도록 표준을 만든것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터가 전달되기위한 과정을 계층화 (ISO, DoD)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 7단계중 한 곳에 이상이 생기면 다른 단계의 장비나 소프트웨어를 건들지 않아도 고칠 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 복잡도를 줄이고 모듈화를 통한 기술발전, 호환성, 상호독립성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 규칙을 따라야 네트워크 장비로서 다른 장비와 상호작용 가능&lt;/p&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYp4ok/btsHclW2Nck/ec5Ouh6bESsBD0m4Rg8KE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYp4ok/btsHclW2Nck/ec5Ouh6bESsBD0m4Rg8KE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYp4ok/btsHclW2Nck/ec5Ouh6bESsBD0m4Rg8KE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYp4ok%2FbtsHclW2Nck%2Fec5Ouh6bESsBD0m4Rg8KE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;1140&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층별 PDU(Process Data Unit)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1계층 - 비트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2계층 - 프레임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3계층 - 패킷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4계층 - 세그먼트&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;어플리케이션층에서 만들어진  data가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tcp udp 정보를 담은 세그먼트가 되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip정보가 담긴 헤더가 붙은 패킷이 되고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패킷의 정보에 이더넷 프로토콜의 정보를 담아서 프레임이되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 프레임이 전기적 신호로 전달됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;/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;Encapsulation / Decapsulation&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어플리케이션에서 만들어진 데이터가 해당 디바이스에서 네트워크를 통해 전달되는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 계층에서 동작하는 프로토콜별로 정보(헤더)가 추가되거나 벗겨지는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-05-08 오전 1.13.21.png&quot; data-origin-width=&quot;3066&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvLgDF/btsHgDhocKT/PcRWhjTtrwJ5sJhPrXdHJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvLgDF/btsHgDhocKT/PcRWhjTtrwJ5sJhPrXdHJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvLgDF/btsHgDhocKT/PcRWhjTtrwJ5sJhPrXdHJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvLgDF%2FbtsHgDhocKT%2FPcRWhjTtrwJ5sJhPrXdHJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3066&quot; height=&quot;1012&quot; data-filename=&quot;스크린샷 2024-05-08 오전 1.13.21.png&quot; data-origin-width=&quot;3066&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&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;프레젠테이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내려가며 헤더가 붙음 -&amp;gt; 인캡슐레이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 헤더를 하나씩 떼어가며 정보를 읽는것 -&amp;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;어플리케이션 - 데이터 생성&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;트랜스포트 - 세그먼트 생성 (세그먼트 = 포트정보+데이터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디포트 : http이기에 80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소스포트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 레이어 - 패킷 생성 (패킷 = 세그먼트 + ip정보)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dip(dns를 통해서 google.com의 ip를 획득하는 과정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소스ip(내 ip)&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;데이터링크 레이어 - 프레임 생성 (프레임 = 이더넷헤더 + 세그먼트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이더넷헤더 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- dMAC(나와 연결된 같은 네트워크에서 어떤놈이 이 데이터를 받을지) (넥스트 홉)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소스MAC(내 기기의 MAC))&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;넥스트홉ip를 알아내는 과정을 라우팅이라고 함&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;d는 destination(어디로 보낼지에 대한)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dip는 dns를 통해서&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dMAC은 라우팅과 ARP를 통해서&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;라우터는 dip를 보고 어디로 보내야할지를 결정 - 라우팅 테이블을 통해서&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;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>네트워크</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/107</guid>
      <comments>https://llshl.tistory.com/107#entry107comment</comments>
      <pubDate>Wed, 8 May 2024 01:35:23 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 유니캐스트, 멀티캐스트, 브로드캐스트, 애니캐스트</title>
      <link>https://llshl.tistory.com/106</link>
      <description>&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unicast
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1대1 통신&lt;/li&gt;
&lt;li&gt;대부분 이거&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8KoYi/btsHfCDpMxY/Q0yMRxBtRLtsWkVkAJBzZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8KoYi/btsHfCDpMxY/Q0yMRxBtRLtsWkVkAJBzZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8KoYi/btsHfCDpMxY/Q0yMRxBtRLtsWkVkAJBzZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8KoYi%2FbtsHfCDpMxY%2FQ0yMRxBtRLtsWkVkAJBzZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;389&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Broadcast
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1대 N통신, 동일 네트워크에 존재하는 모든 호스트가 목적지&lt;/li&gt;
&lt;li&gt;유니캐스트로 통신하기 전 상대방의 정확한 위치를 알기위해 사용&lt;/li&gt;
&lt;li&gt;목적지가 전체이기에 과도하게 사용하면 성능저하&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1ADZ/btsHdck0tV9/LwtnMuKIeKZrzlqt6Dlbc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1ADZ/btsHdck0tV9/LwtnMuKIeKZrzlqt6Dlbc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1ADZ/btsHdck0tV9/LwtnMuKIeKZrzlqt6Dlbc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1ADZ%2FbtsHdck0tV9%2FLwtnMuKIeKZrzlqt6Dlbc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;491&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Multicast
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1대 그룹, 하나의 출발지에서 다수의 특정 목적지&lt;/li&gt;
&lt;li&gt;사내 방송같이 단방향으로 다수에게 동시에 같은 내용을 전달할때 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5wJC7/btsHdwRnTYv/uojXEdh1NmLoyeg1A3VEBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5wJC7/btsHdwRnTYv/uojXEdh1NmLoyeg1A3VEBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5wJC7/btsHdwRnTYv/uojXEdh1NmLoyeg1A3VEBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5wJC7%2FbtsHdwRnTYv%2FuojXEdh1NmLoyeg1A3VEBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;469&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Anycast
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1대1 통신(동일 그룹 내의 1개 호스트), 다수의 동일 그룹중 가장 가까운 호스트에서 응답&lt;/li&gt;
&lt;li&gt;유니캐스트와 동일하지만 애니캐스트는 통신 가능한 다수의 후보군이 있다&lt;/li&gt;
&lt;li&gt;IPv4에서는 일부기능 구현&lt;/li&gt;
&lt;li&gt;IPv6에서는 모두 구현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zZAjF/btsHedKQYSh/CXtrf4gDGaFbi0hiJkVCGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zZAjF/btsHedKQYSh/CXtrf4gDGaFbi0hiJkVCGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zZAjF/btsHedKQYSh/CXtrf4gDGaFbi0hiJkVCGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzZAjF%2FbtsHedKQYSh%2FCXtrf4gDGaFbi0hiJkVCGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;476&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVFJX/btsHdfvhh5S/M2LP6X4tGvAzndHjCn3290/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVFJX/btsHdfvhh5S/M2LP6X4tGvAzndHjCn3290/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVFJX/btsHdfvhh5S/M2LP6X4tGvAzndHjCn3290/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVFJX%2FbtsHdfvhh5S%2FM2LP6X4tGvAzndHjCn3290%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;411&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://rooftoproom-whale.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://rooftoproom-whale.tistory.com/14&lt;/a&gt;&lt;/p&gt;</description>
      <category>네트워크</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/106</guid>
      <comments>https://llshl.tistory.com/106#entry106comment</comments>
      <pubDate>Mon, 6 May 2024 20:28:59 +0900</pubDate>
    </item>
    <item>
      <title>postgres with docker compose gives FATAL: role &amp;quot;root&amp;quot; does not exist error</title>
      <link>https://llshl.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;docker의 postgres에서 psql로 접속하려했더니 위와같은 권한에러가 발생했다.&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;docker compose yml에서 docker-compose up 할 때&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1681983309908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    environment:
      # PostgreSQL 계정 및 패스워드 설정 옵션
      PGUSER: my-user&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 키값을 PSUSER로 설정해줘야한다&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;원래는 POSTGRES_USER였음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1681983347094&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;postgres with docker compose gives FATAL: role &amp;quot;root&amp;quot; does not exist error&quot; data-og-description=&quot;I'm trying to create a simple demo with postgres on a local windows machine with docker desktop. This is my yaml docker compose file named img.yaml: version: '3.6' services: postgres-demo: ...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error&quot; data-og-url=&quot;https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bArGms/hySlF2N5ur/BxWzfSs9xQP4wdT67oTkAK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/60193781/postgres-with-docker-compose-gives-fatal-role-root-does-not-exist-error&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bArGms/hySlF2N5ur/BxWzfSs9xQP4wdT67oTkAK/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;postgres with docker compose gives FATAL: role &quot;root&quot; does not exist error&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I'm trying to create a simple demo with postgres on a local windows machine with docker desktop. This is my yaml docker compose file named img.yaml: version: '3.6' services: postgres-demo: ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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>삽질</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/94</guid>
      <comments>https://llshl.tistory.com/94#entry94comment</comments>
      <pubDate>Thu, 20 Apr 2023 18:35:48 +0900</pubDate>
    </item>
    <item>
      <title>[docker] 도커 초기화하기</title>
      <link>https://llshl.tistory.com/93</link>
      <description>&lt;pre id=&quot;code_1681980230942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker system prune --all --force&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DevOps</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/93</guid>
      <comments>https://llshl.tistory.com/93#entry93comment</comments>
      <pubDate>Thu, 20 Apr 2023 17:43:58 +0900</pubDate>
    </item>
    <item>
      <title>[Redis] Redis로 분산락 구현하기</title>
      <link>https://llshl.tistory.com/92</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccMEoW/btr94ijgVPm/FP4d9stbV6NGXSR0CqbWn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccMEoW/btr94ijgVPm/FP4d9stbV6NGXSR0CqbWn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccMEoW/btr94ijgVPm/FP4d9stbV6NGXSR0CqbWn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccMEoW%2Fbtr94ijgVPm%2FFP4d9stbV6NGXSR0CqbWn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;401&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qY3GX/btr97o4hGFh/axiFsw5TkzQCbzkEk6kKH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qY3GX/btr97o4hGFh/axiFsw5TkzQCbzkEk6kKH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qY3GX/btr97o4hGFh/axiFsw5TkzQCbzkEk6kKH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqY3GX%2Fbtr97o4hGFh%2FaxiFsw5TkzQCbzkEk6kKH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;731&quot; height=&quot;464&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 이미지처럼 하나의 자원(상품 재고)에 여러 서버에서 동시에 접근을 한다면 데이터 정합성이 깨질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 레디스를 사용해서 잠금(락)을 걸어주어 한번에 하나의 서버에서만 자원에 접근하도록 제한하는것이 분산락이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W174i/btr90UKMbpr/cUnKpXgP1Ic5C0J3QTPw8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W174i/btr90UKMbpr/cUnKpXgP1Ic5C0J3QTPw8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W174i/btr90UKMbpr/cUnKpXgP1Ic5C0J3QTPw8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW174i%2Fbtr90UKMbpr%2FcUnKpXgP1Ic5C0J3QTPw8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1161&quot; height=&quot;616&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주문서버와 정산서버가 거의 동시에 레디스에 Lock을 시도했지만 주문서버가 성공했고, 주문서버가 상품재고에 요청을 보낼 수 있는 자격이 생긴것이다.&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;&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;다음 그림과 같이 멀티 인스턴스 환경에서 각 인스턴스마다 DB에 어떤 트랜잭션을 날리는 스케줄러가 동작하고있을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;READ라면 상관없겠지만 DB의 상태를 변경시키는 트랜잭션을 동시다발적으로 날리면 우리가 예상한 결과와 달라질 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMsxpO/btr93lN48RZ/kVlt6Gw6FjIf3mkpQobui0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMsxpO/btr93lN48RZ/kVlt6Gw6FjIf3mkpQobui0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMsxpO/btr93lN48RZ/kVlt6Gw6FjIf3mkpQobui0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMsxpO%2Fbtr93lN48RZ%2FkVlt6Gw6FjIf3mkpQobui0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;443&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YgNEk/btr93m7dGIu/nDb9jqOJoYMWgISsaFll80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YgNEk/btr93m7dGIu/nDb9jqOJoYMWgISsaFll80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YgNEk/btr93m7dGIu/nDb9jqOJoYMWgISsaFll80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYgNEk%2Fbtr93m7dGIu%2FnDb9jqOJoYMWgISsaFll80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;248&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드처럼 10초마다 디비의 count를 1씩 증가시켜주는 스케줄러가 있다고 해보자.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brsUWn/btr902aXggz/sEHXPB8YtgJYr98lmxZib1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brsUWn/btr902aXggz/sEHXPB8YtgJYr98lmxZib1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brsUWn/btr902aXggz/sEHXPB8YtgJYr98lmxZib1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrsUWn%2Fbtr902aXggz%2FsEHXPB8YtgJYr98lmxZib1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1572&quot; height=&quot;762&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pm2를 사용하여 로컬에서 10개의 인스턴스를 실행시켜보면&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwBpwa/btr9V9nUl8K/T7dEmdJsRnryxrGVeAXkHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwBpwa/btr9V9nUl8K/T7dEmdJsRnryxrGVeAXkHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwBpwa/btr9V9nUl8K/T7dEmdJsRnryxrGVeAXkHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwBpwa%2Fbtr9V9nUl8K%2FT7dEmdJsRnryxrGVeAXkHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1486&quot; height=&quot;310&quot; data-origin-width=&quot;1486&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 스케줄러가 한 번 실행될때마다 10개의 인스턴스에서 각각 count를 1씩 더하는 쿼리가 발생하게되고 결과적으로 한번에 10씩 count가 더해진다&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C4f9D/btr96Qmfri3/UFGK6Gk3WiiOw1KJl6N6f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C4f9D/btr96Qmfri3/UFGK6Gk3WiiOw1KJl6N6f1/img.png&quot; data-alt=&quot;70초 경과하면 70이 된다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C4f9D/btr96Qmfri3/UFGK6Gk3WiiOw1KJl6N6f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC4f9D%2Fbtr96Qmfri3%2FUFGK6Gk3WiiOw1KJl6N6f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1228&quot; height=&quot;150&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;70초 경과하면 70이 된다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;적용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1632&quot; data-origin-height=&quot;1022&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWwizb/btr95pI9GCc/u3TjqtvXheI47D19VhFY40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWwizb/btr95pI9GCc/u3TjqtvXheI47D19VhFY40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWwizb/btr95pI9GCc/u3TjqtvXheI47D19VhFY40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWwizb%2Fbtr95pI9GCc%2Fu3TjqtvXheI47D19VhFY40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1632&quot; height=&quot;1022&quot; data-origin-width=&quot;1632&quot; data-origin-height=&quot;1022&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레디스를 추가하여 Lock을 획득한 인스턴스만 쿼리를 발생시키도록 제한해보자&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SXksT/btr902ov6JB/GkXgzyXZmvokUP04OVF2a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SXksT/btr902ov6JB/GkXgzyXZmvokUP04OVF2a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SXksT/btr902ov6JB/GkXgzyXZmvokUP04OVF2a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSXksT%2Fbtr902ov6JB%2FGkXgzyXZmvokUP04OVF2a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1334&quot; height=&quot;556&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레디스로 분산락은 이렇게 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setLock은 레디스 저장소에 key-value 하나를 추가해주는 것이고 이 동작이 10개의 인스턴스에서 동시에 실행되겠지만 그 중에서 가장 빠른 인스턴스만 성공할 것이고 나머지 9개의 인스턴스는 락에 실패할 것이다. (이미 존재하는 key이기에)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdngj6/btr97nK4jJs/SKneeFnuSpgtQZX0tm561K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdngj6/btr97nK4jJs/SKneeFnuSpgtQZX0tm561K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdngj6/btr97nK4jJs/SKneeFnuSpgtQZX0tm561K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdngj6%2Fbtr97nK4jJs%2FSKneeFnuSpgtQZX0tm561K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;101&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;1126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pwVMo/btr92qIUIGV/SmkkldiQbSZqZwZ9h652G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pwVMo/btr92qIUIGV/SmkkldiQbSZqZwZ9h652G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pwVMo/btr92qIUIGV/SmkkldiQbSZqZwZ9h652G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpwVMo%2Fbtr92qIUIGV%2FSmkkldiQbSZqZwZ9h652G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;530&quot; data-origin-width=&quot;1333&quot; data-origin-height=&quot;1126&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모종의 이유로 delLock()이 동작하지 않을 수 있기에 EX 설정을 하여 자동으로 expire 되도록 내부에 설정해주었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;NX설정은 이미 key가 존재하면 생성을 막도록 하는 설정이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HWFbY/btr91UcolNY/AuOCWvmPsRaJwq0T6BjiF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HWFbY/btr91UcolNY/AuOCWvmPsRaJwq0T6BjiF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HWFbY/btr91UcolNY/AuOCWvmPsRaJwq0T6BjiF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHWFbY%2Fbtr91UcolNY%2FAuOCWvmPsRaJwq0T6BjiF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;505&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 10개의 인스턴스에서 락에 성공한 인스턴스만 쿼리를 실행하는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>NodeJS</category>
      <category>nestjs</category>
      <category>NoSQL</category>
      <category>Redis</category>
      <category>sql</category>
      <category>레디스</category>
      <category>분산락</category>
      <category>스케줄러</category>
      <category>타입스크립트</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/92</guid>
      <comments>https://llshl.tistory.com/92#entry92comment</comments>
      <pubDate>Fri, 14 Apr 2023 03:16:11 +0900</pubDate>
    </item>
    <item>
      <title>[Typeorm] save() 알차게 사용하기</title>
      <link>https://llshl.tistory.com/91</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSjKQk/btr7dU75hv8/kjtMz582f0JA6kxeZLyRVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSjKQk/btr7dU75hv8/kjtMz582f0JA6kxeZLyRVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSjKQk/btr7dU75hv8/kjtMz582f0JA6kxeZLyRVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSjKQk%2Fbtr7dU75hv8%2FkjtMz582f0JA6kxeZLyRVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1494&quot; height=&quot;494&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Typeorm 문서에는 save() 메소드를 이렇게 설명한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔티티가 이미 존재하면 update&lt;/li&gt;
&lt;li&gt;엔티티가 존재하지 않으면 insert&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;p data-ke-size=&quot;size16&quot;&gt;그렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;save() 메소드를 호출하면 select쿼리를 한번 실행시키고 그 뒤에 insert나 update 쿼리를 실행시킨다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 쿼리가 두번 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb5nCb/btr7fZN5h8X/yDGsvVGcIy5LUpjAOESL4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb5nCb/btr7fZN5h8X/yDGsvVGcIy5LUpjAOESL4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb5nCb/btr7fZN5h8X/yDGsvVGcIy5LUpjAOESL4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb5nCb%2Fbtr7fZN5h8X%2FyDGsvVGcIy5LUpjAOESL4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;451&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요런 코드를 돌려보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1]에서 콘텐츠 엔티티를 저장하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[2]에서 저장한 엔티티를 조회하여 수정하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[3]에서 수정한 엔티티를 다시 저장해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리는 어떻게 발생할까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;803&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/72VPR/btr7d7lyoYo/nQMhOkfEh0W9acYl7etPk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/72VPR/btr7d7lyoYo/nQMhOkfEh0W9acYl7etPk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/72VPR/btr7d7lyoYo/nQMhOkfEh0W9acYl7etPk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F72VPR%2Fbtr7d7lyoYo%2FnQMhOkfEh0W9acYl7etPk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;803&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;803&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[1]에서는 기존에 없던 저장돼 있지 않던 엔티티이기에 select 쿼리 이후 insert쿼리가 발생한 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[3]에서는 해당 엔티티의 pk기준으로 이미 존재하는 엔티티이기에 select 쿼리이후 update 쿼리가 발생한 것을 볼 수 있다.&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;근데 이제 select 쿼리는 계속 발생한다는 말인데 만약 저장하거나 수정해야 할 데이터가 많다면 각 쿼리마다 select 쿼리가 발생할텐데 상당히 비효율적이 아닐수가 없다.&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;직접 update() 메소드나 insert() 메소드를 사용하면 이런 문제를 개선할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eIMIDs/btr7hwdeOoS/NJ3rZG8fbvL0KcP4F8VFuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eIMIDs/btr7hwdeOoS/NJ3rZG8fbvL0KcP4F8VFuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eIMIDs/btr7hwdeOoS/NJ3rZG8fbvL0KcP4F8VFuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeIMIDs%2Fbtr7hwdeOoS%2FNJ3rZG8fbvL0KcP4F8VFuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;256&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eF9r4k/btr7dOT5uqi/RzSh3xjHbgkKedH7mik9qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eF9r4k/btr7dOT5uqi/RzSh3xjHbgkKedH7mik9qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eF9r4k/btr7dOT5uqi/RzSh3xjHbgkKedH7mik9qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeF9r4k%2Fbtr7dOT5uqi%2FRzSh3xjHbgkKedH7mik9qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;252&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얌전하게 하나의 쿼리만 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;물론 save() 메소드가 주는 편리함을 포기하고 사용하는 것이므로 update나 insert를 할 때 디비에 중복되는 데이터가 이미 존재하는지 확인된 상태에서 사용하는것을 권한다. save()는 그냥 무지성으로 사용해도 pk가 겹치는게 아닌 이상 의도한대로 동작은 했는데 update(), insert()는 아니다.&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;</description>
      <category>DB</category>
      <author>llshl</author>
      <guid isPermaLink="true">https://llshl.tistory.com/91</guid>
      <comments>https://llshl.tistory.com/91#entry91comment</comments>
      <pubDate>Sat, 1 Apr 2023 03:21:23 +0900</pubDate>
    </item>
  </channel>
</rss>