<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Trigger</title>
    <link>https://cuna.tistory.com/</link>
    <description>좌충우돌 개발 블로그</description>
    <language>ko</language>
    <pubDate>Sun, 12 Jul 2026 21:32:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_쿠나</managingEditor>
    <image>
      <title>Trigger</title>
      <url>https://tistory1.daumcdn.net/tistory/4401825/attach/de3fe5b0c4984f4ba7d35f1aacb88cb2</url>
      <link>https://cuna.tistory.com</link>
    </image>
    <item>
      <title>빅오표기법과 복잡도</title>
      <link>https://cuna.tistory.com/223</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.boostcourse.org/cs204/lecture/480344/?isDesc=false&quot; rel=&quot;noopener&quot;&gt;https://www.boostcourse.org/cs204/lecture/480344/?isDesc=false&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762153460747&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자바로 구현하고 배우는 자료구조&quot; data-og-description=&quot;부스트코스 무료 강의&quot; data-og-host=&quot;www.boostcourse.org&quot; data-og-source-url=&quot;https://www.boostcourse.org/cs204/lecture/480344/?isDesc=false&quot; data-og-url=&quot;http://www.boostcourse.org/cs204/lecture/480344/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NV2Em/hyZM6yg3S0/aFiKeQEAcSZkkmN5VcrRkk/img.png?width=760&amp;amp;height=426&amp;amp;face=0_0_760_426&quot;&gt;&lt;a href=&quot;https://www.boostcourse.org/cs204/lecture/480344/?isDesc=false&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.boostcourse.org/cs204/lecture/480344/?isDesc=false&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NV2Em/hyZM6yg3S0/aFiKeQEAcSZkkmN5VcrRkk/img.png?width=760&amp;amp;height=426&amp;amp;face=0_0_760_426');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자바로 구현하고 배우는 자료구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;부스트코스 무료 강의&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.boostcourse.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 강의를 보고 정리한 내용~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내가 빅오표기법이나 복잡도를 이해할 때 이 강의가 가장 도움이 되었기 때문에 공유함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;규칙1.&lt;/b&gt; input &amp;ge; 0 (입력값은 항상 0보다 크다. 복잡도는 항상 0보다 크다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;규칙2.&lt;/b&gt; functions do more work for more input (더 많은 입력값이 있으면 더 많은 작업이 필요하다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;규칙3.&lt;/b&gt; drop all constants 상수는 고려하지 않음. (3n, 5n, 10n &amp;rArr; 모두 n 임)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;규칙4.&lt;/b&gt; ignore lower order terms 낮은 차수의 항을 무시함 (n^3 + n^2 + n 같은게 있으면 n^3만 고려함)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;규칙5.&lt;/b&gt; ignore the base of logs 로그의 밑을 무시함. 모든 로그는 서로 배수관계이므로 복잡도에 대해 얘기할 때 로그의 밑은 무시해도 된다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;규칙6.&lt;/b&gt; 2n = O(n) &amp;rArr; 2n이 어떤 함수의 집합(O(n))에 속함 (등호 : 집합에 속한다는 뜻)&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;&lt;b&gt;&lt;i&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 알고리즘에서 1보다 작은 값은 고려하지 않음.. 무한으로 커졌을 때를 고려함(최대값) &lt;/span&gt;&lt;/i&gt;&lt;/b&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 style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; 빅오표기법 &lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Big O Notation (* O = Ordnung *질서라는 뜻의 독어) &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-origin-width=&quot;944&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wqq7c/dJMcag4SmIu/79QMfivb1pE2w39rNLM7fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wqq7c/dJMcag4SmIu/79QMfivb1pE2w39rNLM7fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wqq7c/dJMcag4SmIu/79QMfivb1pE2w39rNLM7fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWqq7c%2FdJMcag4SmIu%2F79QMfivb1pE2w39rNLM7fK%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;944&quot; height=&quot;435&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;435&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;377&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLvQuK/dJMcahJtWAS/wgBwPfvCm1bbustqZQIZJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLvQuK/dJMcahJtWAS/wgBwPfvCm1bbustqZQIZJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLvQuK/dJMcahJtWAS/wgBwPfvCm1bbustqZQIZJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLvQuK%2FdJMcahJtWAS%2FwgBwPfvCm1bbustqZQIZJ1%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;377&quot; height=&quot;321&quot; data-origin-width=&quot;377&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;o 작은 오:&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;빠르지만 같지는 않음 : faster&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;O 빅오복잡도(big o complexity)&lt;/b&gt; : 어떤 알고리즘이 비교하고자 하는 다른 알고리즘과 같거나 더 빠른 것 : same or faster&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;theta;&amp;nbsp; 세타&lt;/b&gt; : 알고리즘이 같은 정도로 증가함 : same rate&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;Omega; 빅오메가복잡도(big omega complexity):&lt;/b&gt; 같거나 더 느린 알고리즘 : same or slower&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &amp;omega; 리틀오메가복잡도&lt;/b&gt; : 더 느리지만 같지 않음 : slower&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;n^2 는 &lt;b&gt;O&lt;/b&gt; (n^3)으로 표기할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;O&lt;/b&gt; 는 '최악의 경우 이 정도'라는 의미로 더 자주 쓰이고, o는 '이것보단 확실히 빠르다'는 의미로 쓰인다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2^n= &lt;b&gt;&amp;omega;&lt;/b&gt; (n) 얘도 이렇게 쓸 수 있는거 맞고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3n^3+4n^2+5n+6 = &lt;b&gt;&amp;theta;&lt;/b&gt; ( n^3) 얘도 이렇게 쓸 수 있는거 맞음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그래프의 어디 범위에 속하느냐로 표기법을 파악할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;강의를 천천히 따라가면 더 이해하기 쉬울 듯&lt;/p&gt;</description>
      <category>ETC</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/223</guid>
      <comments>https://cuna.tistory.com/223#entry223comment</comments>
      <pubDate>Mon, 3 Nov 2025 16:11:56 +0900</pubDate>
    </item>
    <item>
      <title>[web] 정리: rtsp를 웹에서 재생하고 싶어요</title>
      <link>https://cuna.tistory.com/173</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어쩌다가..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 rtsp를 웹에서 재생하는 방법에는 여러가지 방법이 있다.&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;1. vlc player를 사용하여 http로 스트림하여 재생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ffmpeg를 사용하여 http로 스트림하여 재생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. node-rtsp-steam을 사용하여 jsmpeg로 재생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정도인듯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고했던 웹사이트&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=TBIlB4tX998&quot;&gt;https://www.youtube.com/watch?v=TBIlB4tX998&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EbGPN95Vdgo&quot;&gt;https://www.youtube.com/watch?v=EbGPN95Vdgo&lt;/a&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;2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.to/tejasvi2/rtsp-stream-to-web-browser-using-ffmpeg-1cb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dev.to/tejasvi2/rtsp-stream-to-web-browser-using-ffmpeg-1cb&lt;/a&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;3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/kyriesent/node-rtsp-stream&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/kyriesent/node-rtsp-stream&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/phoboslab/jsmpeg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/phoboslab/jsmpeg&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;figure id=&quot;og_1701233136698&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;Web에서 RTSP 영상의 재생&quot; data-og-description=&quot;2023/11/13&quot; data-og-host=&quot;www.notion.so&quot; data-og-source-url=&quot;https://www.notion.so/cuna/Web-RTSP-3840f258e99541ce9518ea176953fc4f#25bd8ee6f81643ea8d82dcb0497ea89b&quot; data-og-url=&quot;https://www.notion.so/3840f258e99541ce9518ea176953fc4f&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.notion.so/cuna/Web-RTSP-3840f258e99541ce9518ea176953fc4f#25bd8ee6f81643ea8d82dcb0497ea89b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.notion.so/cuna/Web-RTSP-3840f258e99541ce9518ea176953fc4f#25bd8ee6f81643ea8d82dcb0497ea89b&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;Web에서 RTSP 영상의 재생&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2023/11/13&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>WEB</category>
      <category>ffmpeg</category>
      <category>HLS</category>
      <category>opencv</category>
      <category>RTSP</category>
      <category>streaming</category>
      <category>web</category>
      <category>스트리밍</category>
      <category>웹</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/173</guid>
      <comments>https://cuna.tistory.com/173#entry173comment</comments>
      <pubDate>Fri, 19 Jul 2024 17:18:35 +0900</pubDate>
    </item>
    <item>
      <title>Web 에서 RTSP 영상의 재생 (2)</title>
      <link>https://cuna.tistory.com/221</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;죽지도 않고 또 rtsp 스트리밍을 하는 사람..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 포스팅은 이것&lt;/p&gt;
