<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>GHY 's TechBlog</title>
    <link>https://gh402.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 27 Aug 2026 09:36:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>GaGah</managingEditor>
    <image>
      <title>GHY 's TechBlog</title>
      <url>https://tistory1.daumcdn.net/tistory/3587364/attach/d0decf724f7a4e8f8cbb3c8c5e5a1314</url>
      <link>https://gh402.tistory.com</link>
    </image>
    <item>
      <title>[회고] 2024년도 연말결산</title>
      <link>https://gh402.tistory.com/79</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;늦은 2024년도 회고를 해보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년 중 1월이 벌써 흘렀지만,, 안하는 것보다는 낫겠지? 라는 생각으로 몇 글자 적어보려고 한다.&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;12월까지 바쁘고 힘든 하루하루를 보내고, 충전할 시간이 필요했다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;b&gt;  2024년도에는 뭐했나?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1) 꾸준한 운동&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XAyTC/btsL4NmlreZ/6c8q7CLziQ9Kl4cc0Kkvnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XAyTC/btsL4NmlreZ/6c8q7CLziQ9Kl4cc0Kkvnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XAyTC/btsL4NmlreZ/6c8q7CLziQ9Kl4cc0Kkvnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXAyTC%2FbtsL4NmlreZ%2F6c8q7CLziQ9Kl4cc0Kkvnk%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;320&quot; height=&quot;427&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[보드]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 보드 타는 걸 최근에 시작했는데, 이제 매해 겨울이 되면, 이벤트 성으로 2-3번 이상은 꼭 간다.&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;또, 2024년도에는 회사 사람들이랑도 스키장을 갔었다.&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;&lt;b&gt;[필라테스]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1년을 꾸준히 했다.(주 2일) 그럼에도 유연해질지 모르는 몸이다.&amp;nbsp;&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[헬스장 방문]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할 줄 아는 운동이라고는 유산소용으로 러닝머신 뛰기&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;size18&quot;&gt;&lt;b&gt;2) 맛집 블로그 운영&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;2003&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJngLE/btsL4xcX3tv/cqY2qndO1LNl4Yj5dKYzY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJngLE/btsL4xcX3tv/cqY2qndO1LNl4Yj5dKYzY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJngLE/btsL4xcX3tv/cqY2qndO1LNl4Yj5dKYzY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJngLE%2FbtsL4xcX3tv%2FcqY2qndO1LNl4Yj5dKYzY0%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;333&quot; height=&quot;352&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1895&quot; data-origin-height=&quot;2003&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;(그래야 블로그 조회수나 상위 노출될 확률이 높다.)&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;size18&quot;&gt;&lt;b&gt;3) 이사&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2154&quot; data-origin-height=&quot;2631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIQWD8/btsL4zhD1rm/oclxX0WMrRTm5wcTRnnKuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIQWD8/btsL4zhD1rm/oclxX0WMrRTm5wcTRnnKuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIQWD8/btsL4zhD1rm/oclxX0WMrRTm5wcTRnnKuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIQWD8%2FbtsL4zhD1rm%2FoclxX0WMrRTm5wcTRnnKuk%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;341&quot; height=&quot;455&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;2154&quot; data-origin-height=&quot;2631&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;좁은 원룸에서 벗어나면 공부라던지 하고 싶은 일을 더 잘할 수 있게 되지 않을까 해서 옮기게 되었다.&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;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4) 대리 진급&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VkcV/btsL4Jc9DOy/CeSA2vOBKKqYhwuyiKDWF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VkcV/btsL4Jc9DOy/CeSA2vOBKKqYhwuyiKDWF0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VkcV/btsL4Jc9DOy/CeSA2vOBKKqYhwuyiKDWF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VkcV%2FbtsL4Jc9DOy%2FCeSA2vOBKKqYhwuyiKDWF0%2Fimg.jpg&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;273&quot; height=&quot;364&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;어쨋든 이 직급이 되었으니 이유 모를 책임감과 압박감만 받은 채로 시간이 흘렀고,,, 시간 참 빠르다 생각했다.&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;size18&quot;&gt;&lt;b&gt;5) 동기의 이직&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평소에 의지하고 힘든 회사 생활을 겪어가던 같은 팀에 있던 동기가 이직을 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌면 이직을 빡세게 준비하게 된 계기가 되었다. (고마워 )&lt;/p&gt;
&lt;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;size18&quot;&gt;&lt;b&gt;6) 이직&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;2388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efMv1C/btsL4bHY9yn/swHeNjYiyr6mBqOnmAktdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efMv1C/btsL4bHY9yn/swHeNjYiyr6mBqOnmAktdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efMv1C/btsL4bHY9yn/swHeNjYiyr6mBqOnmAktdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefMv1C%2FbtsL4bHY9yn%2FswHeNjYiyr6mBqOnmAktdk%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;221&quot; height=&quot;289&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;2388&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;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;거의 막바지에는 밥먹다가 그냥 눈물이 주르륵 흐를 정도로 힘들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 취업 준비하는 것보다 5배로 힘들었다. 공고가 많이 없기도 했고, 회사 일도 해야했기 때문에..&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&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIePfC/btsL3xrgSs0/TXeHUnRGfUfw3aMVj3KZE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIePfC/btsL3xrgSs0/TXeHUnRGfUfw3aMVj3KZE1/img.png&quot; data-origin-width=&quot;1949&quot; data-origin-height=&quot;2220&quot; data-is-animation=&quot;false&quot; data-filename=&quot;blob&quot; width=&quot;312&quot; data-widthpercent=&quot;53.93&quot; style=&quot;width: 53.3021%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIePfC/btsL3xrgSs0/TXeHUnRGfUfw3aMVj3KZE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIePfC%2FbtsL3xrgSs0%2FTXeHUnRGfUfw3aMVj3KZE1%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;1949&quot; height=&quot;2220&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5YxQV/btsL5lbOiYt/EsEhknpUdLy4OxHv6GGyY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5YxQV/btsL5lbOiYt/EsEhknpUdLy4OxHv6GGyY0/img.png&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;3000&quot; data-is-animation=&quot;false&quot; width=&quot;320&quot; data-filename=&quot;blob&quot; style=&quot;width: 45.5351%;&quot; data-widthpercent=&quot;46.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5YxQV/btsL5lbOiYt/EsEhknpUdLy4OxHv6GGyY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5YxQV%2FbtsL5lbOiYt%2FEsEhknpUdLy4OxHv6GGyY0%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;2250&quot; height=&quot;3000&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고록</category>
      <category>2024회고</category>
      <category>2024회고록</category>
      <category>회고록</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/79</guid>
      <comments>https://gh402.tistory.com/79#entry79comment</comments>
      <pubDate>Sat, 1 Feb 2025 17:26:02 +0900</pubDate>
    </item>
    <item>
      <title>[Redis] Redis 서버 실행 및 명령어</title>
      <link>https://gh402.tistory.com/78</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  들어가기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;Redis 서버 실행 및 명령어들을 사용하게 되는데, 가끔 까먹는 것도 있어서 정리해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  Redis 서버 실행하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;로컬에서 Redis 서버 실행하기 (redis-server가 없다면, 설치 후 실행하세요!)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688891959487&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redis-server&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;스크린샷 2023-07-09 오후 5.38.41.png&quot; data-origin-width=&quot;2886&quot; data-origin-height=&quot;874&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvzTYL/btsmRsgxmLR/kpJCNBTrbcVqp8DldIL4I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvzTYL/btsmRsgxmLR/kpJCNBTrbcVqp8DldIL4I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvzTYL/btsmRsgxmLR/kpJCNBTrbcVqp8DldIL4I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvzTYL%2FbtsmRsgxmLR%2FkpJCNBTrbcVqp8DldIL4I0%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;1042&quot; height=&quot;316&quot; data-filename=&quot;스크린샷 2023-07-09 오후 5.38.41.png&quot; data-origin-width=&quot;2886&quot; data-origin-height=&quot;874&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  Redis client 접속 및 명령어&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Redis client 접속&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688892922991&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;redis-cli -h 127.0.0.1 -p 6379&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-09 오후 5.55.59.png&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bibNzi/btsmZfULljH/5afts9Sj3UK9RwYywzBV2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bibNzi/btsmZfULljH/5afts9Sj3UK9RwYywzBV2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bibNzi/btsmZfULljH/5afts9Sj3UK9RwYywzBV2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbibNzi%2FbtsmZfULljH%2F5afts9Sj3UK9RwYywzBV2K%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;532&quot; height=&quot;118&quot; data-filename=&quot;스크린샷 2023-07-09 오후 5.55.59.png&quot; data-origin-width=&quot;858&quot; data-origin-height=&quot;190&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;모든 key값 조회&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실제 운영 환경에서는 조심해서 사용해야한다. (사용하지 않는 것을 권장)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688893025205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;keys&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;size18&quot;&gt;&lt;b&gt;값 저장&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688893445838&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;set ga 123&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;size18&quot;&gt;&lt;b&gt;값 조회&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688893453185&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;get ga&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-09 오후 6.03.32.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tFFmg/btsmQfaWuOu/enm5KoeUIyDUkwCpluAxWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tFFmg/btsmQfaWuOu/enm5KoeUIyDUkwCpluAxWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tFFmg/btsmQfaWuOu/enm5KoeUIyDUkwCpluAxWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtFFmg%2FbtsmQfaWuOu%2Fenm5KoeUIyDUkwCpluAxWK%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;569&quot; height=&quot;147&quot; data-filename=&quot;스크린샷 2023-07-09 오후 6.03.32.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;200&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;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/DB</category>
      <category>Get</category>
      <category>KEYS</category>
      <category>redis</category>
      <category>redis cli</category>
      <category>redis 명령어</category>
      <category>redis 서버 실행</category>
      <category>redis 서버실행</category>
      <category>redis 접속방법</category>
      <category>redis-cli</category>
      <category>Set</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/78</guid>
      <comments>https://gh402.tistory.com/78#entry78comment</comments>
      <pubDate>Sun, 9 Jul 2023 18:18:19 +0900</pubDate>
    </item>
    <item>
      <title>iTerm2  MAC 터미널 커스텀</title>
      <link>https://gh402.tistory.com/77</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;MacBook 터미널 커스텀 포스팅&lt;/b&gt;을 드디어 하네요!&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;u&gt;한번 셋팅하면 끝! &lt;/u&gt;&amp;nbsp;이다보니.. 안하다가 &lt;/span&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이번에 터미널 셋팅을 해야해서 겸사겸사 포스팅도 같이 해봅니다!&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;edited_스크린샷 2023-05-09 오후 2.59.55.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7wyoZ/btsgKpqTKFx/t9An6jVGkOOyvXebzB8ulk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7wyoZ/btsgKpqTKFx/t9An6jVGkOOyvXebzB8ulk/img.png&quot; data-alt=&quot;셋팅 완료 후 neofetch 조회 후 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7wyoZ/btsgKpqTKFx/t9An6jVGkOOyvXebzB8ulk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7wyoZ%2FbtsgKpqTKFx%2Ft9An6jVGkOOyvXebzB8ulk%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;567&quot; height=&quot;408&quot; data-filename=&quot;edited_스크린샷 2023-05-09 오후 2.59.55.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;셋팅 완료 후 neofetch 조회 후 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  iTerm2 설치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1) iterm2 홈페이지에서 다운로드&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;링크 : &lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://iterm2.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://iterm2.com/&lt;/a&gt;&lt;/span&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2) 위에서 다운받은 iTerm2를 열고, 아래의 명령어 실행&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683599470909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3) zsh 설치&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683600021345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install zsh&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;h2 id=&quot;2-oh-my-zhs-설치&quot; style=&quot;background-color: #ffffff; color: #454545; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;   Oh-my-zhs 설치&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;홈페이지 : &lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#cloud&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#cloud&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1684771584019&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Themes&quot; data-og-description=&quot;  A delightful community-driven (with 2,100+ contributors) framework for managing your zsh configuration. Includes 300+ optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, pyth...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#cloud&quot; data-og-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bD03wz/hySG9xcwPG/q6EfnPT7kZYevKwZrBsxlK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640&quot;&gt;&lt;a href=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#cloud&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#cloud&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bD03wz/hySG9xcwPG/q6EfnPT7kZYevKwZrBsxlK/img.png?width=1280&amp;amp;height=640&amp;amp;face=0_0_1280_640');&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;Themes&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  A delightful community-driven (with 2,100+ contributors) framework for managing your zsh configuration. Includes 300+ optional plugins (rails, git, macOS, hub, docker, homebrew, node, php, pyth...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위 링크를 클릭하면, 터미널의 여러 테마들이 있는데, 원하는 걸 골라서 아래 명령어 실행해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683597279276&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// sh -c &quot;$(curl -fsSl 원하는테마추가)