&lt;figure id=&quot;og_1701224857337&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;[web] 정리: rtsp를 웹에서 재생하고 싶어요&quot; data-og-description=&quot;어쩌다가.. 아무튼 rtsp를 웹에서 재생하는 방법에는 여러가지 방법이 있다. 1. vlc player를 사용하여 http로 스트림하여 재생한다. 2. ffmpeg를 사용하여 http로 스트림하여 재생한다. 3. node-rtsp-steam을 &quot; data-og-host=&quot;cuna.tistory.com&quot; data-og-source-url=&quot;https://cuna.tistory.com/173&quot; data-og-url=&quot;https://cuna.tistory.com/173&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d8RGws/hyUCcr38y7/fACe0vnjlTl5tYAG2kaJCK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/JYhEv/hyUE0Kfz2K/fl9r0HQ5dlgGFxcj9ktfX0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://cuna.tistory.com/173&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cuna.tistory.com/173&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d8RGws/hyUCcr38y7/fACe0vnjlTl5tYAG2kaJCK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/JYhEv/hyUE0Kfz2K/fl9r0HQ5dlgGFxcj9ktfX0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[web] 정리: rtsp를 웹에서 재생하고 싶어요&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어쩌다가.. 아무튼 rtsp를 웹에서 재생하는 방법에는 여러가지 방법이 있다. 1. vlc player를 사용하여 http로 스트림하여 재생한다. 2. ffmpeg를 사용하여 http로 스트림하여 재생한다. 3. node-rtsp-steam을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cuna.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Flask를 활용한 재생, 그리고 ffmpeg(hls 변환) - nginx 스트리밍 서버를 만들어보는 이야기가 기록됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 완벽하게 된 것은 아니긴 하지만요.. 글이 계속 수정될 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 여기다 코드 붙여서 쓰자니 너무 번거로워서 노션에 작성해버렸습니다 ^^..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;노션 놀러오시라&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1701225433343&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;Web에서 RTSP 영상의 재생&quot; data-og-description=&quot;2023/11/13&quot; data-og-host=&quot;www.notion.so&quot; data-og-source-url=&quot;https://www.notion.so/cuna/Web-RTSP-3840f258e99541ce9518ea176953fc4f#25bd8ee6f81643ea8d82dcb0497ea89b&quot; data-og-url=&quot;https://www.notion.so/3840f258e99541ce9518ea176953fc4f&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.notion.so/cuna/Web-RTSP-3840f258e99541ce9518ea176953fc4f#25bd8ee6f81643ea8d82dcb0497ea89b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.notion.so/cuna/Web-RTSP-3840f258e99541ce9518ea176953fc4f#25bd8ee6f81643ea8d82dcb0497ea89b&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;Web에서 RTSP 영상의 재생&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2023/11/13&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.notion.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/221</guid>
      <comments>https://cuna.tistory.com/221#entry221comment</comments>
      <pubDate>Wed, 29 Nov 2023 13:44:47 +0900</pubDate>
    </item>
    <item>
      <title>[백엔드 로드맵] #1 인터넷의 작동 원리</title>
      <link>https://cuna.tistory.com/220</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://cs.fyi/guide/how-does-internet-work&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://cs.fyi/guide/how-does-internet-work&lt;/a&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;/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;인터넷이란&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷이 무엇인지 알기 전에, &lt;i&gt;네트워크&lt;/i&gt;가 무엇인지 알 필요가 있다. 네트워크는 서로 연결된 여러 기기, 컴퓨터의 그룹이다. 예를 들어, 당신의 집에는 컴퓨터와 기기들의 네트워크가 있을 것이다. 옆집에 사는 당신의 친구도 비슷한 기기의 네트워크가 있을테고, 다른 이웃도 역시 그럴 것이다. 이런 네트워크들이 서로 연결되면 인터넷을 형성하게 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;인터넷은 네트워크들의 네트워크이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷은 1960년 말 미국 국방부에 의해 핵 공격을 방어하기 위한 분산형 통신 네트워크를 만들기 위해 개발되었다. 시간이 지나 전 세계를 아우르는 복잡하고 정교한 네트워크로 발전하게 되었다.&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;h3 data-ke-size=&quot;size23&quot;&gt;인터넷은 어떻게 작동하는가 : 개요&lt;/h3&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;패킷이 정확히 도착하고 전달되었는지를 확인하기 위해 인터넷은 IP(internet protocal)이나 TCP(transmission control protocol) 과 같은 다양한 프로토콜을 사용한다. IP는 패킷을 정확한 목적지에 라우팅(경로 설정?)할 수 있도록 하고, TCP는 그동안 패킷이 정확한 요청에 확실히 전송되었는지를 보장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 핵심 프로토콜 외에도 다른 기술과 프로토콜들이 인터넷을 통한 데이터 교환과 통신에 사용되고 있다. Domain Name System(DNS), Hypertext Transfer Protocol(HTTP)나 Secure Sockets Layer/Transport Layer Security(SSL/TLS) 프로토콜 등이 있다. 개발자는 어떻게 이런 기술들과 프로토콜이 인터넷을 통해 데이터 교환과 통신을 가능하게 하는지에 대한 확실한 이해가 필요하다.&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;기본 개념과 용어(Terminology)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷을 이해하기 위해 기본적인 개념과 용어에 친숙해질 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Packet: 데이터의 작은 단위로 인터넷 상에서 전송된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Router: 서로 다른 네트워크 간에 데이터 패킷을 전달하는 장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP Address: 네트워크 상에 있는 각 장치의 유일 식별 확인자. 데이터 경로 지정에(route) 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Domain Name: 사람이 읽을 수 있도록 만든 웹사이트의 고유 이름. 예) google.com&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS: 도메인 이름을 IP 주소로 번역하는 역할을 하는 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP: 클라이언트(웹브라우저)와 서버(웹사이트) 사이에서 데이터를 전달하고자 할 때 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS: HTTP의 암호화 버전. 클라이언트와 서버 사이 보안 통신 제공.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL/TLS: 인터넷상에서 보안 통신에 주로 사용되는 프로토콜.&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;/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;세상 많은 프로토콜이 인터넷 통신에 사용된다. Internet Protocal(IP), Transmission Control Protocol(TCP), UserDatagram Protocol(UDP), Domain Name System(DNS) etc.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP는 데이터 패킷을 정확한 목적지에 도착할 수 있도록 하는 역할이고, TCP랑 UDP는 패킷이 안전하고 효율적으로 전송될 수 있도록 하는 역할을 한다. DNS는 도메인 이름을 IP 주소로 번역하고, HTTP는 클라이언트와 서버 사이 데이터를 전송할 때 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표준화된 프로토콜을 사용할 때의 장점은 제조사나 공급업체가 다른 시스템이나 장치도 매끄럽게 소통이 가능하다는 점이다. 예를 들어 한 회사가 개발한 웹 브라우저는 둘 다 HTTP 프로토콜을 준수하는 한 다른 회사에서 개발된 웹 서버와 통신할 수 있다.&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;h3 data-ke-size=&quot;size23&quot;&gt;IP주소와 도메인 이름의 이해&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP주소와 도메인 이름은 인터넷  작업 시 이해해야할 매우 중요한 개념이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP주소는 네트워크에서 각 장치를 지정하는 유일 식별자이다. 데이터를 정확한 목적지에 라우팅할 때(경로설정) 사용되며, 정보가 지정된 수신자에게 보낸 것임을 보장한다. IP 주소는 전형적으로 '&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;192.168.1.1'과 같이&lt;/span&gt; 점으로 구분된 4개의 숫자들로 표현된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도메인 이름, 다른 말로 사람이 읽을 수 있는 이름은 웹사이트와 다른 인터넷 리소스를 식별할 때 사용된다. 'google.com'과 같이 점으로 구분된 두 개 이상의 파트로 구성된다. 도메인 이름은 DNS를 사용해서 IP주소로 번역된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DNS는 인터넷 하부구조(infrastructure)에서 중요한 부분을 담당한다. 도메인 이름을 IP주소로 번역하는 것이다. 당신이 웹 브라우저에서 도메인 이름을 쳤을 때, 당신의 컴퓨터는 DNS 쿼리를 DNS 서버로 보내 도메인 이름에 상응하는 IP 주소를 반환한다. 당신의 컴퓨터는 반환받은 IP 주소로 웹사이트나 당신이 요청한 다른 리소스에 접속할 수 있게한다.&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;HTTP와 HTTPS&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 기반의 애플리케이션과 서비스에서 가장 흔하게 쓰이는 프로토콜이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP는 클라이언트와 서버간에 데이터를 전송할 때 쓰이는 프로토콜이다. 당신이 웹사이트를 방문하면 브라우저가 HTTP요청을 서버로 보내 당신이 요청한 웹페이지나 다른 리소스를 물어보고, 서버는 요청한 데이터가 담긴 HTTP응답을 클라이언트에게 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS는 HTTP에서 더 안전한 버전으로, 전송될 데이터를 SSL/TLS 암호화를 사용해 암호화한다. 이는 security의 추가적인 층을 제공해서, 로그인 정보나 결제 정보같은 민감한 정보를 보호하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS를 사용하는 웹사이트에 방문하게 되면, 당신의 브라우저는 자물쇠 모양 아이콘을 주소창에 띄우는데, 이는 이 연결이 안전하다는 것을 의미한다. 또한 &quot;https&quot; 라고 웹사이트 주소가 시작되는 것도 마찬가지이다.&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;TCP/IP 로 애플리케이션 생성하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP(Transmission Control Protocol/Internet Protocol) 은 대부분의 인터넷 기반 어플리케이션과 서비스에서 사용되는 기본적인 통신 프로토콜이다. 이 프로토콜은 다른 장치간에 운영되고 있는 어플리케이션 사이에서 안전하고, 정해진 순서에 따라 오류가 검증된 데이터 전달을 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP 어플리케이션을 생성할 때 꼭 이해해야만 하는 개념:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ports: 포트는 장치에서 실행되는 서비스나 어플리케이션을 식별하기 위해 사용된다. 각각의 어플리케이션과 서버는 고유한 포트 번호가 지정되어 데이터가 올바른 방향에 보내질 수 있도록 한다.&lt;/li&gt;
&lt;li&gt;Sockets: 소켓은 IP주소와 포트넘버를 합한 것으로, 통신에서 특정 endpoint를 대표한다. 소켓은 장치간의 연결이나 어플리케이션간의 데이터 전송을 하고자할 때 사용된다.&lt;/li&gt;
&lt;li&gt;Connections: 커넥션은 두 개의 장치가 서로 통신하고 싶을 때 두 개의 소켓에서 설립된다. 연결 설립(establishment) 과정에서 기기들은 최대 분할 사이즈나 창 크기와 같이 연결 상에서 데이터가 어떻게 전송될지에 대한 다양한 파라미터를 협의한다.&lt;/li&gt;
&lt;li&gt;Data transfer: 커넥션이 형성되면 데이터는 각 장치에서 실행되는 어플리케이션 사이를 오갈 수 있다. 데이터는 일반적으로 분할되어 전송되고, 각각 분할은 연속된 숫자와 믿을 만한 전달을 보증하는 메타데이터를 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TCP/IP를 사용하여 어플리케이션을 생성할 때, 당신의 앱이 적절한 포트, 소켓, 커넥션과 작업할 수 있도록 고안되었는지 확인해야 한다. 또한 TCP/IP와 흔히 사용되는 HTTP, FTP, SMTP(Simple Mail Tranfer Protocol)과 같은 다양한 프로토콜 및 표준에 익숙해질 필요가 있다. 이런 개념과 프로토콜을 이해하는 것은 효율적이고, 확장가능한, 안전한 인터넷 기반 어플리케이션과 서비스를 만들 때 필수적인 요소이다.&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;SSL/TLS와 안전한 인터넷 통신하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말했듯이, SSL/TLS는 데이터가 인터넷 상에서 전송되기 전에 암호화를 하기 위해 사용된다. 웹 브라우저, 이메일 클라이언트나 파일 전송 프로그램같은 어플리케이션에서 안전한 연결을 제공하고자 할 때 주로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL/TLS를 사용해서 인터넷 통신을 보호하고자 할 때는 아래와 같은 개념을 이해할 필요가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Certificates: SSL/TLS 인증(certifications)은 클라이언트와 서버간의 신뢰를 형성한다. 인증은 서버를 식별하는 정보가 포함되어 있고, 신용할 수 있는 제 3자에 의한 서명이 포함된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Handshake: SSL/TLS 핸드셰이크 과정에서 클라이언트와 서버는 암호화 알고리즘과 안전한 커넥션에 필요한 다른 파라미터를 협의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Encryption: 보안 연결이 성립되면 데이터는 알고리즘을 사용하여 암호화되며 클라이언트와 서버 간에 안전한 데이터 전달을 할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 기반 서비스나 어플리케이션을 만들 때는 어떻게 SSL/TLS 가 작용하는지 이해하는 것이 중요하다. 그리고 어플리케이션이 민감한 정보를 전송할 때 SSL/TLS를 사용하도록 고안되었는지 확인해야 한다. 또한 서버에 대한 유효한 SSL/TLS 인증서를 획득 및 유지하고 SSL/TLS 연결을 구성 및 보호하기 위한 모범 사례를 따라야 합니다. 그렇게 하면 유저들의 데이터를 보호할 수 있고 인터넷을 통한 어플리케이션의 무결성(integrity)과 기밀성(confidentiality)을 보장할 수 있다.&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷은 지속적으로 발전하고 새로운 기술과 트렌드가 매일 떠오른다. 개발자는 혁신적이고 효과적인 앱과 서비스를 구축하기 위해 계속해서 개발 사항을 최신 상태로 유지해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5G: 5G는 모바일 네트워크 기술의 최신 세대로, 빠른 속도와 적은 지연, 이전 세대보다 더 큰 수용량을 제공한다. 자율주행 또는 원격 수술과 같은 새로운 어플리케이션과 케이스에 사용될 것으로 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Internet of Things(IoT): 물리적 기기, 차량, 가전제품이나 다른 인터넷과 연결된 제품의 네트워크를 반영하여 데이터를 교환할 수 있도록 한다. IoT가 성장하면 헬스케어, 운송, 제조같은 산업 분야의 혁신이 기대된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Artificial Intelligence(AI): 머신러닝이나 자연어 프로세싱 같은 인공지능 기술은 이미 넓은 범위의 어플리케이션과 서비스에서 사용되고 있다. 음성비서에서 fraud detection(사기 탐지?) 까지..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blockchain: 블록체인은 distributed ledger technology(분산원장기술)로 분산된 안전한 트랜잭션을 가능하게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edge computing: 에지&amp;nbsp;컴퓨팅은&amp;nbsp;중앙&amp;nbsp;집중식&amp;nbsp;데이터&amp;nbsp;센터가&amp;nbsp;아닌&amp;nbsp;네트워크&amp;nbsp;에지에서&amp;nbsp;데이터를&amp;nbsp;처리하고&amp;nbsp;저장하는&amp;nbsp;것을&amp;nbsp;말합니다.&amp;nbsp;실시간&amp;nbsp;분석&amp;nbsp;및&amp;nbsp;저지연&amp;nbsp;애플리케이션과&amp;nbsp;같은&amp;nbsp;새로운&amp;nbsp;사용&amp;nbsp;사례&amp;nbsp;및&amp;nbsp;애플리케이션을&amp;nbsp;가능하게&amp;nbsp;할&amp;nbsp;것으로&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;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷은 상호연결된 컴퓨터들의 글로벌 네트워크다. 데이터를 교환하기 위해서는 통신 프로토콜의 표준 세트를 사용해야 하낟.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷은 IP나 TCP같은 표준화된 프로토콜을 사용해 장치와 컴퓨터 시스템이 연결됨으로써 작용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷의 핵심은 장치와 시스템 사이 트래픽을 전달하는 상호연결된 라우터의 글로벌 네트워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;익숙해져야할 개념과 용어에는 패킷, 라우터, IP주소, 도메인네임, dns, http, https, ssl/tls 가 있다.&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;</description>
      <category>ETC</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/220</guid>
      <comments>https://cuna.tistory.com/220#entry220comment</comments>
      <pubDate>Tue, 16 May 2023 18:00:52 +0900</pubDate>
    </item>
    <item>
      <title>[백엔드 로드맵] 백엔드 로드맵</title>
      <link>https://cuna.tistory.com/219</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;1999&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIxmMq/btsf3PPVEF9/7x6AOEWVzuOP7u9Xqya4b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIxmMq/btsf3PPVEF9/7x6AOEWVzuOP7u9Xqya4b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIxmMq/btsf3PPVEF9/7x6AOEWVzuOP7u9Xqya4b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIxmMq%2Fbtsf3PPVEF9%2F7x6AOEWVzuOP7u9Xqya4b0%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;789&quot; height=&quot;1999&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;1999&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://roadmap.sh/backend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://roadmap.sh/backend&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684201280728&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;Backend Developer Roadmap&quot; data-og-description=&quot;Learn to become a modern backend developer using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern backend development.&quot; data-og-host=&quot;roadmap.sh&quot; data-og-source-url=&quot;https://roadmap.sh/backend&quot; data-og-url=&quot;https://roadmap.sh/backend&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/X7FN2/hySCX4cm6b/9QCP1lGkgdgycoPPZhf1X1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://roadmap.sh/backend&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://roadmap.sh/backend&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/X7FN2/hySCX4cm6b/9QCP1lGkgdgycoPPZhf1X1/img.png?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&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;Backend Developer Roadmap&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn to become a modern backend developer using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern backend development.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;roadmap.sh&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이트의 아티클 하나씩 번역해보려고 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝을 낼 수 있을지는 의문이긴 하지만ㅎㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>ETC</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/219</guid>
      <comments>https://cuna.tistory.com/219#entry219comment</comments>
      <pubDate>Tue, 16 May 2023 18:00:38 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] 문자(열)을 요리조리~~ split, charAt, toCharArray()</title>
      <link>https://cuna.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 자르고 나눌 일이 생겼는데 역시나 머릿속에 정리가 되어있지 않았고,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 간단하게... 포스팅.. 파워 초 간단... 나만알아볼듯..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. split&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자 덩어리 쪼개볼게요~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;split(String s): 문자를 s 를 기준으로 나눔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;split(String s, int i): &lt;span&gt;문자를&lt;span&gt; &lt;/span&gt;&lt;/span&gt;s 를 기준으로 i 개의 덩어리로 나눈다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String[] result = text.split(&quot; &quot;, 3);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;혹시 text가 s를 기준으로 나눴을 때 i 만큼의 덩어리로 나눌 수 없다면?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;예를 들어 text = &quot;안녕 반가워&quot; 이고 이를 split(&quot; &quot;, 3)이라고 하면?&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;그냥 [&quot;안녕&quot;, &quot;반가워&quot;] 로 결과가 나타남&lt;/i&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;2. substring&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;string의 일부를 잘라서 가져오고자 할 때 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;안녕하세요. 저는 뫄뫄입니다&quot; -&amp;gt; &quot;뫄뫄&quot;, &quot;저는 뫄뫄입니다&quot;&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;substring(int startIdx, int endIdx);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;substring(int startIdx);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx는 0부터 시작합니다ㅎㅎ&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;3. charAt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String -&amp;gt; Char을 가져오고싶을 떄 사용하게 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;charAt(int i): 문자열에서 인덱스 i 번째 문자를 가져와라&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx는 0부터 시작합니다 ㅎㅎ&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;4. toCharArray()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String 전체를 char 하나씩 분리해내고자 할 때 사용한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Hello&quot; -&amp;gt; [&quot;H&quot;, &quot;e&quot;, &quot;l&quot;, &quot;l&quot;, &quot;o&quot;]&lt;/p&gt;</description>
      <category>#2/JAVA</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/218</guid>
      <comments>https://cuna.tistory.com/218#entry218comment</comments>
      <pubDate>Fri, 23 Dec 2022 11:08:33 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] Optional 이란? + Iterable</title>
      <link>https://cuna.tistory.com/217</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA에서 제공하는 클래스 중 하나인 Optional을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null 을 쉽게 처리하고자 도입이 되었다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NullPointerException을 방지할 수 있도록 도와주는 클래스로 null 이 올 수 이쓴 값을 감싸는 Wrapper 클래스라는데 무슨 얘긴지는 나중에 이해될 듯하다.&lt;/p&gt;