sh -c &quot;$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  텍스트 색상 변경하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;iterm2 색상&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;링크 : &lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://iterm2colorschemes.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://iterm2colorschemes.com/&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1683599546572&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;Iterm Themes - Color Schemes and Themes for Iterm2&quot; data-og-description=&quot;&quot; data-og-host=&quot;iterm2colorschemes.com&quot; data-og-source-url=&quot;https://iterm2colorschemes.com/&quot; data-og-url=&quot;https://iterm2colorschemes.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nuO3b/hySyq53peT/a0Az4oy7wqKG8rgFRJhwJ1/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/dmsKLV/hySyfQ1p8Z/RlyIFbrKA9fRtDKtPBtMU0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/f5cH6/hySysiuVuk/YOzkCccDEq7yZ9YJRfMwPk/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300&quot;&gt;&lt;a href=&quot;https://iterm2colorschemes.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://iterm2colorschemes.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nuO3b/hySyq53peT/a0Az4oy7wqKG8rgFRJhwJ1/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/dmsKLV/hySyfQ1p8Z/RlyIFbrKA9fRtDKtPBtMU0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/f5cH6/hySysiuVuk/YOzkCccDEq7yZ9YJRfMwPk/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300');&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;Iterm Themes - Color Schemes and Themes for Iterm2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;iterm2colorschemes.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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1) 위 링크에서 확인해보고, 원하는 색상을 골라서 다운해주면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683599595433&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://raw.githubusercontent.com/mbadolato/iTerm2-Color-Schemes/master/schemes/Tomorrow%20Night.itermcolors&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2) 다운을 했다면, iTerm &amp;gt; Preferences&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-09 오전 10.45.10.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;934&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blTGII/btseqXcj02s/ImFWmZ2s3vZKYrWT03NiC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blTGII/btseqXcj02s/ImFWmZ2s3vZKYrWT03NiC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blTGII/btseqXcj02s/ImFWmZ2s3vZKYrWT03NiC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblTGII%2FbtseqXcj02s%2FImFWmZ2s3vZKYrWT03NiC0%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;327&quot; height=&quot;448&quot; data-filename=&quot;스크린샷 2023-05-09 오전 10.45.10.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;934&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;iTerm &amp;gt; Preferences &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;gt; Profiles &amp;gt; Colors 에서 다운 받은 iterm themes를 import 해주고 선택해주면 끝!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-09 오전 11.04.30.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;1466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqutgn/btseqYVFmwV/unIK5E8Jk2syiks5kXu7Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqutgn/btseqYVFmwV/unIK5E8Jk2syiks5kXu7Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqutgn/btseqYVFmwV/unIK5E8Jk2syiks5kXu7Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqutgn%2FbtseqYVFmwV%2FunIK5E8Jk2syiks5kXu7Vk%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;1852&quot; height=&quot;1466&quot; data-filename=&quot;스크린샷 2023-05-09 오전 11.04.30.png&quot; data-origin-width=&quot;1852&quot; data-origin-height=&quot;1466&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;&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;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  Font 수정하기&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;iTerm &amp;gt; Preferences&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;gt; Profiles &amp;gt; Text 에서 원하시는 폰트/사이즈를 맞춰서 수정!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;참고) Hack 폰트는 아래 링크에서 다운하면 됩니다!&lt;/span&gt;&lt;/span&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;a href=&quot;https://sourcefoundry.org/hack/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sourcefoundry.org/hack/&lt;/a&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;1838&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/41ySJ/btsg2ZQ7uw8/McTsKzULv2RkO1L4govVY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/41ySJ/btsg2ZQ7uw8/McTsKzULv2RkO1L4govVY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/41ySJ/btsg2ZQ7uw8/McTsKzULv2RkO1L4govVY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F41ySJ%2Fbtsg2ZQ7uw8%2FMcTsKzULv2RkO1L4govVY1%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;1838&quot; height=&quot;924&quot; data-origin-width=&quot;1838&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  /.zshrc 변경&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1684772704829&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 편집기 열기
vi /.zshrc

# ZSH_THEME 변경
ZSH_THEME=&quot;agnoster&quot;