&lt;pre id=&quot;code_1667971962202&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Optoinal&amp;lt;String&amp;gt; optional = ... ;

optiona.isPresent(); //boolean

optional.ifPresent(this::somefunctino());
optional.ifPresent(string -&amp;gt; somefunction());

optiona.get(); //값에 접근하는 메서드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 메서드들을 사용할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 optiona.get() 을 하기 전에 optional 객체가 값이 확실하게 있는지 확인을 해야한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1667975854988&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Optional&amp;lt;Person&amp;gt; somePerson = findbyId(1);

Person person = somePerson.orElseThrow(CustomException::new);

String name = person.getName();

if(findbyId(1).isPresent()){
	//이는 좋은 예는 아니다.
}&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;ifPresent ~ get 방식보다 orElse, orElseGet, orElseThrow 등을 사용하는 편을 권장!&lt;/p&gt;
&lt;pre id=&quot;code_1667976059408&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;findById(1).orElseGet(()-&amp;gt; new Person(&quot;NOBODY&quot;));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;orElseGet 사용 예..&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;그리고 Spring Data JPA를 사용할 때 Repository에서 리턴 타입을 Optional로 바로 받을 수 있어서,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JPA를 사용할 때 이 점을 활용하면 좋다.&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; CrudRepository.class 에서 보면&lt;/p&gt;
&lt;pre id=&quot;code_1667976336474&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Optional&amp;lt;T&amp;gt; findById(ID id);&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;그리고 Iterable이 등장&lt;/p&gt;
&lt;pre id=&quot;code_1667976385204&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Iterable&amp;lt;T&amp;gt; findAll();&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;Iterable은 Collection의 상위 인터페이스라고 한다. Iterator와는 또 다르다고 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 Iterable에 대한 설명이 있고.. 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterable 인터페이스에 있는 메서드가 forEach(), iterator(), spliterator() 가 있어서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Iterator&amp;lt;T&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;Iterator는 Collection의 상위개념.. (An iterator over a collection)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고자료쓰&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jdm.kr/blog/234&quot;&gt;https://jdm.kr/blog/234&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@aidenshin/Optional-%EA%B4%80%EB%A0%A8..&quot;&gt;https://velog.io/@aidenshin/Optional-%EA%B4%80%EB%A0%A8..&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.latera.kr/blog/2019-07-02-effective-optional/&quot;&gt;https://www.latera.kr/blog/2019-07-02-effective-optional/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://daplus.net/java-optional-ifpresent-%EC%9D%98-%EC%A0%81%EC%A0%88%ED%95%9C-%EC%82%AC%EC%9A%A9/&quot;&gt;http://daplus.net/java-optional-ifpresent-%EC%9D%98-%EC%A0%81%EC%A0%88%ED%95%9C-%EC%82%AC%EC%9A%A9/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mangkyu.tistory.com/70&quot;&gt;https://mangkyu.tistory.com/70&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>#2/JAVA</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/217</guid>
      <comments>https://cuna.tistory.com/217#entry217comment</comments>
      <pubDate>Wed, 9 Nov 2022 16:18:50 +0900</pubDate>
    </item>
    <item>
      <title>[Java/Spring] static을 사용해보자.</title>
      <link>https://cuna.tistory.com/215</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에 저장한 사진이나 로그같은 파일에 접근할 때 계속 하드코딩을 써오다가&amp;hellip;(win에서 테스트할 때는 win경로, ubuntu에서 테스트할때는 ubuntu 경로로 바꿔줌..;;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS별로 그냥 구분해서 알려주면 얼마나 좋을까 싶어서 if로 구분해서 알려주는 방식을 써보기로 했다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;@Configuration