# 맨 아래에 추가
prompt_context() {
  if [[ &quot;$USER&quot; != &quot;$DEFAULT_USER&quot; || -n &quot;$SSH_CLIENT&quot; ]]; then
    prompt_segment black default &quot;%(!.%{%F{yellow}%}.)$USER&quot;
  fi
}&lt;/code&gt;&lt;/pre&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;스크린샷 2023-05-09 오전 10.52.32.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfGO2N/btsevm3keoO/35bLmBjjp4M6Ky7ALWIHAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfGO2N/btsevm3keoO/35bLmBjjp4M6Ky7ALWIHAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfGO2N/btsevm3keoO/35bLmBjjp4M6Ky7ALWIHAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfGO2N%2Fbtsevm3keoO%2F35bLmBjjp4M6Ky7ALWIHAK%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;1392&quot; height=&quot;856&quot; data-filename=&quot;스크린샷 2023-05-09 오전 10.52.32.png&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;856&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;1184&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crTZCO/btsg1Vam89y/JRAuzWMH3dEYbDGF3OGic0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crTZCO/btsg1Vam89y/JRAuzWMH3dEYbDGF3OGic0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crTZCO/btsg1Vam89y/JRAuzWMH3dEYbDGF3OGic0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrTZCO%2Fbtsg1Vam89y%2FJRAuzWMH3dEYbDGF3OGic0%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;1184&quot; height=&quot;526&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;526&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; &amp;nbsp;&amp;nbsp;&lt;/b&gt;터미널에 사용자 이름 커스터마이징&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;먼저 agonster.zsh-theme 를 열어주고요&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684772504782&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi ~/.oh-my-zsh/themes/agnoster.zsh-theme&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;JUST DO IT!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683598141071&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;## Main prompt
build_prompt() {
  RETVAL=$?
  prompt_status
  prompt_virtualenv
  prompt_aws
  prompt_context
  prompt_dir
  prompt_git
  prompt_bzr
  prompt_hg
  prompt_newline // 이걸 추가해주세요!
  prompt_end
}&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;코드 제일 하단에 내려가서 추가&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1683598283679&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prompt_newline() {
  if [[ -n $CURRENT_BG ]]; then
    echo -n &quot;%{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR
%{%k%F{blue}%}$SEGMENT_SEPARATOR&quot;
  else
    echo -n &quot;%{%k%}&quot;
  fi

  echo -n &quot;%{%f%}&quot;
  CURRENT_BG=''
}&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여기부터는 옵션입니닷! (사실 앞에도 옵션이긴 하죠..! ㅎㅎ)&lt;/span&gt;&lt;/h3&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  &lt;/b&gt;Syntax Highlight 적용&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1683598390238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# brew를 통해 설치해줍니다.
brew install zsh-syntax-highlighting

# ~/.zshrc에 들어가서 아래의 코드를 입력해줍니다.
vi ~/.zshrc

source /usr/local/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/span&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;스크린샷 2023-05-09 오전 11.13.37.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcx9I2/btsevl3gA18/JZHid4WgIYZXt0Tmj0kJz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcx9I2/btsevl3gA18/JZHid4WgIYZXt0Tmj0kJz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcx9I2/btsevl3gA18/JZHid4WgIYZXt0Tmj0kJz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcx9I2%2Fbtsevl3gA18%2FJZHid4WgIYZXt0Tmj0kJz0%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;1108&quot; height=&quot;426&quot; data-filename=&quot;스크린샷 2023-05-09 오전 11.13.37.png&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt; &amp;nbsp; &lt;/b&gt;이름&amp;nbsp;커스터마이징&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-23 오전 1.19.20.png&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SVeZq/btsg1egWSnu/3yeKcT2atk2g7ZWqYH1hb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SVeZq/btsg1egWSnu/3yeKcT2atk2g7ZWqYH1hb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SVeZq/btsg1egWSnu/3yeKcT2atk2g7ZWqYH1hb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSVeZq%2Fbtsg1egWSnu%2F3yeKcT2atk2g7ZWqYH1hb1%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;266&quot; height=&quot;50&quot; data-filename=&quot;스크린샷 2023-05-23 오전 1.19.20.png&quot; data-origin-width=&quot;266&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1683598787235&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;prompt_context() {
  # Custom (Random emoji)
  emojis=(&quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot; &quot;⭐&quot;)
  RAND_EMOJI_N=$(( $RANDOM % ${#emojis[@]} + 1))
  
  # {gaga} -&amp;gt; 원하시는 닉네임 작성
  prompt_segment black default &quot;{gaga} ${emojis[$RAND_EMOJI_N]} &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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;  &lt;/b&gt;상태바 추가하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;iterm2 &amp;gt; preferences &amp;gt; profiles &amp;gt; Session &amp;gt; status bar enabled 체크&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-05-09 오전 11.20.15.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rm8a6/btsergvm7Ae/nCCOYVspy91uXjlegLZIBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rm8a6/btsergvm7Ae/nCCOYVspy91uXjlegLZIBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rm8a6/btsergvm7Ae/nCCOYVspy91uXjlegLZIBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frm8a6%2Fbtsergvm7Ae%2FnCCOYVspy91uXjlegLZIBk%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;1824&quot; height=&quot;1146&quot; data-filename=&quot;스크린샷 2023-05-09 오전 11.20.15.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1146&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;nbsp;참고 문서&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a href=&quot;https://ooeunz.tistory.com/21&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ooeunz.tistory.com/21&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Custom</category>
      <category>iterm</category>
      <category>iterm2</category>
      <category>iTerm2 꾸미기</category>
      <category>맥 꾸미기</category>
      <category>맥 터미널</category>
      <category>맥북 커스텀</category>
      <category>커스텀</category>
      <category>터미널 꾸미기</category>
      <category>터미널 커스텀</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/77</guid>
      <comments>https://gh402.tistory.com/77#entry77comment</comments>
      <pubDate>Tue, 23 May 2023 01:28:31 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] HTTP/1.1 와 HTTP/2 의 차이점</title>
      <link>https://gh402.tistory.com/76</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  HTTP란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Hypertext Transfer Protocol 의 약자로, HTML 등의 문서를 주고 받는 프로토콜이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;WEB에서 이루어지는 모든 데이터 전송 및 응답의 기본이라고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;추가) OSI계층의 Application Layer 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  HTTP/1.0&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✔ 단기 커넥션&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 데이터를 전송하기 위해서 하나의 TCP Connection을 맺어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TCP는 신뢰성 있는 데이터 전송을 위해 연결 시 3-way handshake, 연결 해제 시 4-way handshake 과정을 거치며&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;결국, 여러 API 호출 시 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Latency 증가&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 너무 당연한 얘기다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;456&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOCp30/btsbTuJqcFu/mbtatrHbf5ZIWjqmJ2fvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOCp30/btsbTuJqcFu/mbtatrHbf5ZIWjqmJ2fvK0/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://bbo-blog.tistory.com/87?category=1004651&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOCp30/btsbTuJqcFu/mbtatrHbf5ZIWjqmJ2fvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOCp30%2FbtsbTuJqcFu%2FmbtatrHbf5ZIWjqmJ2fvK0%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;416&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://bbo-blog.tistory.com/87?category=1004651&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;너무 비효율이여서 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;HTTP Header 에 Keep-alive 옵션을 사용하여 일정 시간동안 Connection을 끊지 않는 방식도 사용이 되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;그러나, HTTP/1.0 에서는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;표준이 아니었기 때문에 지원이 안되는 곳도 있었다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682147033372&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Connection : keep-alive&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;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  HTTP/1.1&amp;nbsp;&amp;nbsp;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;HTTP/1.0의 단점을 해소하고자, HTTP/1.1이 등장하였다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔&lt;span&gt;&amp;nbsp;&lt;/span&gt; Persistence Connection&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;지정한 timeout 시간 동안 Connection을 끊지 않는다는 컨셉&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;하나의 Connection에 여러 개의 요청과 응답을 주고 받을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP/1.0에서는 해당 기능을 사용하기 위해 Header에 keep-alive를 Client가 작성해줘야 되지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP/1.1에서는 기본적으로 keep-alive 기능을 지원하고(Client가 작성하지 않아도), 필요 없는 경우만 작성해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1682147112766&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Connection : close&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;Pipelining&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;첫 번째 요청을 보낸 뒤, 응답을 받지 않아도 두 번째 Request 를 보낼 수 있게 한다.&lt;/p&gt;
&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;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LWmbv/btsbRK0PcoN/L6cYJKOVUanprStozHsXzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LWmbv/btsbRK0PcoN/L6cYJKOVUanprStozHsXzk/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://en.wikipedia.org/wiki/HTTP_pipelining&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LWmbv/btsbRK0PcoN/L6cYJKOVUanprStozHsXzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLWmbv%2FbtsbRK0PcoN%2FL6cYJKOVUanprStozHsXzk%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;649&quot; height=&quot;451&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://en.wikipedia.org/wiki/HTTP_pipelining&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;단, 요청을 보낸 순서에 맞도록 응답이 와야한다.(순서보장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그렇기 때문에, 첫 번째 응답이 느리게 오면, 두 번째/세 번째 응답에도 지연이 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;대부분의 서버는 멀티 스레드 구조로 1,2,3번째 응답을 동시에 처리하게 되는데, 서버에서도 1번째 응답을 제공해주기 전까지는 2,3번 데이터를 가지고 있어야 해서 리소스 낭비도 함께 일어난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이 문제가 바로 &lt;b&gt;Head of Line Bloking&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  HTTP/2&amp;nbsp;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔&lt;span&gt; Header 압축&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;Header 프레임과 데이터 프레임으로 나눈 후, 압축하여 데이터를 전송한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;✔&lt;span&gt;&amp;nbsp;&lt;/span&gt;Multiplexing&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;파이프라이닝과 다르게 요청의 순서대로 응답을 제공해줄 필요 없이&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;병렬적으로 진행&lt;/b&gt;하며 빨리 끝난 요청부터 처리하여 전송해준다.&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;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/whkSj/btsbSfMRWhr/7JoV0wyX4cAlsfqfWfZp5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/whkSj/btsbSfMRWhr/7JoV0wyX4cAlsfqfWfZp5K/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://www.luroconnect.com/http2-magento/&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/whkSj/btsbSfMRWhr/7JoV0wyX4cAlsfqfWfZp5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwhkSj%2FbtsbSfMRWhr%2F7JoV0wyX4cAlsfqfWfZp5K%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;602&quot; height=&quot;327&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://www.luroconnect.com/http2-magento/&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP/1.1 에 비해 latency가 줄어들었지만, TCP 특성에 따른 &lt;b&gt;TCP Head of Line Bloking 문제&lt;/b&gt;가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래 그림의 TCP Connection을 주목해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TCP 전송을 할 때, 데이터가 나뉘어져 전송이 되는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;만약, 3번의 패킷이 전송 중 누락(?)되어 재전송이 일어나면 그 뒤에 있는 모든 패킷들은 &lt;b&gt;지연&lt;/b&gt;이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;TCP의 신뢰성 있는 데이터를 전송하기 위한 특성에서 발생하는 &lt;b&gt;TCP Head of Line Bloking 문제&lt;/b&gt;이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;blob&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cow6BO/btsbSd9lNz4/rdLZTV47OrkqOXQs0A4HW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cow6BO/btsbSd9lNz4/rdLZTV47OrkqOXQs0A4HW1/img.png&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://devopedia.org/quic&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cow6BO/btsbSd9lNz4/rdLZTV47OrkqOXQs0A4HW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcow6BO%2FbtsbSd9lNz4%2FrdLZTV47OrkqOXQs0A4HW1%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;774&quot; height=&quot;226&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://devopedia.org/quic&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  QUIC&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;HTTP/2의 TCP Head of Line Blocking 문제를 보완하기 위해서 나타난 Application 계층 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UDP 사용을 하여 신뢰성 있는 데이터 전송하는 컨셉으로 구글에서 만들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;UDP 가 신뢰성있는 데이터를 전송한다고? 어떻게 하는거지?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;QUIC은 &lt;b&gt;독립 스트림&lt;/b&gt;을 만들어 데이터를 전송한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;즉, 3번이 지연 발생이 된다면, 나머지들은 영향이 없게된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3w9F7/btsbT20esAS/pG635tvlCafBxwLIPGxv4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3w9F7/btsbT20esAS/pG635tvlCafBxwLIPGxv4k/img.jpg&quot; data-alt=&quot;출처 :&amp;amp;amp;nbsp;https://devopedia.org/quic&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3w9F7/btsbT20esAS/pG635tvlCafBxwLIPGxv4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3w9F7%2FbtsbT20esAS%2FpG635tvlCafBxwLIPGxv4k%2Fimg.jpg&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;900&quot; height=&quot;532&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;amp;nbsp;https://devopedia.org/quic&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>1.1</category>
      <category>2</category>
      <category>head of block</category>
      <category>http</category>
      <category>HTTP/1.1</category>
      <category>HTTP/2</category>
      <category>HTTP1 2 차이</category>
      <category>HTTP2</category>
      <category>quic</category>
      <category>stream</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/76</guid>
      <comments>https://gh402.tistory.com/76#entry76comment</comments>
      <pubDate>Sat, 22 Apr 2023 16:43:46 +0900</pubDate>
    </item>
    <item>
      <title>[Spring boot] intellij error 프로젝트 셋팅 중 에러</title>
      <link>https://gh402.tistory.com/75</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;개발하다보면 &lt;b&gt;프로젝트 셋팅 또는 버전업&lt;/b&gt;을 할 때가 있는데, 실행도 전에 에러가 두둥!! 나오는 경우가 많죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이럴 때 마다 저는 에러를 열심히 읽고 구글 서치도 하면서 해결을 해나가는데요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;앞으로도 계속 볼 일이 있을 것 같아서 에러 메세지와 해결 방법을 공유하려고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;( 저 뿐만 아니라 다른 분들도 도움이 되겠죠? ㅎㅎ)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;그럼 바로 시작해볼게요~~&lt;/h4&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;024&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/024.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/024.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  에러 메세지&lt;/h2&gt;
&lt;pre id=&quot;code_1679319264113&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java: static import only from classes and interfaces
intellij java package org.mockito does not exist 등등..&lt;/code&gt;&lt;/pre&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;p data-ke-size=&quot;size18&quot;&gt;.idea 파일 삭제 후 project restart 하기&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; &lt;span&gt; &lt;/span&gt;에러 메세지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Execution&amp;nbsp;failed&amp;nbsp;for&amp;nbsp;task&amp;nbsp;':compileJava'.&lt;br /&gt;&amp;gt;&amp;nbsp;error:&amp;nbsp;invalid&amp;nbsp;source&amp;nbsp;release:&amp;nbsp;17&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beXbsR/btr4w5wwp3t/DJ5ykYIaGVj7VywxTudof0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beXbsR/btr4w5wwp3t/DJ5ykYIaGVj7VywxTudof0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beXbsR/btr4w5wwp3t/DJ5ykYIaGVj7VywxTudof0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeXbsR%2Fbtr4w5wwp3t%2FDJ5ykYIaGVj7VywxTudof0%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;740&quot; height=&quot;162&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt; &amp;nbsp;&lt;/span&gt;해결방법1&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;build.gradle &amp;gt; sourceCompatibility &amp;gt; 원하는 버전으로 적혀있는지 확인.&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;sourceCompatibility = '11'&lt;/code&gt;&lt;/pre&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;span&gt;&lt;span&gt; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;해결방법2&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Project Structure &amp;gt; Modules &amp;gt; Language level 을 원하는 java level 에 맞춰줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;내 프로젝트는 java 11 을 쓰려고 했는데, Language level 이 17으로 되어 있어 위와 같은 에러가 발생했고, 11로 변경.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-14 오후 2.49.10.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;1444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmLXeD/btrWbMF9myG/uI9jKaMtvdu3WcpFax19z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmLXeD/btrWbMF9myG/uI9jKaMtvdu3WcpFax19z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmLXeD/btrWbMF9myG/uI9jKaMtvdu3WcpFax19z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmLXeD%2FbtrWbMF9myG%2FuI9jKaMtvdu3WcpFax19z0%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;1834&quot; height=&quot;1444&quot; data-filename=&quot;스크린샷 2023-01-14 오후 2.49.10.png&quot; data-origin-width=&quot;1834&quot; data-origin-height=&quot;1444&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;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;해결방법 3&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Project Structure &amp;gt; Project &amp;gt; Project language level &amp;gt; 원하는 level 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;1002&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIughm/btr4vJnbG2O/T0DPrGuHKpekFZ7FD9fZFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIughm/btr4vJnbG2O/T0DPrGuHKpekFZ7FD9fZFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIughm/btr4vJnbG2O/T0DPrGuHKpekFZ7FD9fZFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIughm%2Fbtr4vJnbG2O%2FT0DPrGuHKpekFZ7FD9fZFk%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;2012&quot; height=&quot;1002&quot; data-origin-width=&quot;2012&quot; data-origin-height=&quot;1002&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;h3 data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;해결방법 4&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Preferences &amp;gt; Build, Execution, Deployment &amp;gt; Compiler &amp;gt; Java Compiler &amp;gt; project bytecode version&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;gt; 본인의 Compiler 버전에 맞추기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BfBgY/btr4wFEQrnw/PlkLVWgMD0CakFdxjCixr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BfBgY/btr4wFEQrnw/PlkLVWgMD0CakFdxjCixr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BfBgY/btr4wFEQrnw/PlkLVWgMD0CakFdxjCixr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBfBgY%2Fbtr4wFEQrnw%2FPlkLVWgMD0CakFdxjCixr0%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;2334&quot; height=&quot;1586&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1586&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; &lt;span&gt; &amp;nbsp;&lt;/span&gt;오류 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;pom.xml에 라이브러리들을 추가해두었는데(dependency), 라이브버리 다운도 안되고 생성이 되지 않아 import 가 되지 않는 현상&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-14 오후 3.17.42.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cK88Hs/btrWgicbklR/IXjAB6tTqllFhKZpj2Sjk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cK88Hs/btrWgicbklR/IXjAB6tTqllFhKZpj2Sjk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cK88Hs/btrWgicbklR/IXjAB6tTqllFhKZpj2Sjk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcK88Hs%2FbtrWgicbklR%2FIXjAB6tTqllFhKZpj2Sjk1%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;1578&quot; height=&quot;418&quot; data-filename=&quot;스크린샷 2023-01-14 오후 3.17.42.png&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Preferences &amp;gt; Build, Execution, Deployment &amp;gt; Build Tools &amp;gt; Maven&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;아래 빨간색처럼 표시된 Bundled (Maven 3)로 변경해주면 library가 다운된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AgIHf/btrWggZJNLl/dS1jLWKgl9J4LLIdXw0kZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AgIHf/btrWggZJNLl/dS1jLWKgl9J4LLIdXw0kZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AgIHf/btrWggZJNLl/dS1jLWKgl9J4LLIdXw0kZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAgIHf%2FbtrWggZJNLl%2FdS1jLWKgl9J4LLIdXw0kZK%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;1792&quot; height=&quot;1390&quot; data-origin-width=&quot;1792&quot; data-origin-height=&quot;1390&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;</description>
      <category>SERVER/Spring Boot</category>
      <category>error: invalid source release:</category>
      <category>Execution failed for task ':compileJava'.</category>
      <category>failed</category>
      <category>ghy</category>
      <category>import</category>
      <category>intellij error</category>
      <category>intellij 오류</category>
      <category>invalid source</category>
      <category>java: error: invalid source release</category>
      <category>static import</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/75</guid>
      <comments>https://gh402.tistory.com/75#entry75comment</comments>
      <pubDate>Mon, 20 Mar 2023 22:37:58 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] JMH - Benchmark Test 사용하여 성능 측정하기</title>
      <link>https://gh402.tistory.com/74</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  JMH(Java MicroBenchmark Harness) 란?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Open JDK에서 개발한 성능 측정 툴&lt;/li&gt;
&lt;li&gt;특정 메소드의 성능을 측정하는 방식으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &amp;nbsp; JMH 는 언제 사용할 수 있을까?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;성능 튜닝을 할 때, 메소드의 성능을 측정하여 간단한 테스트를 진행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;여러가지 조건 및 부하를 주고 테스트를 할 수 있지만, JMH를 통해서는 메소드의 성능 튜닝을 로컬에서 간단하게 실행해보고 진행해볼 수 있다는 점이 좋다.&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;b&gt;&lt;b&gt;  &amp;nbsp;&lt;/b&gt;JMH 사용하여 메소드의 성능 측정하기&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1) pom.xml 에 &lt;b&gt;jmh-core&lt;/b&gt; 와 &lt;b&gt;jmh-generator-annprocess&lt;/b&gt; 라이브러리를 추가&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;pom.xml&lt;/blockquote&gt;
&lt;pre id=&quot;code_1676285719029&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;!-- jmh --&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjdk.jmh&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jmh-core&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.26&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;org.openjdk.jmh&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;jmh-generator-annprocess&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;1.26&amp;lt;/version&amp;gt;
    &amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2) Benchmark 용 클래스 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;BenchmarkTest class 를 생성해주고, 실제로 성능 테스트하고 싶은 대상의 코드를 작성해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1676468447281&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BenchmarkTest {

    @Benchmark
    public void benchmark(BenchmarkState state, Blackhole bh) {
    	// 실제 성능 테스트하고 싶은 코드 작성
        List&amp;lt;Integer&amp;gt; list = state.list;
        for (int i = 0; i &amp;lt; 1000; i++)
            bh.consume (list.get (i));
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3) 테스트를 돌릴 jmh 속성들을 셋팅&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;속성은 properties로 빼서 사용할 수 있으나, 코드 상에서 설정할 수 있도록 했다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;속성들에 대한 코멘트는 아래에서 확인해주시길 바랍니다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1676468871352&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BenchmarkTest {

	@Test
    public void launchBenchmark() throws Exception {
        Options opt = new OptionsBuilder()
            .include(this.getClass().getName() + &quot;.*&quot;)
            .mode(Mode.AverageTime)
            .timeUnit(TimeUnit.MICROSECONDS) // 성능 결과의 시간 단위 
            .warmupTime(TimeValue.seconds(1))
            .warmupIterations(2) // 사전 테스트 횟수
            .measurementTime(TimeValue.seconds(1)) // 테스트 당 측정 시간
            .measurementIterations(2) // 테스트 반복횟수
            .threads(2) // 쓰레드
            .forks(1)
            .shouldFailOnError(true)
            .shouldDoGC(true)
            .build();

        new Runner(opt).run();
    }

    @Benchmark
    public void benchmark(BenchmarkState state, Blackhole bh) {
    	// 실제 성능 테스트하고 싶은 코드 작성
        List&amp;lt;Integer&amp;gt; list = state.list;
        for (int i = 0; i &amp;lt; 1000; i++)
            bh.consume (list.get (i));
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4) &lt;b&gt;@State를 사용하여 테스트 상태를 지정&lt;/b&gt; 및&amp;nbsp; &lt;b&gt;@Setup 을 통해 사전 작업을 진행&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(1) Scope.Thread&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 쓰레드별로 인스턴스 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(2) Scope.Benchmark&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 동일한 테스트 내의 모든 쓰레드에서 동일한 인스턴스를 공유한다. (멀티스레딩 성능 테스트에 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(3) Scope.Group&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;쓰레드 그룹마다 인스턴스 생성&lt;/p&gt;
&lt;pre id=&quot;code_1676469578574&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@State(Scope.Thread)
public static class BenchmarkState {
	List&amp;lt;Integer&amp;gt; list;
    
    @Setup(Level.Trial)
    public void init() {
    	Random rand = new Random();
        
        list = new ArrayList&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; 1000; i++) {
        	list.add (rand.nextInt());
		}
	}
}&lt;/code&gt;&lt;/pre&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;b&gt;&lt;b&gt;실행 결과&lt;/b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1676469619902&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Run progress: 0.00% complete, ETA 00:00:04
# Fork: 1 of 1
# Warmup Iteration   1: 2.744 us/op
# Warmup Iteration   2: 2.688 us/op
Iteration   1: 2.466 us/op
Iteration   2: 2.453 us/op&lt;/code&gt;&lt;/pre&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;style3&quot; /&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;b&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;&lt;/b&gt;Trouble Shooting&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;에러&amp;nbsp;&lt;/h4&gt;
&lt;pre id=&quot;code_1676285820587&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java.lang.RuntimeException: ERROR: Unable to find the resource: /META-INF/BenchmarkList&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;해결 방법 : &lt;b&gt;pom.xml 수정&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;아래 문서 참고하여 해결&amp;nbsp;&lt;br /&gt;https://howtodoinjava.com/java/exception-handling/jmh-error-unable-to-find-the-resource-meta-inf-benchmarklist/&lt;/blockquote&gt;
&lt;pre id=&quot;code_1676288920041&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  // 1. properties 안에 jmh.version 추가
  &amp;lt;properties&amp;gt;
   ...(중략)
    &amp;lt;jmh.version&amp;gt;1.26&amp;lt;/jmh.version&amp;gt;
  &amp;lt;/properties&amp;gt;



// 2. path 추가 &amp;gt; jmh
&amp;lt;plugin&amp;gt;
 ...(중략)
        &amp;lt;configuration&amp;gt;
          &amp;lt;annotationProcessorPaths&amp;gt;
            &amp;lt;path&amp;gt;
              &amp;lt;groupId&amp;gt;org.openjdk.jmh&amp;lt;/groupId&amp;gt;
              &amp;lt;artifactId&amp;gt;jmh-generator-annprocess&amp;lt;/artifactId&amp;gt;
              &amp;lt;version&amp;gt;${jmh.version}&amp;lt;/version&amp;gt;
            &amp;lt;/path&amp;gt;
          &amp;lt;/annotationProcessorPaths&amp;gt;
        &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  jmh의 속성&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1676469637274&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jmh {
   includes = ['some regular expression'] // include pattern (regular expression) for benchmarks to be executed
   excludes = ['some regular expression'] // exclude pattern (regular expression) for benchmarks to be executed
   iterations = 10 // Number of measurement iterations to do.
   benchmarkMode = ['thrpt','ss'] // Benchmark mode. Available modes are: [Throughput/thrpt, AverageTime/avgt, SampleTime/sample, SingleShotTime/ss, All/all]
   batchSize = 1 // Batch size: number of benchmark method calls per operation. (some benchmark modes can ignore this setting)
   fork = 2 // How many times to forks a single benchmark. Use 0 to disable forking altogether
   failOnError = false // Should JMH fail immediately if any benchmark had experienced the unrecoverable error?
   forceGC = false // Should JMH force GC between iterations?
   jvm = 'myjvm' // Custom JVM to use when forking.
   jvmArgs = ['Custom JVM args to use when forking.']
   jvmArgsAppend = ['Custom JVM args to use when forking (append these)']
   jvmArgsPrepend =[ 'Custom JVM args to use when forking (prepend these)']
   humanOutputFile = project.file(&quot;${project.buildDir}/results/jmh/human.txt&quot;) // human-readable output file
   resultsFile = project.file(&quot;${project.buildDir}/results/jmh/results.txt&quot;) // results file
   operationsPerInvocation = 10 // Operations per invocation.
   benchmarkParameters =  [:] // Benchmark parameters.
   profilers = [] // Use profilers to collect additional data. Supported profilers: [cl, comp, gc, stack, perf, perfnorm, perfasm, xperf, xperfasm, hs_cl, hs_comp, hs_gc, hs_rt, hs_thr, async]
   timeOnIteration = '1s' // Time to spend at each measurement iteration.
   resultFormat = 'CSV' // Result format type (one of CSV, JSON, NONE, SCSV, TEXT)
   synchronizeIterations = false // Synchronize iterations?
   threads = 4 // Number of worker threads to run with.
   threadGroups = [2,3,4] //Override thread group distribution for asymmetric benchmarks.
   timeout = '1s' // Timeout for benchmark iteration.
   timeUnit = 'ms' // Output time unit. Available time units are: [m, s, ms, us, ns].
   verbosity = 'NORMAL' // Verbosity mode. Available modes are: [SILENT, NORMAL, EXTRA]
   warmup = '1s' // Time to spend at each warmup iteration.
   warmupBatchSize = 10 // Warmup batch size: number of benchmark method calls per operation.
   warmupForks = 0 // How many warmup forks to make for a single benchmark. 0 to disable warmup forks.
   warmupIterations = 1 // Number of warmup iterations to do.
   warmupMode = 'INDI' // Warmup mode for warming up selected benchmarks. Warmup modes are: [INDI, BULK, BULK_INDI].
   warmupBenchmarks = ['.*Warmup'] // Warmup benchmarks to include in the run in addition to already selected. JMH will not measure these benchmarks, but only use them for the warmup.

   zip64 = true // Use ZIP64 format for bigger archives
   jmhVersion = '1.35' // Specifies JMH version
   includeTests = true // Allows to include test sources into generate JMH jar, i.e. use it when benchmarks depend on the test classes.
   duplicateClassesStrategy = DuplicatesStrategy.FAIL // Strategy to apply when encountring duplicate classes during creation of the fat jar (i.e. while executing jmhJar task)
}&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt; &amp;nbsp;JMH Benchmark Test의 &lt;/span&gt;&lt;/b&gt;&lt;b&gt;한계점&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트에 대한 CPU 사용률, 개인 PC 성능에 따라 결과값이 달라질 수 있으므로 정확한 데이터의 지표로 판달할 수 없음&lt;/li&gt;
&lt;li&gt;코드가 동일하다고 다른 사양의 PC에서 진행하면 측정하기 어렵기 때문에 간단한 메소드 성능 측정에 사용해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp; &lt;/b&gt;참고 문서&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) github&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/melix/jmh-gradle-plugin&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/melix/jmh-gradle-plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/artyushov/idea-jmh-plugin&quot;&gt;https://github.com/artyushov/idea-jmh-plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) baeldung&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.baeldung.com/java-microbenchmark-harness&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.baeldung.com/java-microbenchmark-harness&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) openJDK 공식문서&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://openjdk.org/projects/code-tools/jmh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://openjdk.org/projects/code-tools/jmh/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1676285726388&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;OpenJDK: jmh&quot; data-og-description=&quot;Code Tools: jmh JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM. Links&quot; data-og-host=&quot;openjdk.org&quot; data-og-source-url=&quot;https://openjdk.org/projects/code-tools/jmh/&quot; data-og-url=&quot;https://openjdk.org/projects/code-tools/jmh/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://openjdk.org/projects/code-tools/jmh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://openjdk.org/projects/code-tools/jmh/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;OpenJDK: jmh&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Code Tools: jmh JMH is a Java harness for building, running, and analysing nano/micro/milli/macro benchmarks written in Java and other languages targetting the JVM. Links&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;openjdk.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 오류 참고&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1676285736939&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;How to run JMH from inside JUnit tests?&quot; data-og-description=&quot;How can I run JMH benchmarks inside my existing project using JUnit tests? The official documentation recommends making a separate project, using Maven shade plugin, and launching JMH inside the main&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests&quot; data-og-url=&quot;https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HhK2V/hyRBSu4t7x/oUbbYj2ATh4226OAyChy11/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/30485856/how-to-run-jmh-from-inside-junit-tests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HhK2V/hyRBSu4t7x/oUbbYj2ATh4226OAyChy11/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;How to run JMH from inside JUnit tests?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;How can I run JMH benchmarks inside my existing project using JUnit tests? The official documentation recommends making a separate project, using Maven shade plugin, and launching JMH inside the main&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;</description>
      <category>SERVER/Spring Boot</category>
      <category>benchmark test</category>
      <category>ghy</category>
      <category>JMH</category>
      <category>spring 테스트</category>
      <category>메소드 성능테스트</category>
      <category>성능</category>
      <category>성능테스트</category>
      <category>자바테스트</category>
      <category>테스트</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/74</guid>
      <comments>https://gh402.tistory.com/74#entry74comment</comments>
      <pubDate>Wed, 15 Feb 2023 23:10:19 +0900</pubDate>
    </item>
    <item>
      <title> [Network] 네트워크 기초 3 : 네트워크 계층</title>
      <link>https://gh402.tistory.com/73</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  OSI 3계층 : 네트워크 계층&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  네트워크 계층의 역할과 기능에 대해서 알아본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  네트워크 계층에서 데이터를 어떻게 전달하는지 알아보자.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  목차&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  네트워크란?&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  용어 정리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  네트워크란? (feat. 네트워크 계층의 역할)&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;스크린샷 2023-02-03 오전 12.08.15.png&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0AMoa/btrXXg41nRw/lequPTO8aM93yE1VNVjX9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0AMoa/btrXXg41nRw/lequPTO8aM93yE1VNVjX9K/img.png&quot; data-alt=&quot;참고 이미지 :&amp;amp;nbsp;https://hannut91.github.io/blogs/network/network&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0AMoa/btrXXg41nRw/lequPTO8aM93yE1VNVjX9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0AMoa%2FbtrXXg41nRw%2FlequPTO8aM93yE1VNVjX9K%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;1626&quot; height=&quot;1030&quot; data-filename=&quot;스크린샷 2023-02-03 오전 12.08.15.png&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;참고 이미지 :&amp;nbsp;https://hannut91.github.io/blogs/network/network&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우리는 다양한 사람들과의 네트워크를 맺고 있는데, 컴퓨터도 동일하다고 보면 된다. (사람 = 컴퓨터)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;실제로는 위의 그림보다 수많은 네트워크가 존재할 것이고, 네트워크 A의 컴퓨터에서 네트워크 B의 컴퓨터로 데이터를 전송한다고 해보자. 연결되어있는 여러 네트워크들을 타고 가야할 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터가 이동할 수 있는 루트는 몇 개가 있을까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;수백 수천가지 아니 수억만 가지일 것이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;네트워크 계층은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;다른 네트워트 상의 있는 컴퓨터들의 데이터를 여러가지 루트 중 최적의 루트를 찾고 전송&lt;/b&gt;&lt;/span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  기본 지식 &lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1) IP주소&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;데이터를 전송하려는 목적지 주소&lt;/b&gt;가 바로 IP주소이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;IP주소에는 어떤 네트워크의 어떤 컴퓨터인지를 구분할 수 있는 정보가 들어가 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;위에 언급했다싶이 데이터를 어떤 경로로 보낼지 결정을 해야하는데, 이를 &lt;b&gt;라우터&lt;/b&gt;라는 장비가 해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;gt; IP 버전 : IPv4, IPv6&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;gt; IP 종류 : 공인IP 주소(ISP제공), 사설IP 주소&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;공인 IP 주소는 ISP가 제공한다.&lt;br /&gt;* 단, 사설IP주소는 공인IP 주소를 사용할 수 없음.&lt;br /&gt;&lt;br /&gt;공인 IP 주소 :&amp;nbsp;&quot;라우터&quot;에만 할당&lt;br /&gt;사설 IP 주소 : 해당 네트워크(랜) 안에 있는 컴퓨터들은 네트워크 관리자가 할당 or 라우터의 DHCP 기능을 사용하여 주소를 자동으로 할당.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2) IP 패킷&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;IP패킷 = 출발지 IP 주소 / 목적지 IP 주소 / 등이 담긴 IP 주소 + 데이터&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;3) IP 주소의 클래스&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;IP는 &lt;b&gt;네트워크ID와 호스트ID&lt;/b&gt;로 구성되어 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;네트워크ID는 &lt;b&gt;어떤 네트워크&lt;/b&gt;인지, 호스트ID는 &lt;b&gt;네트워크 안에서 어떤 컴퓨터&lt;/b&gt;인지를 알려주는 개념이다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A클래스 : 대규모 네트워크(네트워크 8비트/ 호스트 24비트)&lt;/li&gt;
&lt;li&gt;B클래스 : 중형 네트워크(네트워크 16비트/호스트 16비트)&lt;/li&gt;
&lt;li&gt;C클래스 : 소규모 네트워크(네트워크 24비트/호스트 8비트)&lt;/li&gt;
&lt;li&gt;D클래스 : 멀티캐스트 주소&lt;/li&gt;
&lt;li&gt;E클래스 : 연구 및 특수용도 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;4) 네트워크 주소와 브로드캐스트 주소&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;네트워크 주소&lt;/b&gt; : 호스트ID가 0으로 시작하는 것&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;gt; 네트워크 주소는 작은 네트워크를 식별하는데 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;브로드캐스트 주소&lt;/b&gt; : 호스트ID가 255로 시작하는 것&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;gt; 같은 네트워크 안에 있는 컴퓨터와 장비 모두에게 한번에 데이터를 전송할 때 쓰는 주소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;5) 서브넷&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;분할된 네트워크를 서브넷이라 하고, 네트워크를 분할하는 것을 서브넷팅이라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;서브넷 ID도 할당을 받을 수가 있는데, 이는 호스트 ID 의 8비트를 빌려서 할당을 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그렇다면, 호스트ID가 8비트인 C 클래스는..? (찾아보는 중..)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;6) 라우터&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3750&quot; data-origin-height=&quot;2500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpBfhH/btrXWx61aiV/AUrGIyjEsFpk9jUFrklyA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpBfhH/btrXWx61aiV/AUrGIyjEsFpk9jUFrklyA1/img.jpg&quot; data-alt=&quot;출처 :&amp;amp;nbsp;https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%9A%B0%ED%84%B0&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpBfhH/btrXWx61aiV/AUrGIyjEsFpk9jUFrklyA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpBfhH%2FbtrXWx61aiV%2FAUrGIyjEsFpk9jUFrklyA1%2Fimg.jpg&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;635&quot; height=&quot;423&quot; data-origin-width=&quot;3750&quot; data-origin-height=&quot;2500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 :&amp;nbsp;https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%9A%B0%ED%84%B0&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;간단하게 생각해보면 네트워크A 와 네트워크B 사이의 데이터를 전송해주는 매개체가 있어야 한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이것이 바로 &quot;라우터&quot;이고, 이는 &lt;/span&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터의 목적지가 정해지면 해당 목적지까지 최적의 경로를 알려주는 장비이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; color: #666666;&quot;&gt;(어떻게는 좀 더 공부하고 포스팅 예정 - 링크 추가할게유)&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  참고 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%9A%B0%ED%84%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%9A%B0%ED%84%B0&lt;/a&gt;&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>ghy</category>
      <category>ip</category>
      <category>ip주소란</category>
      <category>OSI 7 계층</category>
      <category>네트워크</category>
      <category>네트워크 계층</category>
      <category>라우터</category>
      <category>서브넷</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/73</guid>
      <comments>https://gh402.tistory.com/73#entry73comment</comments>
      <pubDate>Fri, 3 Feb 2023 00:37:17 +0900</pubDate>
    </item>
    <item>
      <title>[SERVER] HTTP헤더 &amp;gt; content-type</title>
      <link>https://gh402.tistory.com/72</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  HTTP 헤더&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;HTTP 헤더는 클라이언트와 서버가 서로 요청/응답을 줄 때, API 요청값 또는 응답값 외의 부가적인 정보를 전송할 수 있도록 해주는 역할을 한다.&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;header에는 보통 authorization(인증토큰), 쿠키, 클라이언트의 하드웨어 정보 등이 담겨있다. &lt;br /&gt;(이런 정보들을 통해 로그/오류 추적 등을 할 수 있다.)&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  CURL API 전문 (Request Header 확인 가능)&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;-H 는 Request Header를 의미한다.&amp;nbsp;&lt;br /&gt;형태는 &quot;이름&quot; &quot;:&quot; &quot;값&quot; 으로 되어있다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1674658497072&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl 'https://cologger.shopping.naver.com//api/v1/collect/PLUS_DEAL/001051?adCntsSeqs=5899458&amp;amp;adCntsSeqs=5899725&amp;amp;adCntsSeqs=5899723' \
  -H 'authority: cologger.shopping.naver.com' \
  -H 'accept: application/json' \
  -H 'accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'content-type: application/json' \
  -H 'cookie: NNB=SIVW4SLTLIZGC; ASID=713d17a00000017bfb95bd7900000061; autocomplete=use; _ga_7VKFYR6RV1=GS1.1.1662453004.41.1.1662453007.57.0.0; AD_SHP_BID=13; nx_ssl=2; recent_card_list=1692,1531,1530,2612,1451; _tt_enable_cookie=1; _ttp=0-K7yeUOtiQKCkxkc5YiMcRw_28; _ga=GA1.2.625044960.1631345612; _ga_4BKHBFKFK0=GS1.1.1673163395.2.1.1673163781.60.0.0; nid_inf=1278450771; NID_JKL=9JkWxRR7jfKL31IOJrmcO4C0f3f+EV/dYUeXFXiQ1ug=; BMR=s=1674554101265&amp;amp;r=https%3A%2F%2Fm.blog.naver.com%2Fhisasi222%2F222306660161&amp;amp;r2=https%3A%2F%2Fwww.google.com%2F; page_uid=h8/Y8dp0Jy0ss5icmWNssssst/d-422353' \
  -H 'origin: https://www.naver.com' \
  -H 'referer: https://www.naver.com/' \
  -H 'sec-ch-ua: &quot;Not_A Brand&quot;;v=&quot;99&quot;, &quot;Google Chrome&quot;;v=&quot;109&quot;, &quot;Chromium&quot;;v=&quot;109&quot;' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: &quot;macOS&quot;' \
  -H 'sec-fetch-dest: empty' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-site: same-site' \
  -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' \
  --compressed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj; &lt;span&gt;&amp;nbsp; HTTP 헤더 &amp;gt; Content-Type&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;Content-Type 헤더는 리소스의 media type을 나타내준다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;요청/응답 하는 API가 media를 포함한 multipart 형태인지, text/html 형태인지, json 형태인지 등등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;이를 통해 서버는 처리가 필요한 내용이 다르다. &lt;/span&gt;&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; &lt;span&gt; &amp;nbsp;&lt;/span&gt;Content-Type 예시&lt;/h3&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something&lt;/code&gt;&lt;/pre&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;zwj; &lt;span&gt; &amp;nbsp;&lt;/span&gt;실제 응답 헤더&amp;nbsp;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;확인 방법&lt;br /&gt;크롬 개발자 도구를 키면 Response Headers &amp;gt; content-type 을 확인할 수 있다.&lt;/blockquote&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;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceJCbd/btrWpnROM8b/NkT5ayz9qQTAt6xWlCM2pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceJCbd/btrWpnROM8b/NkT5ayz9qQTAt6xWlCM2pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceJCbd/btrWpnROM8b/NkT5ayz9qQTAt6xWlCM2pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceJCbd%2FbtrWpnROM8b%2FNkT5ayz9qQTAt6xWlCM2pk%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;939&quot; height=&quot;451&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  HTTP 헤더 특징&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  참고링크&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1674658082568&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;Content-Type - HTTP | MDN&quot; data-og-description=&quot;Content-Type 개체 헤더는 리소스의 media type을 나타내기 위해 사용됩니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkGdcp/hyRoCs85Iv/6GdBovKAki5jXPXQYdQxLK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkGdcp/hyRoCs85Iv/6GdBovKAki5jXPXQYdQxLK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;Content-Type - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Content-Type 개체 헤더는 리소스의 media type을 나타내기 위해 사용됩니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1674658099903&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;HTTP 헤더 - HTTP | MDN&quot; data-og-description=&quot;HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bVDhzN/hyRoLcxmNw/2yhsGrYRcFgLy6bOqV4cvK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Headers&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bVDhzN/hyRoLcxmNw/2yhsGrYRcFgLy6bOqV4cvK/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;HTTP 헤더 - HTTP | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&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>SERVER</category>
      <category>content type</category>
      <category>Content-Type</category>
      <category>ghy</category>
      <category>http</category>
      <category>http 요청</category>
      <category>HTTP/2</category>
      <category>HTTP헤더</category>
      <category>server</category>
      <category>쿠키</category>
      <category>토큰</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/72</guid>
      <comments>https://gh402.tistory.com/72#entry72comment</comments>
      <pubDate>Thu, 26 Jan 2023 00:12:50 +0900</pubDate>
    </item>
    <item>
      <title> [Network] 네트워크 기초 2 : 데이터 링크 계층</title>
      <link>https://gh402.tistory.com/71</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  OSI 2계층 : 데이터링크 계층&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  데이터 링크 계층의 역할과 기능에 대해서 알아본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  데이터 링크 계층에서 나오는 기본적인 용어에 대해 정리한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  들어가기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  데이터 링크 계층은 LAN에서 데이터를 정상적으로 주고받기 위해 필요한 계층&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  용어 정리&lt;/span&gt;&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;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  데이터링크 계층의 역할&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;네트워크 장비 간에 신호를 주고받는 규칙을 정한다. 일반적으로 많이 사용하는 규칙을 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&quot;이더넷&quot;&lt;/b&gt;&lt;/span&gt;이라고 한다.&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;/span&gt;&lt;/b&gt;&amp;nbsp; CSMA/CD&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;Q. 데이터를 주고 받으려면 어떤 규칙이 필요할까?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우리가 대화할 때를 생각해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;친구들과 동시에 말을 하면 대화가 되지 않을 뿐더러 말도 전달되지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;한 사람이 먼저 이야기하면 다른 사람은 &lt;b&gt;기다렸다가 말&lt;/b&gt;을 해야하고, 데이터 전송도 마찬가지이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;여러 대의 컴퓨터가 데이터를 동시에 전송하면 충돌이 나기에 기다렸다가 데이터를 보내는 방식이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이를 &lt;b&gt;CSMA/CD&lt;/b&gt; 라고 한다.&lt;/span&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CS : 데이터를 보내려고 하는 컴퓨터가 케이블에 신호가 흐르고 있는지 아닌지를 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;MA : 케이블에 데이터가 흐르고 있지 않다면 데이터를 보냄&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CD : 충돌 발생 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #8a3db6; font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;(현재는 CSMA/CD는 많이 사용하지 않고 스위치 장비가 이를 대신한다고 한다.)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;/span&gt;&lt;/b&gt;&amp;nbsp; 데이터 전송자는 &quot;누구&quot;(목적지)를 어떻게 구분할 수 있을까?&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;컴퓨터는 만들어질 때 고유의 번호인 &lt;b&gt;MAC 주소&lt;/b&gt;를 부여받는다. &lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;(&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우리나라 사람들은 주민번호가 있는 것처럼)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 MAC주소는 전세계 유일한 중복이 있지 않는 번호이다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &lt;/span&gt;&lt;/b&gt;&amp;nbsp; 데이터가 충돌하지 않는 구조&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;데이터 전송방식에는 &quot;&lt;b&gt;전이중 통신 방식&lt;/b&gt;&quot;과 &quot;&lt;b&gt;반이중 통신 방식&lt;/b&gt;&quot;이 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;1) 전이중 통신 방식&lt;/b&gt; : 데이터의 송수신을 동시에 통신하는 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;gt; 송신과 수신을 동시에 진행할 수 있도록 회선이 2개 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;2) 반이중 통신 방식&lt;/b&gt; : 회선 하나로 송신과 수신을 번갈아가면서 통신하는 방식&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;gt; 송수신을 하나의 회선으로 함께 진행하기 때문에 충돌이 발생할 수 있다.&lt;/span&gt;&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  &lt;b&gt;허브&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;아래 그림과 같은 장비를 허브라고 하며, 데이터를 보내면 모든 포트에게 전송한다는 특징이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그렇다면 하나의 컴퓨터에서 데이터를 전송한다면 포트에 연결된 모든 컴퓨터가 데이터를 받을까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;그건 아니다. 데이터를 전송할 때 목적지 정보를 추가한다면 해당 목적지의 컴퓨터만 데이터를 받는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-18 오전 12.31.04.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk8sRV/btrWwgGHB64/yKN1sr5Q3rqAhCVojzB3J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk8sRV/btrWwgGHB64/yKN1sr5Q3rqAhCVojzB3J1/img.png&quot; data-alt=&quot;이미지 링크 :&amp;amp;amp;nbsp;https://www.coupang.com/vp/products/1309953132?itemId=2326493836&amp;amp;amp;vendorItemId=70323121961&amp;amp;amp;src=1042503&amp;amp;amp;spec=10304991&amp;amp;amp;addtag=400&amp;amp;amp;ctag=1309953132&amp;amp;amp;lptag=10304991I2326493836&amp;amp;amp;itime=20230118003056&amp;amp;amp;pageType=PRODUCT&amp;amp;amp;pageValue=1309953132&amp;amp;amp;wPcid=39894349452382971257807&amp;amp;amp;wRef=&amp;amp;amp;wTime=20230118003056&amp;amp;amp;redirect=landing&amp;amp;amp;gclid=Cj0KCQiAq5meBhCyARIsAJrtdr7PpTm5GppcUMtisk3GZYyv-VCesfd5oF_57AYi-fXSVAe_BH2WDCoaAkOpEALw_wcB&amp;amp;amp;campaignid=18855706695&amp;amp;amp;adgroupid=&amp;amp;amp;isAddedCart=&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk8sRV/btrWwgGHB64/yKN1sr5Q3rqAhCVojzB3J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk8sRV%2FbtrWwgGHB64%2FyKN1sr5Q3rqAhCVojzB3J1%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;862&quot; height=&quot;430&quot; data-filename=&quot;스크린샷 2023-01-18 오전 12.31.04.png&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 링크 :&amp;amp;nbsp;https://www.coupang.com/vp/products/1309953132?itemId=2326493836&amp;amp;vendorItemId=70323121961&amp;amp;src=1042503&amp;amp;spec=10304991&amp;amp;addtag=400&amp;amp;ctag=1309953132&amp;amp;lptag=10304991I2326493836&amp;amp;itime=20230118003056&amp;amp;pageType=PRODUCT&amp;amp;pageValue=1309953132&amp;amp;wPcid=39894349452382971257807&amp;amp;wRef=&amp;amp;wTime=20230118003056&amp;amp;redirect=landing&amp;amp;gclid=Cj0KCQiAq5meBhCyARIsAJrtdr7PpTm5GppcUMtisk3GZYyv-VCesfd5oF_57AYi-fXSVAe_BH2WDCoaAkOpEALw_wcB&amp;amp;campaignid=18855706695&amp;amp;adgroupid=&amp;amp;isAddedCart=&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  &lt;b&gt;스위치&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;요즘은 허브 대신 스위치를 많이 사용한다고 한다. 뭐가 더 좋은걸까?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;스위치에는 MAC 주소 테이블이 존재하여 허브처럼 모든 포트에 데이터를 전송하지 않아도 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;i&gt;(Hash table 이라고 생각하면 좋을듯)&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;또한, 전이중 통신 방식을 사용하여 데이터 충돌의 위험도 없다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  ARP(Address Resolution Protocol)&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;목적지 컴퓨터의 IP 주소를 통해 MAC주소를 찾기 위한 프로토콜&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt; &amp;nbsp; ARP 요청&lt;/span&gt;&lt;/b&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;출발지 컴퓨터가 목적지 컴퓨터의 MAC주소를 모르면, 네트워크에 브로드캐스트를 하는 요청&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  ARP 응답&lt;/span&gt;&lt;/b&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;고정IP를 가진 컴퓨터는 MAC주소를 응답으로 보냄&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  ARP 테이블&lt;/span&gt;&lt;/b&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;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;출발지 컴퓨터에서 MAC주소와 IP 주소의 매핑 정보를 메모리에 보관하는 테이블&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;해당 데이터는 캐시를 통해 TTL 관리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  ARP 캐시 내용&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-25 오후 4.45.19.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7TWG0/btrFGgQTR2R/fW45XNL7xZeRQKBu9azDUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7TWG0/btrFGgQTR2R/fW45XNL7xZeRQKBu9azDUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7TWG0/btrFGgQTR2R/fW45XNL7xZeRQKBu9azDUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7TWG0%2FbtrFGgQTR2R%2FfW45XNL7xZeRQKBu9azDUK%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;1474&quot; height=&quot;1350&quot; data-filename=&quot;스크린샷 2022-06-25 오후 4.45.19.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;1350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  참고자료&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1) 도서 : 모두의 네트워크 책&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS/Network</category>
      <category>arp</category>
      <category>ghy</category>
      <category>Mac</category>
      <category>OSI 7</category>
      <category>기능</category>
      <category>네트워크</category>
      <category>데이터링크</category>
      <category>데이터링크 계층 역할</category>
      <category>역할</category>
      <category>이더넷</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/71</guid>
      <comments>https://gh402.tistory.com/71#entry71comment</comments>
      <pubDate>Thu, 19 Jan 2023 00:00:15 +0900</pubDate>
    </item>
    <item>
      <title>[Spring Boot] REDIS PUB/SUB 구현</title>
      <link>https://gh402.tistory.com/70</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;  기능 정의&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;message pub/sub 기능으로 &lt;b&gt;누군가 메세지를 보내게 되면 특정 채널에 구독하고 있는 대상에게 메세지가 전송되는 구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;redis pub/sub 구조&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gh402.tistory.com/69&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gh402.tistory.com/69&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673154429124&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;[REDIS] REDIS PUB/SUB 구조&quot; data-og-description=&quot;⭐ REDIS PUB/SUB 기능 소개 Redis는 캐싱 역할 뿐만 아니라 message pub/sub 기능도 가지고 있다. 간단한 채팅을 구현하거나, 하나의 특정 메세지를 여러 사람이 받아야할 때 사용한다. ( 아래의 그림 참고&quot; data-og-host=&quot;gh402.tistory.com&quot; data-og-source-url=&quot;https://gh402.tistory.com/69&quot; data-og-url=&quot;https://gh402.tistory.com/69&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8gKJk/hyRcImTIcL/KV1mTeKFFlkULkkEbZX6I1/img.png?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/rX49D/hyRcGP8jrH/QgkcBKVFaOTyrjmOkkaju0/img.png?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/cn2fCm/hyRcMiwkxu/mEoMvHIjC68VeLMEXo0nx1/img.jpg?width=960&amp;amp;height=1280&amp;amp;face=0_0_960_1280&quot;&gt;&lt;a href=&quot;https://gh402.tistory.com/69&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gh402.tistory.com/69&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8gKJk/hyRcImTIcL/KV1mTeKFFlkULkkEbZX6I1/img.png?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/rX49D/hyRcGP8jrH/QgkcBKVFaOTyrjmOkkaju0/img.png?width=800&amp;amp;height=456&amp;amp;face=0_0_800_456,https://scrap.kakaocdn.net/dn/cn2fCm/hyRcMiwkxu/mEoMvHIjC68VeLMEXo0nx1/img.jpg?width=960&amp;amp;height=1280&amp;amp;face=0_0_960_1280');&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;[REDIS] REDIS PUB/SUB 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;⭐ REDIS PUB/SUB 기능 소개 Redis는 캐싱 역할 뿐만 아니라 message pub/sub 기능도 가지고 있다. 간단한 채팅을 구현하거나, 하나의 특정 메세지를 여러 사람이 받아야할 때 사용한다. ( 아래의 그림 참고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gh402.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;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;lettuce&lt;/li&gt;
&lt;li&gt;Jedis&lt;/li&gt;
&lt;li&gt;Redisson&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;spring boot 2.0 이상 부터 spring-boot-starter-data-redis 에 기본 클라이언트는 lettuce 이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;lettuce는 Netty(비동기 이벤트 기반 고성능 네트워크 프레임워크) 기반의 Redis 클라이언트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;2.3.6.RELEASE 버전에 Lettuce client 가 사용된 것을 확인할 수 있다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciJcyI/btrVAur7thH/eVmzldzai3tUxpmt2dwvUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciJcyI/btrVAur7thH/eVmzldzai3tUxpmt2dwvUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciJcyI/btrVAur7thH/eVmzldzai3tUxpmt2dwvUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciJcyI%2FbtrVAur7thH%2FeVmzldzai3tUxpmt2dwvUk%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;1114&quot; height=&quot;314&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &lt;span&gt;&amp;nbsp; redis pub/sub 특징&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span&gt;Redis pub/sub은 보내는 메세지를 별도로 저장하지 않고, 메세지를 한 번 보내면 재전송은 일어나지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Redis 어디에도 저장되지 않고, 클라이언트가 메세지 받는 것을 보장하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&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;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Spring boot 로 Redis pub/sub 구현&amp;nbsp;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) redis config 설정&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;spring-boot-starter-data-redis dependency 추가해줘야 한다! (이 정도는 다 알겠지만,, 혹시나 하여!)&lt;/blockquote&gt;
&lt;pre id=&quot;code_1673792846879&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @Bean
    public RedisMessageListenerContainer redisMessageListener(RedisConnectionFactory connectionFactory) {
        val container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

    @Bean
    public RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate = new RedisTemplate&amp;lt;&amp;gt;();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer&amp;lt;&amp;gt;(String.class));
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer&amp;lt;&amp;gt;(String.class));

        return redisTemplate;
    }&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;h3 data-ke-size=&quot;size23&quot;&gt;2) redis publish (메세지 발송)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;publish 함수를 통해 메세지를 발송하고자 하는 topic 과 String 형태의 전달할 message를 파라미터로 넣어주면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;topic을 구독하고 있는 모든 client 에게 메세지가 전송된다.&lt;/p&gt;