public class OsCheck {

    public String osCheck() {
        String os = System.getProperty(&quot;os.name&quot;).toLowerCase();
        String path = &quot;&quot;;
        if(os.contains(&quot;win&quot;)) {
             path = &quot;C:/Cuna/images/&quot;;
        }else {
            path = &quot;/home/cuna/&quot;;
        }
        return path;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;물론 OS를 이렇게만 구분하면 안된다..... 나는 어짜피 테스트할 목적이었기 때문에..&lt;/span&gt;&lt;/i&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;결국 path를 지정해줘야하긴하는데 그래도 얘를 여기저기 가져다 쓰면 win에서 테스트할때 ubuntu에서 테스트할 때 내가 일일이 바꿀 필요가 없다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 얘를 불러오는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기저기에 autowired 해서 가져오는 방법은 너무 비효율적이라고 생각이 되었다. 왜냐면 os는 프로젝트 시작하면 그때 딱 알 수 있거든 굳이굳이 불러낼때마다 확인할 필요가 없거든&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고 ProjectApplication.class에 넣자니 뭔가 무서웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 어떻게하면 프로젝트 안에서 변수를 공유할 수 있을 지 찾아보다가 알게된 것이 static. static은 &lt;code&gt;public static void main(String[] args)&lt;/code&gt; 할 때나 봤지 그게 뭔데 싶어서 찾아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/524&quot;&gt;[Java] 자바 static의 의미와 사용법&lt;/a&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Static 키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당됩니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;Static 영역에 할당된 메모리는 모든 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는&lt;/span&gt; 장점을 가지지만 Garbage Collector의 관리 영역 밖에 존재하기에 Static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨간 줄 부분만 읽고 이거다! 하고 바로 static 갈김&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;@Configuration
public class OsCheck {

    public static String os = System.getProperty(&quot;os.name&quot;).toLowerCase();

    public static String osCheck() {
        String path = &quot;&quot;;
        if (os.contains(&quot;win&quot;)) {
            path = &quot;C:/Cuna/images/&quot;;
        } else {
            path = &quot;/home/cuna/&quot;;
        }
        return path;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종적인 코드는 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 테스트를 해보면&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;log.info(&quot;path is {}&quot;, OsCheck.osCheck());

00:00 INFO .... -path is C:/Cuna/images/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘 적용됨을 알 수 있다^^!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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>#2/JAVA</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/215</guid>
      <comments>https://cuna.tistory.com/215#entry215comment</comments>
      <pubDate>Thu, 30 Jun 2022 11:10:11 +0900</pubDate>
    </item>
    <item>
      <title>[Spring boot] Spring boot admin 사용해보기</title>
      <link>https://cuna.tistory.com/214</link>
      <description>&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;figure id=&quot;og_1656037133714&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;Spring Boot Admin Reference Guide&quot; data-og-description=&quot;It is possible to monitor Spring Boot 1.5.x applications with Spring Boot Admin 2.x. The old Spring Boot Admin Client is able to register at a newer server. Since the API has slight changes, you need to set the following property on old clients: Reconfigur&quot; data-og-host=&quot;codecentric.github.io&quot; data-og-source-url=&quot;https://codecentric.github.io/spring-boot-admin/2.6.6/&quot; data-og-url=&quot;https://codecentric.github.io/spring-boot-admin/2.6.6/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyR3wR/hyORJBriWH/JRvIjnShMP4ekKU1zD44w0/img.png?width=640&amp;amp;height=439&amp;amp;face=0_0_640_439&quot;&gt;&lt;a href=&quot;https://codecentric.github.io/spring-boot-admin/2.6.6/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codecentric.github.io/spring-boot-admin/2.6.6/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyR3wR/hyORJBriWH/JRvIjnShMP4ekKU1zD44w0/img.png?width=640&amp;amp;height=439&amp;amp;face=0_0_640_439');&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;Spring Boot Admin Reference Guide&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;It is possible to monitor Spring Boot 1.5.x applications with Spring Boot Admin 2.x. The old Spring Boot Admin Client is able to register at a newer server. Since the API has slight changes, you need to set the following property on old clients: Reconfigur&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codecentric.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;codecentric의 SBA(Spring Boot Admin)은 스프링 부트 어플리케이션을 모니터링하고 관리하는 커뮤니티 프로젝트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP접속인 Spring Boot Admin Client 어플리케이션이나 Spring Cloud를 사용해서 뜨는 어플리케이션을 등록한다.&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;1. 관리하는 용도의 Admin Server 프로젝트를 만들어준다. 라이브러리는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1656037361111&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dependencies{
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'de.codecentric:spring-boot-admin-starter-server:2.6.6'
}&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;2. 실행 파일에 어노테이션을 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656037448485&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootApplication
@Configuration
@EnableScheduling
@EnableJpaRepositories	
public class SBAApplication {

	public static void main(String[] args) {
		SpringApplication.run(SBAApplication.class, args);
	}

}&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;3. 관리하려는 프로젝트에 라이브러리를 추가해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1656040747052&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	implementation 'de.codecentric:spring-boot-admin-starter-client:2.6.6'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;application.yaml에 설정해주고 각각 실행하면 끝&lt;/p&gt;
&lt;pre id=&quot;code_1656040810242&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; spring:
  boot:
    admin:
      client:
        url: http://localhost:8080 # admin 프로젝트 url
management:
  endpoints:
    web:
      exposure:
        include:
        - &quot;*&quot;
  info:
    env:
      enabled: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>#2/Spring boot</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/214</guid>
      <comments>https://cuna.tistory.com/214#entry214comment</comments>
      <pubDate>Fri, 24 Jun 2022 12:20:34 +0900</pubDate>
    </item>
    <item>
      <title>[Spring boot] UserDetailsService 커스텀하기</title>
      <link>https://cuna.tistory.com/195</link>
      <description>&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개인적인 공부용이니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;참고만 해주십시오....&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이해가 안될 수 있습니다....&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오늘은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스프링 시큐리티를 이용하여&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인증을 하고자할때 사용되는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;UserDetailsService를 커스텀하는 것에 대해 알아보려고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;책을 그냥 보기만 하면 이해가 안되서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;적어가면서 정리..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아무튼&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;무작정 만들기 전에 이걸 왜 하는지 정도는 알자..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(뚝딱뚝딱)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;UserDetailsService를 왜 커스텀하나요?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;A: 인증 매니저를 커스텀하고 싶기 때문입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커스텀을 하는 이유가 뭔가요?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;A: 원하는 방식으로 스프링 시큐리티를 이용하고자하기 때문입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인증 매니저가 뭔데요?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;A: 인증에 대한 실제적인 처리를 담당하는 인터페이스입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;UserDetailsService와 인증매니저(Authentication Manager)와의 관계는??&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;A: 이건....&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인증 매니저는 인증 처리를 한 다음 결과를 UserDetails 타입으로 반환하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 때 UserDetailsService를 써서 정보를 &lt;u&gt;어떻게 처리할지&lt;/u&gt;(인증되는방식) 판단한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;InMemoryUserDetailsManager, JdbcUserDetailsManager도 UserDetailsService를 구현한 것&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;결론. 내가 원하는 대로 인증 처리하기 위해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;UserDetailsService를 커스텀한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;=&amp;gt; DB를 사용해서 인증 처리 하고자 할 때 사용하게 되는것 같음..!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&quot;개발자가 인증 매니저를 커스텀하려면 UserDetailsService 인터페이스를 구현하고,&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;이를 HttpSecurity 객체가 사용할 수 있도록 지정해야한다&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어떻게 하냐면,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;UserDetailsService를 구현하는 클래스를 하나 만든다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653957986866&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public  class CustomUsersService implements UserDetailsService{

	@Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
    	return ..;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;loadByUserByUsername 메서드가 오버라이드 되는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 메서드가 뭐냐면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 계정 정보(아이디)를 이용해 UserDetails 인터페이스를 구현하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 객체를 반환하는 메서드&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(나중에 자세한 설명..)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;암튼 구현한 클래스를 http 객체가 사용할 수 있도록 주입하고 지정하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내가 참고하는 책에서는 SecurityConfig 설정의 configure 메서드의 파라미터 http에게 넘겼다...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;http.userDetailsService(zecorkUsersService);&lt;/p&gt;
&lt;pre id=&quot;code_1653959367372&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{

	@Override
    protected void configure(HttpSecurity http) throws Exception{
    	http.userDetailsService(CustomUsersService);
        ...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;loadByUserByUsername에서 UserDetails 타입 객체(User 클래스)를 반환할 수 있도록 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(User클래스: UserDetails를 구현해 둔 클래스)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런 다음 내가 하던 프로젝트의 데이터들과 연결해야한다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;MemberRepository와 연동한다.&lt;/p&gt;
&lt;pre id=&quot;code_1653959517332&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Autowired
MemberRepository memberRepo;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
	return memberRepo.findById(username)
    		.filter(member -&amp;gt; member != null)
            .map(member -&amp;gt; new CustomSecurityUser(member))
            .get();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지만 씁니다...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나중에는 지금보다 더 잘 이해되겠지&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;참고한 자료 | 스타트스프링부트&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>#2/Spring boot</category>
      <author>_쿠나</author>
      <guid isPermaLink="true">https://cuna.tistory.com/195</guid>
      <comments>https://cuna.tistory.com/195#entry195comment</comments>
      <pubDate>Tue, 31 May 2022 10:12:24 +0900</pubDate>
    </item>
  </channel>
</rss>