&lt;pre id=&quot;code_1673793249353&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@RequiredArgsConstructor
public class MessagePublish {
    private final RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate;
    
    public void publish(ChannelTopic topic, String message) {
        log.info(&quot;redis publish &amp;gt;&amp;gt; topic: {}, message: {}&quot;, topic.getTopic(), message);

        try {
            redisTemplate.convertAndSend(topic.getTopic(), message);
        } catch (Exception e) {
            log.error(&quot;redis connection error : {} &quot;, e.getMessage());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) redis publish (메세지 발송)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3-1. @PostConstruct 애노테이션을 통해서 서버가 실행될 때 &quot;channel&quot;이라는 채널에 대해 메세지가 오는지 창구를 열어놓는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3-2. MessageListener의 onMessage함수를 오버라이드해서 Message가 들어오면 해당 함수에서 메세지를 처리할 수 있다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1673793660621&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Slf4j
@Service
@RequiredArgsConstructor
public class MessageSub implements MessageListener {
    private final RedisTemplate&amp;lt;String, Object&amp;gt; redisTemplate;
    private final RedisMessageListenerContainer listenerContainer;

    private static final String REDIS_CHANNEL = &quot;channel&quot;;

    @PostConstruct
    public void init() {
        listenerContainer.addMessageListener(this, new ChannelTopic(REDIS_CHANNEL));
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        val now = System.currentTimeMillis();
        val msg = (String) redisTemplate.getValueSerializer().deserialize(message.getBody());
        
        log.info(&quot;redis recv message. message:{}, pattern:[{}], set now:{}&quot;, msg, new String(pattern), now);
    }
}&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;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;a href=&quot;https://brunch.co.kr/@springboot/374&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://brunch.co.kr/@springboot/374 &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;lettuce 공식문서
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;a style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; href=&quot;https://lettuce.io/core/release/reference/&quot;&gt;https://lettuce.io/core/release/reference/&lt;/a&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;</description>
      <category>SERVER/Spring Boot</category>
      <category>ghy</category>
      <category>lettuce</category>
      <category>pub sub 예제</category>
      <category>Publish</category>
      <category>redis pub sub</category>
      <category>spring boot</category>
      <category>spring boot redis pub sub 예제</category>
      <category>spring boot redis pub/sub</category>
      <category>springboot redis pubsub</category>
      <category>레디스 pubsub</category>
      <author>GaGah</author>
      <guid isPermaLink="true">https://gh402.tistory.com/70</guid>
      <comments>https://gh402.tistory.com/70#entry70comment</comments>
      <pubDate>Mon, 16 Jan 2023 00:17:03 +0900</pubDate>
    </item>
  </channel>
</rss>