<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Manners maketh man</title>
    <link>https://maketh.tistory.com/</link>
    <description>맛집, 프로그래밍 등 정보공유 및 기록블로그</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 01:55:16 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>임프로</managingEditor>
    <image>
      <title>Manners maketh man</title>
      <url>https://tistory1.daumcdn.net/tistory/2033641/attach/e9d9da5c424c4c81a9246ca0ca103c6a</url>
      <link>https://maketh.tistory.com</link>
    </image>
    <item>
      <title>아는 것으로부터의 자유</title>
      <link>https://maketh.tistory.com/465</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;5월 가정의 달을 맞이하여&lt;br&gt;용산 어린이정원에 다녀왔어요&lt;br&gt;&lt;br&gt;여기저기 만들기체험, 공연 등을 즐기다가&lt;br&gt;여기저기 방문하고 스탬프를 찍어오면 룰렛을 돌려 선물을 주는 프로그램이 있었어요&lt;br&gt;방문자가 너무 많아 선물을 받으려는 대기줄도 엄청낰ㅅ어요&lt;br&gt;솔직히 부모입장에서 그 선물들은 정말 별거 아닐 수 있았어요 그래서 뙤약볕에 100m, 200m 줄서느니 그냥 안받고 말지 라는 생각을 했었는데 아이들은 절대 아니었어요&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/dj2fWy/dJMcah5oIky/QrSODp1ham2XA0zh9EIyD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj2fWy/dJMcah5oIky/QrSODp1ham2XA0zh9EIyD1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj2fWy/dJMcah5oIky/QrSODp1ham2XA0zh9EIyD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj2fWy%2FdJMcah5oIky%2FQrSODp1ham2XA0zh9EIyD1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;선물이 뻔히 뭔지 알아도..&lt;br&gt;나는 다 겪어보고 경험해봤어도..&lt;br&gt;그 경험을 아이들에게 그대로 설명하고, 이거 별거 아니니까 그 줄설바에는 딴거하자 라는 말이 통하지 않아요&lt;br&gt;&lt;br&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/bviHAD/dJMcah5oIkw/2RwTecq00bM4P76ODn257k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bviHAD/dJMcah5oIkw/2RwTecq00bM4P76ODn257k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bviHAD/dJMcah5oIkw/2RwTecq00bM4P76ODn257k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbviHAD%2FdJMcah5oIkw%2F2RwTecq00bM4P76ODn257k%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;우리도 그러지 않을까요?&lt;br&gt;의무교육 등을 다 합쳐 태어나서 지금까지 얼마나 많은 교육을 받고 스스로 공부도 하였는데,&lt;br&gt;그것들은 다 어디갔는가..&lt;br&gt;&lt;br&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/Bh25R/dJMcah5oIkz/bikgUU7gKQIMirg5IMq3nK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bh25R/dJMcah5oIkz/bikgUU7gKQIMirg5IMq3nK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bh25R/dJMcah5oIkz/bikgUU7gKQIMirg5IMq3nK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBh25R%2FdJMcah5oIkz%2FbikgUU7gKQIMirg5IMq3nK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;진정한 자유는 무엇일까요?&lt;br&gt;요즘 사람의 지식보다 AI가 빅데이터, 딥러닝으로 습득한 지식이 더 많고 모르는게 없다는데&lt;br&gt;과연 사람이 AI처럼 모든것을 다 알면&lt;br&gt;자유로울까요?&lt;br&gt;&lt;br&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/bQVAbQ/dJMcaiwqqtU/QxynkYHC5ZpSBD6etteWWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQVAbQ/dJMcaiwqqtU/QxynkYHC5ZpSBD6etteWWK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQVAbQ/dJMcaiwqqtU/QxynkYHC5ZpSBD6etteWWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQVAbQ%2FdJMcaiwqqtU%2FQxynkYHC5ZpSBD6etteWWK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;조는 쾌락을 좋아합니다&lt;br&gt;그러니 아직도 성인이 못되고 이모양이겠죠&lt;br&gt;하지만 성인은 과연 자유로운가..&lt;br&gt;무엇으로부터..?&lt;br&gt;&lt;br&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/bNGhxV/dJMcah5oIkx/tZyk14oRw0TFybLKHhNzH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNGhxV/dJMcah5oIkx/tZyk14oRw0TFybLKHhNzH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNGhxV/dJMcah5oIkx/tZyk14oRw0TFybLKHhNzH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNGhxV%2FdJMcah5oIkx%2FtZyk14oRw0TFybLKHhNzH1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;자유가 무엇인지..&lt;br&gt;8세 아이에게 물어봅니다&lt;br&gt;&lt;br&gt;돌아오는 답은..&lt;br&gt;숙제안하고 노는거!&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <category>스노우폭스북스</category>
      <category>아는것으로부터의 자유</category>
      <category>육아</category>
      <category>자유</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/465</guid>
      <comments>https://maketh.tistory.com/465#entry465comment</comments>
      <pubDate>Wed, 6 May 2026 11:39:27 +0900</pubDate>
    </item>
    <item>
      <title>감정이 알려주는 것들</title>
      <link>https://maketh.tistory.com/464</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;봄이 온줄 알았는데 아침저녁으로 아직도 많이 쌀쌀합니다.&lt;br&gt;자녀 입학식을 갔더니&lt;br&gt;따뜻해서 봄이 온줄 알았는데 노가 온 거였구나 라는 멋진 문구가 맞이하네요.&lt;br&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;3523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eb6Mvl/dJMcaaR8oN1/4UeBwOP1j9Z8JJs5FiDoE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eb6Mvl/dJMcaaR8oN1/4UeBwOP1j9Z8JJs5FiDoE0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eb6Mvl/dJMcaaR8oN1/4UeBwOP1j9Z8JJs5FiDoE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feb6Mvl%2FdJMcaaR8oN1%2F4UeBwOP1j9Z8JJs5FiDoE0%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;3024&quot; height=&quot;3523&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;3523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;감정이 알려주는 것들&lt;br&gt;&lt;br&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/PNQXN/dJMcagY40sF/5EACQXdl309JMXnzzVERk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PNQXN/dJMcagY40sF/5EACQXdl309JMXnzzVERk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PNQXN/dJMcagY40sF/5EACQXdl309JMXnzzVERk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPNQXN%2FdJMcagY40sF%2F5EACQXdl309JMXnzzVERk0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;스노우폭스북스에서 추진하고 있는&lt;br&gt;재엮어서 재출간하는 책들입니다&lt;br&gt;아주 좋은 프로젝트라고 생각해요&lt;br&gt;&lt;br&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/yiM7I/dJMcagY40sG/akLW9QoR7ZaUHBvVZwp5LK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiM7I/dJMcagY40sG/akLW9QoR7ZaUHBvVZwp5LK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiM7I/dJMcagY40sG/akLW9QoR7ZaUHBvVZwp5LK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiM7I%2FdJMcagY40sG%2FakLW9QoR7ZaUHBvVZwp5LK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;열림히 앞을 향해 노만 저어라고 요구하는 사회&lt;br&gt;그 안에서 살아남으려면…&lt;br&gt;&lt;br&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/bbU20m/dJMb99ZZV2I/CuGId5eGdd6xmIZJKU3We1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbU20m/dJMb99ZZV2I/CuGId5eGdd6xmIZJKU3We1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbU20m/dJMb99ZZV2I/CuGId5eGdd6xmIZJKU3We1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbU20m%2FdJMb99ZZV2I%2FCuGId5eGdd6xmIZJKU3We1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;살아남기 보다&lt;br&gt;잘 살아가는 것을 공부해야 할 때입니다&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/464</guid>
      <comments>https://maketh.tistory.com/464#entry464comment</comments>
      <pubDate>Wed, 18 Mar 2026 06:44:22 +0900</pubDate>
    </item>
    <item>
      <title>이토록 사적인 경제학 - 최재용</title>
      <link>https://maketh.tistory.com/463</link>
      <description>&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/cCH8N5/dJMcagq1CAl/ADVwebLQij0Vh5ukhtdSyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCH8N5/dJMcagq1CAl/ADVwebLQij0Vh5ukhtdSyk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCH8N5/dJMcagq1CAl/ADVwebLQij0Vh5ukhtdSyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCH8N5%2FdJMcagq1CAl%2FADVwebLQij0Vh5ukhtdSyk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;오늘의 책은&lt;br&gt;최재용님이 쓰신&lt;br&gt;이토록 사적인 경제학입니다&lt;br&gt;솔직히 책 뒷표지의&lt;br&gt;주식잔고는 날마다 확인라면서&lt;br&gt;왜 당신이라는 자산은 방치하는가 라는 문구가 끌렸다&lt;br&gt;&lt;br&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/czK2Ot/dJMcadnvakX/FZnNk1MLiCCq73AAYeZKC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czK2Ot/dJMcadnvakX/FZnNk1MLiCCq73AAYeZKC0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czK2Ot/dJMcadnvakX/FZnNk1MLiCCq73AAYeZKC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczK2Ot%2FdJMcadnvakX%2FFZnNk1MLiCCq73AAYeZKC0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9yjR/dJMcadnvak1/KPJNUd0QLAFVkZKBPvkn11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9yjR/dJMcadnvak1/KPJNUd0QLAFVkZKBPvkn11/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9yjR/dJMcadnvak1/KPJNUd0QLAFVkZKBPvkn11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9yjR%2FdJMcadnvak1%2FKPJNUd0QLAFVkZKBPvkn11%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;요즘은 나를 표현하는&lt;br&gt;대부분의 문구가&lt;br&gt;나 라는 브랜드 로 모인다&lt;br&gt;&lt;br&gt;엊그제 자산을 정리하면서 기회비용에 대해 심각하게 고민하던 기회가 있었는데&lt;br&gt;기회비용이 첫 주제..&lt;br&gt;&lt;br&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/IbOTr/dJMcadnvakZ/9sjqeHtbog1omMaKNxcojK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IbOTr/dJMcadnvakZ/9sjqeHtbog1omMaKNxcojK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IbOTr/dJMcadnvakZ/9sjqeHtbog1omMaKNxcojK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIbOTr%2FdJMcadnvakZ%2F9sjqeHtbog1omMaKNxcojK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;빈부격차가 점점 거친다&lt;br&gt;가만있는 나는 거지가 되어가고..&lt;br&gt;있는 자는 더욱 부자가 되어 간다&lt;br&gt;&lt;br&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/cjnPPs/dJMcaaqO3fG/KjW746Mk7FUqgn8UYS1YTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjnPPs/dJMcaaqO3fG/KjW746Mk7FUqgn8UYS1YTK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjnPPs/dJMcaaqO3fG/KjW746Mk7FUqgn8UYS1YTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjnPPs%2FdJMcaaqO3fG%2FKjW746Mk7FUqgn8UYS1YTK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKGdTm/dJMcai3oxBm/TD3O652hV8fWVbS7fjGkq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKGdTm/dJMcai3oxBm/TD3O652hV8fWVbS7fjGkq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKGdTm/dJMcai3oxBm/TD3O652hV8fWVbS7fjGkq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKGdTm%2FdJMcai3oxBm%2FTD3O652hV8fWVbS7fjGkq1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;오늘도 책한그릇 어떠신가요?&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/463</guid>
      <comments>https://maketh.tistory.com/463#entry463comment</comments>
      <pubDate>Tue, 24 Feb 2026 17:36:50 +0900</pubDate>
    </item>
    <item>
      <title>코칭 플래너</title>
      <link>https://maketh.tistory.com/462</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2025년의 마지막날&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;코칭 플래너를 구입하게 됐어요&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251230_152552188.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VmvBg/dJMcag5emIh/dTkcUXkK8LtvfClcBJcRiK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VmvBg/dJMcag5emIh/dTkcUXkK8LtvfClcBJcRiK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VmvBg/dJMcag5emIh/dTkcUXkK8LtvfClcBJcRiK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVmvBg%2FdJMcag5emIh%2FdTkcUXkK8LtvfClcBJcRiK%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;427&quot; height=&quot;569&quot; data-filename=&quot;KakaoTalk_20251230_152552188.jpg&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251230_152552188_01.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zkKFc/dJMcaiu9xKU/YdJ57gA7R1nqw9Rq2VyECK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zkKFc/dJMcaiu9xKU/YdJ57gA7R1nqw9Rq2VyECK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zkKFc/dJMcaiu9xKU/YdJ57gA7R1nqw9Rq2VyECK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzkKFc%2FdJMcaiu9xKU%2FYdJ57gA7R1nqw9Rq2VyECK%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;508&quot; height=&quot;677&quot; data-filename=&quot;KakaoTalk_20251230_152552188_01.jpg&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20251230_152552188_02.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yL2zP/dJMcaiu9xKT/1vY9DeVnkS4nejhRkX9EP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yL2zP/dJMcaiu9xKT/1vY9DeVnkS4nejhRkX9EP1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yL2zP/dJMcaiu9xKT/1vY9DeVnkS4nejhRkX9EP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyL2zP%2FdJMcaiu9xKT%2F1vY9DeVnkS4nejhRkX9EP1%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;469&quot; height=&quot;625&quot; data-filename=&quot;KakaoTalk_20251230_152552188_02.jpg&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;다시 한번 도약하는 2026년이 되길!&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <category>다이어리</category>
      <category>코칭</category>
      <category>코칭플래너</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/462</guid>
      <comments>https://maketh.tistory.com/462#entry462comment</comments>
      <pubDate>Tue, 30 Dec 2025 15:53:19 +0900</pubDate>
    </item>
    <item>
      <title>결국, 시스템이다</title>
      <link>https://maketh.tistory.com/461</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이제 곧, 뜬금없이 육아휴직을 시작할 예정이다.&lt;br&gt;과연 복직할 수 있을까.&lt;br&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/cuzhnj/dJMcac9kzA3/kIZEyxePtnFZ7h9PSbZji1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuzhnj/dJMcac9kzA3/kIZEyxePtnFZ7h9PSbZji1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuzhnj/dJMcac9kzA3/kIZEyxePtnFZ7h9PSbZji1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuzhnj%2FdJMcac9kzA3%2FkIZEyxePtnFZ7h9PSbZji1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;복직, 개인사업을 고려해봐야 할 때,&lt;br&gt;창업도 결국 시스템은것을 알아야 한다.&lt;br&gt;&lt;br&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/d640Um/dJMcajgjcBS/ymHj9SG6FoMu1abFluRK6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d640Um/dJMcajgjcBS/ymHj9SG6FoMu1abFluRK6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d640Um/dJMcajgjcBS/ymHj9SG6FoMu1abFluRK6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd640Um%2FdJMcajgjcBS%2FymHj9SG6FoMu1abFluRK6k%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;8명으로 시작해 거대조직으로 키워낸 대단하신 분이다.&lt;br&gt;시스템을 아떻게 구축했을 까.&lt;br&gt;읽다보면 어느정도 답이 구해질까.&lt;br&gt;&lt;br&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/ZFjvi/dJMcac9kzA4/fM10ZXadCNeUp0utbmYV20/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZFjvi/dJMcac9kzA4/fM10ZXadCNeUp0utbmYV20/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZFjvi/dJMcac9kzA4/fM10ZXadCNeUp0utbmYV20/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZFjvi%2FdJMcac9kzA4%2FfM10ZXadCNeUp0utbmYV20%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t3BvF/dJMcajgjcBT/fqH42g5s9KQhcWDy56agi0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t3BvF/dJMcajgjcBT/fqH42g5s9KQhcWDy56agi0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t3BvF/dJMcajgjcBT/fqH42g5s9KQhcWDy56agi0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft3BvF%2FdJMcajgjcBT%2FfqH42g5s9KQhcWDy56agi0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;무엇보다, 사명이라는 단어에서&lt;br&gt;많이&lt;br&gt;느낀다&lt;br&gt;나의 사명은?&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <category>결국세스템이다</category>
      <category>스노우폭스북스</category>
      <category>시스템</category>
      <category>신경열</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/461</guid>
      <comments>https://maketh.tistory.com/461#entry461comment</comments>
      <pubDate>Tue, 25 Nov 2025 12:38:13 +0900</pubDate>
    </item>
    <item>
      <title>사랑하라, 나를 잃지 않도록</title>
      <link>https://maketh.tistory.com/460</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;오늘의 책은, 스노우폭스북스에서 출판한&lt;br&gt;사랑하라, 그리고 나를 잃지 않도록 이라는 책입니다&lt;br&gt;&lt;br&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/l8dDS/btsQnUisyHO/evjKWMZvBTXcsIg8fJQ0dK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l8dDS/btsQnUisyHO/evjKWMZvBTXcsIg8fJQ0dK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l8dDS/btsQnUisyHO/evjKWMZvBTXcsIg8fJQ0dK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl8dDS%2FbtsQnUisyHO%2FevjKWMZvBTXcsIg8fJQ0dK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTM1rh/btsQpa5P6i5/TnK7CqnG90AXjWxU9NjUmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTM1rh/btsQpa5P6i5/TnK7CqnG90AXjWxU9NjUmK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTM1rh/btsQpa5P6i5/TnK7CqnG90AXjWxU9NjUmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTM1rh%2FbtsQpa5P6i5%2FTnK7CqnG90AXjWxU9NjUmK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;관계 속에서 어려움을 느낄때 많은 도움이 되리라 생각됩니다&lt;br&gt;무엇보다 나를 사링하는것과 있는 그대로 받아들이는 것이 중요하겠죠&lt;br&gt;&lt;br&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/cQ0h3L/btsQogrXgaK/Hk6sfFAGyZqHBaVC7ZlwYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ0h3L/btsQogrXgaK/Hk6sfFAGyZqHBaVC7ZlwYK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ0h3L/btsQogrXgaK/Hk6sfFAGyZqHBaVC7ZlwYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ0h3L%2FbtsQogrXgaK%2FHk6sfFAGyZqHBaVC7ZlwYK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sU7iC/btsQoBWThk2/rsE0g3TdGH1m9cKmvjNoEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sU7iC/btsQoBWThk2/rsE0g3TdGH1m9cKmvjNoEk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sU7iC/btsQoBWThk2/rsE0g3TdGH1m9cKmvjNoEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsU7iC%2FbtsQoBWThk2%2FrsE0g3TdGH1m9cKmvjNoEk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;감정을 느끼는 것도 뱔반 다르지 않습니다. 관계속에서 언제나 상처받을 수 있는게 감정이죠.&lt;br&gt;&lt;br&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/A8OIS/btsQoFrrxp2/vSOTQQCJtd4cuz8VggehBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8OIS/btsQoFrrxp2/vSOTQQCJtd4cuz8VggehBk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8OIS/btsQoFrrxp2/vSOTQQCJtd4cuz8VggehBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8OIS%2FbtsQoFrrxp2%2FvSOTQQCJtd4cuz8VggehBk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이 책으로 충만한 하루 되시길 바랍니다&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/460</guid>
      <comments>https://maketh.tistory.com/460#entry460comment</comments>
      <pubDate>Mon, 8 Sep 2025 16:05:46 +0900</pubDate>
    </item>
    <item>
      <title>조종당하는 인간</title>
      <link>https://maketh.tistory.com/459</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;삶을 무너뜨리는 반복에는 이유가 있다.&lt;br&gt;선택과 후회에 대한 이유&lt;br&gt;자신을 다루는 방법에 대한 성찰&lt;br&gt;&lt;br&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/mfgJj/btsPB81WF7f/iisQsUxJiLmQ749fqvXwN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mfgJj/btsPB81WF7f/iisQsUxJiLmQ749fqvXwN1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mfgJj/btsPB81WF7f/iisQsUxJiLmQ749fqvXwN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmfgJj%2FbtsPB81WF7f%2FiisQsUxJiLmQ749fqvXwN1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;열심히 사는것 같은데 현실은 왜 이럴까?&lt;br&gt;습관을 바꾸고 싶은데 왜 안될까?&lt;br&gt;&lt;br&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/B9QMz/btsPCI2QlUz/uaXBtyF05cUk1gAtqVZsV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B9QMz/btsPCI2QlUz/uaXBtyF05cUk1gAtqVZsV1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B9QMz/btsPCI2QlUz/uaXBtyF05cUk1gAtqVZsV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB9QMz%2FbtsPCI2QlUz%2FuaXBtyF05cUk1gAtqVZsV1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;뭐가 문제인지 알겠어&lt;br&gt;그런데 왜 나는 계속 똑같은 후회만 하고 있지?&lt;br&gt;사고나서 후회하는데 왜 나는 또 같은걸 사려고 집어들었디?&lt;br&gt;&lt;br&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/crOqWE/btsPCRZJZm9/gxfop1wfv1SdqOv5N8DmN0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crOqWE/btsPCRZJZm9/gxfop1wfv1SdqOv5N8DmN0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crOqWE/btsPCRZJZm9/gxfop1wfv1SdqOv5N8DmN0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrOqWE%2FbtsPCRZJZm9%2Fgxfop1wfv1SdqOv5N8DmN0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BCaEz/btsPDmSyfd1/HWzSUDBrOkDEuWkUTJIZt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BCaEz/btsPDmSyfd1/HWzSUDBrOkDEuWkUTJIZt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BCaEz/btsPDmSyfd1/HWzSUDBrOkDEuWkUTJIZt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBCaEz%2FbtsPDmSyfd1%2FHWzSUDBrOkDEuWkUTJIZt0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;신경과 전문의에게 듣는 정답이 여기 들어있다&lt;br&gt;&lt;br&gt;본 독서인증은 스노우폭스북스의 지원을 받아 작성되었습니다.&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <category>뇌</category>
      <category>신경과</category>
      <category>충동</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/459</guid>
      <comments>https://maketh.tistory.com/459#entry459comment</comments>
      <pubDate>Tue, 29 Jul 2025 10:42:56 +0900</pubDate>
    </item>
    <item>
      <title>붙잡지 않는 삶 - 생각과 감정 너머 존재에 닿는 안내서</title>
      <link>https://maketh.tistory.com/458</link>
      <description>&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/dna/6oNT4/btsOA04W300/AAAAAAAAAAAAAAAAAAAAAIyO5JvR2a4pBDRc6-O7M-VXXscB9PvloYHEknq775ep/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=cPHFcI%2BWhY71mBZ7CtG%2Fh66ISes%3D&quot; data-phocus=&quot;https://blog.kakaocdn.net/dna/6oNT4/btsOA04W300/AAAAAAAAAAAAAAAAAAAAAIyO5JvR2a4pBDRc6-O7M-VXXscB9PvloYHEknq775ep/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=cPHFcI%2BWhY71mBZ7CtG%2Fh66ISes%3D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/6oNT4/btsOA04W300/AAAAAAAAAAAAAAAAAAAAAIyO5JvR2a4pBDRc6-O7M-VXXscB9PvloYHEknq775ep/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1749805199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=cPHFcI%2BWhY71mBZ7CtG%2Fh66ISes%3D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2F6oNT4%2FbtsOA04W300%2FAAAAAAAAAAAAAAAAAAAAAIyO5JvR2a4pBDRc6-O7M-VXXscB9PvloYHEknq775ep%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1749805199%26allow_ip%3D%26allow_referer%3D%26signature%3DcPHFcI%252BWhY71mBZ7CtG%252Fh66ISes%253D&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;깨어 있는 의식을 볼 수 있는 책&lt;br&gt;깨어남을 이해할 수 있게 되는 글들&lt;br&gt;&lt;br&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/dna/bboC48/btsOArotCd8/AAAAAAAAAAAAAAAAAAAAADQunrTl9bZk0R-LZgmUaH9BsEHSKofSolbMSz0kv0nK/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=dhSeiB9h%2F5mv2oFH0BkaYSF5Giw%3D&quot; data-phocus=&quot;https://blog.kakaocdn.net/dna/bboC48/btsOArotCd8/AAAAAAAAAAAAAAAAAAAAADQunrTl9bZk0R-LZgmUaH9BsEHSKofSolbMSz0kv0nK/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=dhSeiB9h%2F5mv2oFH0BkaYSF5Giw%3D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/bboC48/btsOArotCd8/AAAAAAAAAAAAAAAAAAAAADQunrTl9bZk0R-LZgmUaH9BsEHSKofSolbMSz0kv0nK/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1749805199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=dhSeiB9h%2F5mv2oFH0BkaYSF5Giw%3D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbboC48%2FbtsOArotCd8%2FAAAAAAAAAAAAAAAAAAAAADQunrTl9bZk0R-LZgmUaH9BsEHSKofSolbMSz0kv0nK%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1749805199%26allow_ip%3D%26allow_referer%3D%26signature%3DdhSeiB9h%252F5mv2oFH0BkaYSF5Giw%253D&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;진짜 나는 누구일까?&lt;br&gt;진짜 나는 무엇일까?&lt;br&gt;&lt;br&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/dna/c8SGRm/btsOz1KBovm/AAAAAAAAAAAAAAAAAAAAAE0eFsMiNi3kq5Gzl8oO-0OK9P7xB6zNG5MyWwz__UQq/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=qXhew8eN0kSKy6w9Rx%2BcdeDgah8%3D&quot; data-phocus=&quot;https://blog.kakaocdn.net/dna/c8SGRm/btsOz1KBovm/AAAAAAAAAAAAAAAAAAAAAE0eFsMiNi3kq5Gzl8oO-0OK9P7xB6zNG5MyWwz__UQq/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=qXhew8eN0kSKy6w9Rx%2BcdeDgah8%3D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/c8SGRm/btsOz1KBovm/AAAAAAAAAAAAAAAAAAAAAE0eFsMiNi3kq5Gzl8oO-0OK9P7xB6zNG5MyWwz__UQq/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1749805199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=qXhew8eN0kSKy6w9Rx%2BcdeDgah8%3D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2Fc8SGRm%2FbtsOz1KBovm%2FAAAAAAAAAAAAAAAAAAAAAE0eFsMiNi3kq5Gzl8oO-0OK9P7xB6zNG5MyWwz__UQq%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1749805199%26allow_ip%3D%26allow_referer%3D%26signature%3DqXhew8eN0kSKy6w9Rx%252BcdeDgah8%253D&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;그동안 사랑을 감정이라고만 생각했는데&lt;br&gt;사랑은 존재의 ‘상태’라고 한다&lt;br&gt;&lt;br&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/dna/NUH4L/btsOAZEYbdr/AAAAAAAAAAAAAAAAAAAAAN2yvBFnT9E5hZaTVpl4WrBRsWt_YjrXWpK_VOsEFIt8/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=ICcKngWQN%2FspKnMUf0yxlpxT7%2Bc%3D&quot; data-phocus=&quot;https://blog.kakaocdn.net/dna/NUH4L/btsOAZEYbdr/AAAAAAAAAAAAAAAAAAAAAN2yvBFnT9E5hZaTVpl4WrBRsWt_YjrXWpK_VOsEFIt8/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;amp;expires=1749805199&amp;amp;amp;allow_ip=&amp;amp;amp;allow_referer=&amp;amp;amp;signature=ICcKngWQN%2FspKnMUf0yxlpxT7%2Bc%3D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dna/NUH4L/btsOAZEYbdr/AAAAAAAAAAAAAAAAAAAAAN2yvBFnT9E5hZaTVpl4WrBRsWt_YjrXWpK_VOsEFIt8/img.jpg?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1749805199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=ICcKngWQN%2FspKnMUf0yxlpxT7%2Bc%3D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FNUH4L%2FbtsOAZEYbdr%2FAAAAAAAAAAAAAAAAAAAAAN2yvBFnT9E5hZaTVpl4WrBRsWt_YjrXWpK_VOsEFIt8%2Fimg.jpg%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1749805199%26allow_ip%3D%26allow_referer%3D%26signature%3DICcKngWQN%252FspKnMUf0yxlpxT7%252Bc%253D&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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;여러모로 진짜 삶에 대해 느끼는 시간&lt;/p&gt;</description>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/458</guid>
      <comments>https://maketh.tistory.com/458#entry458comment</comments>
      <pubDate>Fri, 13 Jun 2025 17:28:14 +0900</pubDate>
    </item>
    <item>
      <title>일본어 히라가나/가타카나 따라쓰기 엑셀 공유!</title>
      <link>https://maketh.tistory.com/457</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 맡은 업무가 일본쪽 관련업무이다 보니 일본어를 배우면 그래도 일본을 조금이나마 이해할 수 있지 않을까, 일본 여행에 가면 인사라도 나눌 수 있지 않을까 싶어 배워보려고 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;145&quot; data-start=&quot;120&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;훈민정음처럼, 일본어에도 문자가 있어요&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;282&quot; data-start=&quot;147&quot; data-ke-size=&quot;size16&quot;&gt;우리에게는 자랑스러운 &lt;b&gt;훈민정음&lt;/b&gt;, 한글이 있죠. 한국어의 소리를 문자로 정확하게 표현하기 위해 세종대왕께서 창제하신 한글처럼, 일본어에도 고유의 문자 체계가 존재합니다. 바로 **히라가나(ひらがな)**와 **가타카나(カタカナ)**입니다.&lt;/p&gt;
&lt;h2 data-end=&quot;306&quot; data-start=&quot;284&quot; data-ke-size=&quot;size26&quot;&gt;일본어에는 왜 문자가 두 종류일까?&lt;/h2&gt;
&lt;p data-end=&quot;415&quot; data-start=&quot;308&quot; data-ke-size=&quot;size16&quot;&gt;히라가나와 가타카나는 같은 발음을 나타내는 &lt;b&gt;두 개의 문자 체계&lt;/b&gt;입니다. 예를 들어, &quot;아&quot;는 히라가나로 &lt;b&gt;あ&lt;/b&gt;, 가타카나로 &lt;b&gt;ア&lt;/b&gt;로 씁니다. 같은 소리지만 생김새가 전혀 다르죠?&lt;/p&gt;
&lt;p data-end=&quot;447&quot; data-start=&quot;417&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 된 데에는 간단한 &lt;b&gt;역사적 배경&lt;/b&gt;이 있어요.&lt;/p&gt;
&lt;h3 data-end=&quot;462&quot; data-start=&quot;449&quot; data-ke-size=&quot;size23&quot;&gt;일본 문자의 기원&lt;/h3&gt;
&lt;p data-end=&quot;566&quot; data-start=&quot;464&quot; data-ke-size=&quot;size16&quot;&gt;일본은 고대부터 한자를 사용해왔습니다. 하지만 한자는 일본어의 말소리와 완전히 맞지 않았기 때문에, &lt;b&gt;한자의 일부를 단순화하거나 소리만 따서 만든 것이 히라가나와 가타카나&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;671&quot; data-start=&quot;568&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;568&quot;&gt;&lt;b&gt;히라가나&lt;/b&gt;는 주로 &lt;b&gt;여성이나 일반 대중&lt;/b&gt;이 일상에서 사용하기 쉬우라고 만들어졌고,&lt;/li&gt;
&lt;li data-end=&quot;671&quot; data-start=&quot;623&quot;&gt;&lt;b&gt;가타카나&lt;/b&gt;는 &lt;b&gt;승려나 학자들&lt;/b&gt;이 한자 발음을 표기하기 위해 만들어졌습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;724&quot; data-start=&quot;673&quot; data-ke-size=&quot;size16&quot;&gt;그래서 지금까지도 히라가나는 부드럽고 곡선이 많고, 가타카나는 각지고 간결한 느낌이 있어요.&lt;/p&gt;
&lt;h2 data-end=&quot;750&quot; data-start=&quot;726&quot; data-ke-size=&quot;size26&quot;&gt;언제 히라가나, 언제 가타카나를 쓸까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;834&quot; data-start=&quot;752&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;794&quot; data-start=&quot;752&quot;&gt;&lt;b&gt;히라가나&lt;/b&gt;: 문장에 자주 쓰이는 조사, 동사 어미, 일본 고유어 등&lt;/li&gt;
&lt;li data-end=&quot;834&quot; data-start=&quot;795&quot;&gt;&lt;b&gt;가타카나&lt;/b&gt;: 외래어, 의성어, 의태어, 강조하고 싶은 단어 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;842&quot; data-start=&quot;836&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;922&quot; data-start=&quot;843&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;885&quot; data-start=&quot;843&quot;&gt;&amp;ldquo;커피&amp;rdquo;는 일본어로 koohii &amp;rarr; &lt;b&gt;コーヒー&lt;/b&gt; (가타카나 사용)&lt;/li&gt;
&lt;li data-end=&quot;922&quot; data-start=&quot;886&quot;&gt;&amp;ldquo;먹다&amp;rdquo;는 taberu &amp;rarr; &lt;b&gt;たべる&lt;/b&gt; (히라가나 사용)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;939&quot; data-start=&quot;924&quot; data-ke-size=&quot;size26&quot;&gt;어떻게 외우면 좋을까?&lt;/h2&gt;
&lt;p data-end=&quot;1030&quot; data-start=&quot;941&quot; data-ke-size=&quot;size16&quot;&gt;히라가나와 가타카나는 각각 &lt;b&gt;46자씩&lt;/b&gt;, 외우기에 부담이 되는 양은 아닙니다. 하지만 익숙해지려면 &lt;b&gt;반복적인 따라쓰기&lt;/b&gt;와 &lt;b&gt;시각적 연상&lt;/b&gt;이 중요해요.&lt;/p&gt;
&lt;p data-end=&quot;1066&quot; data-start=&quot;1032&quot; data-ke-size=&quot;size16&quot;&gt;그래서 제가 만든 따라쓰기용 &lt;b&gt;엑셀 파일&lt;/b&gt;을 공유드립니다!&lt;/p&gt;
&lt;p data-end=&quot;1066&quot; data-start=&quot;1032&quot; data-ke-size=&quot;size16&quot;&gt;일단 따라쓰기 하시고, 그 이후 단어도 찾아서 따라써보시는것도 중요해요&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1158&quot; data-start=&quot;1068&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1095&quot; data-start=&quot;1068&quot;&gt;히라가나/가타카나를 &lt;b&gt;하루 몇 자씩 연습&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1125&quot; data-start=&quot;1096&quot;&gt;옆에 &lt;b&gt;발음&lt;/b&gt;과 간단한 &lt;b&gt;예시 단어&lt;/b&gt; 포함&lt;/li&gt;
&lt;li data-end=&quot;1158&quot; data-start=&quot;1126&quot;&gt;직접 손으로 쓰면서 &lt;b&gt;눈과 손의 기억&lt;/b&gt;을 함께 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;1173&quot; data-start=&quot;1160&quot; data-ke-size=&quot;size26&quot;&gt;엑셀 파일 다운로드&lt;/h2&gt;
&lt;p data-end=&quot;1231&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size16&quot;&gt;  [히라가나/가타카나 따라쓰기 엑셀 다운로드 링크]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ckd4J7/btsOynzyq1N/xDHljf3GVxx4ENGbfNLrv1/%ED%9E%88%EB%9D%BC%EA%B0%80%EB%82%98%EA%B0%80%ED%83%80%EA%B0%80%EB%82%98.xlsx?attach=1&amp;amp;knm=tfile.xlsx&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;히라가나가타가나.xlsx&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1380&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1380&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;한글이 우리 말을 아름답게 담아내듯, 일본어도 히라가나와 가타카나라는 문자로 자신의 언어를 표현합니다.&lt;br /&gt;일본어 공부를 처음 시작하는 분들께, 이 따라쓰기 엑셀 파일이 도움이 되기를 바라며, 성공적인 일본어 학습을 바랄게요.&lt;/p&gt;
&lt;p data-end=&quot;1380&quot; data-start=&quot;1243&quot; data-ke-size=&quot;size16&quot;&gt;파일 암호는 &lt;s&gt;1122&lt;/s&gt; 입니다~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좋아요 댓글 부탁드려요~!&lt;/p&gt;</description>
      <category>잡다한지식</category>
      <category>가타가나</category>
      <category>따라쓰기</category>
      <category>시작</category>
      <category>일본어</category>
      <category>일본어따라쓰기</category>
      <category>일본어연습</category>
      <category>일본어입문</category>
      <category>히라가나</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/457</guid>
      <comments>https://maketh.tistory.com/457#entry457comment</comments>
      <pubDate>Thu, 12 Jun 2025 17:51:41 +0900</pubDate>
    </item>
    <item>
      <title>06/12의 기도</title>
      <link>https://maketh.tistory.com/456</link>
      <description>&lt;p data-end=&quot;80&quot; data-start=&quot;65&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하나님께 드리는 기도&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;136&quot; data-start=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;사랑과 은혜가 충만하신 하나님 아버지,&lt;br /&gt;오늘도 저희의 삶을 인도하시고 지켜주심에 감사드립니다.&lt;/p&gt;
&lt;p data-end=&quot;241&quot; data-start=&quot;138&quot; data-ke-size=&quot;size16&quot;&gt;주님, 저희 가족의 건강을 주님께 맡깁니다.&lt;br /&gt;하나하나의 몸과 마음을 강건하게 붙들어 주셔서&lt;br /&gt;어떠한 질병이나 사고로부터 보호해 주시고,&lt;br /&gt;늘 평안과 기쁨이 넘치게 하여 주옵소서.&lt;/p&gt;
&lt;p data-end=&quot;348&quot; data-start=&quot;243&quot; data-ke-size=&quot;size16&quot;&gt;저희 자녀들의 앞날을 주님께 올려드립니다.&lt;br /&gt;지혜와 분별력을 주셔서&lt;br /&gt;세상의 유혹에 흔들리지 않고&lt;br /&gt;주님의 뜻을 따르는 삶을 살아가게 하시고,&lt;br /&gt;진정한 행복과 평안을 누리게 하소서.&lt;/p&gt;
&lt;p data-end=&quot;436&quot; data-start=&quot;350&quot; data-ke-size=&quot;size16&quot;&gt;새로 세워진 대통령과 위정자들을 위해 기도합니다.&lt;br /&gt;정직한 마음과 국민을 향한 섬김의 자세를 주시고,&lt;br /&gt;공의와 사랑으로 이 나라를 이끌어가게 하옵소서.&lt;/p&gt;
&lt;p data-end=&quot;528&quot; data-start=&quot;438&quot; data-ke-size=&quot;size16&quot;&gt;주님, 우리 민족 가운데 분열과 갈등을 넘어&lt;br /&gt;화합과 용서가 이뤄지게 하시며&lt;br /&gt;하나 된 마음으로 새로운 미래를 열어갈 수 있도록&lt;br /&gt;은혜와 지혜를 부어주소서.&lt;/p&gt;
&lt;p data-end=&quot;640&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;저희 가정의 경제적 형편도 주님께 올려드립니다.&lt;br /&gt;필요한 것을 채워주시되, 탐욕이 아닌 감사의 마음을 주시고,&lt;br /&gt;경제적 자유를 이루기 위해 부지런히 행동할 수 있는&lt;br /&gt;지혜와 기회를 허락하소서.&lt;/p&gt;
&lt;p data-end=&quot;753&quot; data-start=&quot;642&quot; data-ke-size=&quot;size16&quot;&gt;주님, 저희 마음에 게으름이 자리하지 않게 하시고&lt;br /&gt;계획한 일들을 꾸준히 실행할 수 있는 힘과 의지를 주소서.&lt;br /&gt;작은 일에 충성하며, 오늘 주어진 하루를&lt;br /&gt;성실하게 살아가는 저희가 되게 하소서.&lt;/p&gt;
&lt;p data-end=&quot;811&quot; data-start=&quot;755&quot; data-ke-size=&quot;size16&quot;&gt;모든 것 위에 주님의 뜻이 이루어지기를 소망하며&lt;br /&gt;예수 그리스도의 이름으로 기도드립니다.&lt;br /&gt;아멘.&lt;/p&gt;</description>
      <category>Pray</category>
      <category>기도</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/456</guid>
      <comments>https://maketh.tistory.com/456#entry456comment</comments>
      <pubDate>Thu, 12 Jun 2025 09:10:25 +0900</pubDate>
    </item>
    <item>
      <title>하늘을 봐, 바람이 불고 있어</title>
      <link>https://maketh.tistory.com/455</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;차라리 그냥 엉엉 울자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;그리고 나면 지나간다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;품고 안고 억지로 다른 얽둘로 버티지 말자.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;어디서든 울 곳은 찾으면 많다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;=====================================================================================&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;베스트셀러 작가 고윤의 신작&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;하늘을 봐, 바람이 불고 있어 입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DSC_5187.JPG&quot; data-origin-width=&quot;3008&quot; data-origin-height=&quot;4512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOuNkj/btsNuJKaz0P/48W5asq5i9fu6Y2e6RlmdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOuNkj/btsNuJKaz0P/48W5asq5i9fu6Y2e6RlmdK/img.jpg&quot; data-alt=&quot;고윤 신작, 하늘을 봐, 바람이 불고 있어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOuNkj/btsNuJKaz0P/48W5asq5i9fu6Y2e6RlmdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOuNkj%2FbtsNuJKaz0P%2F48W5asq5i9fu6Y2e6RlmdK%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;559&quot; height=&quot;839&quot; data-filename=&quot;DSC_5187.JPG&quot; data-origin-width=&quot;3008&quot; data-origin-height=&quot;4512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;고윤 신작, 하늘을 봐, 바람이 불고 있어&lt;/figcaption&gt;
&lt;/figure&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;라고 말해줬는데&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DSC_5188.JPG&quot; data-origin-width=&quot;4512&quot; data-origin-height=&quot;3008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euY36c/btsNwQuL9gk/KnjD8pIhe2Q2O9DfWgDrP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euY36c/btsNwQuL9gk/KnjD8pIhe2Q2O9DfWgDrP0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euY36c/btsNwQuL9gk/KnjD8pIhe2Q2O9DfWgDrP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuY36c%2FbtsNwQuL9gk%2FKnjD8pIhe2Q2O9DfWgDrP0%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;645&quot; height=&quot;430&quot; data-filename=&quot;DSC_5188.JPG&quot; data-origin-width=&quot;4512&quot; data-origin-height=&quot;3008&quot;/&gt;&lt;/span&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DSC_5190.JPG&quot; data-origin-width=&quot;4512&quot; data-origin-height=&quot;3008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byxMQV/btsNv9g4Owh/dHHy06PwkcBqruB0G8de8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byxMQV/btsNv9g4Owh/dHHy06PwkcBqruB0G8de8k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byxMQV/btsNv9g4Owh/dHHy06PwkcBqruB0G8de8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyxMQV%2FbtsNv9g4Owh%2FdHHy06PwkcBqruB0G8de8k%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;716&quot; height=&quot;477&quot; data-filename=&quot;DSC_5190.JPG&quot; data-origin-width=&quot;4512&quot; data-origin-height=&quot;3008&quot;/&gt;&lt;/span&gt;&lt;/figure&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;서점에 들어서면 죄다 자기계발, 돈버는법, 자아실현 책들 뿐인데..&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;</description>
      <category>리뷰/Book</category>
      <category>고윤</category>
      <category>고윤신작</category>
      <category>삶</category>
      <category>책</category>
      <category>하늘을봐</category>
      <category>해바라기</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/455</guid>
      <comments>https://maketh.tistory.com/455#entry455comment</comments>
      <pubDate>Wed, 23 Apr 2025 14:48:19 +0900</pubDate>
    </item>
    <item>
      <title>비상이동 매뉴얼 - 지금, 이 회사에서 반드시 벗어나고 싶을 때</title>
      <link>https://maketh.tistory.com/454</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20250324_173952163_01.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7PPE9/btsMTnV8rXI/LS3a6zKxt08pY2VDwhTuyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7PPE9/btsMTnV8rXI/LS3a6zKxt08pY2VDwhTuyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7PPE9/btsMTnV8rXI/LS3a6zKxt08pY2VDwhTuyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7PPE9%2FbtsMTnV8rXI%2FLS3a6zKxt08pY2VDwhTuyK%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;546&quot; height=&quot;728&quot; data-filename=&quot;KakaoTalk_20250324_173952163_01.jpg&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 style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;비상이동 매뉴얼&quot;은 리처드 N. 볼스가 저술한, 직업 탐색과 경력 전환을 위한 실용적인 안내서입니다. 이 책은 단순한 취업 가이드북을 넘어, 인생의 다음 챕터로 나아가기 위한 나침반으로서의 역할을 합니다. 특히, 경직된 이직 매뉴얼이 아닌, 따뜻한 시선과 현실적인 언어로 독자에게 조언을 해주는 것이 특징입니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;책의 핵심 메시지&lt;/h2&gt;
&lt;p style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 책의 핵심 메시지는 **&quot;내가 어떤 사람인지 아는 것이 경력 설계의 시작이다.&quot;**입니다. 이직을 성공적으로 하거나 새로운 커리어를 발견하려면, 외부 환경보다 먼저 자기 자신을 파악해야 한다는 것입니다. 이를 위해 &quot;꽃 연습&quot;이라는 자기 진단 도구를 제공합니다. 이 연습은 독자가 자신의 가치관, 흥미, 능력, 업무 환경 선호도, 급여 기대치를 분석할 수 있게 도와줍니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://brunch.co.kr/@@fdxk/812&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&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;KakaoTalk_20250324_173952163_02.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzGSXY/btsMUkYxgZy/I2ggSftBHx4FOgS3lNJQt0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzGSXY/btsMUkYxgZy/I2ggSftBHx4FOgS3lNJQt0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzGSXY/btsMUkYxgZy/I2ggSftBHx4FOgS3lNJQt0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzGSXY%2FbtsMUkYxgZy%2FI2ggSftBHx4FOgS3lNJQt0%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;526&quot; height=&quot;701&quot; data-filename=&quot;KakaoTalk_20250324_173952163_02.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;주요 내용&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;구직 활동 시 회복력 유지&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구직 활동 중 회복력을 유지하는 10가지 방법을 제시합니다. 자존감을 지키는 법, 수줍음을 극복하는 전략, 법적 권리에 대한 이해 등 실질적인 방법을 제공합니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://m.yes24.com/Goods/Detail/143557366&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;직업 선택 및 이직&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경력 선택 또는 이직 과정에서 전통적인 구직 기술과 &quot;꽃 연습&quot;을 활용하는 방법을 설명합니다. 완전히 다른 두 가지 구직 전략을 고려할 수 있도록 돕습니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://m.yes24.com/Goods/Detail/143557366&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;온라인 프로필 관리 및 면접 준비&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;온라인 이력서를 최적화하고, 면접 시 주도권을 잃지 않는 방법을 제시합니다. 또한, 15가지 면접 팁을 통해 독자가 자신감 있게 면접에 임할 수 있도록 돕습니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://m.yes24.com/Goods/Detail/143557366&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연봉 협상 및 창업&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연봉 협상을 위한 5가지 비밀을 공개하며, 창업에 대한 구체적 사례와 조언도 포함되어 있습니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://m.yes24.com/Goods/Detail/143557366&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인생의 사명 찾기&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막 장에서는 인생의 사명 찾기에 대해 다룹니다. 이는 단순한 직업 정보서가 아닌, 삶의 방향성을 함께 고민하는 인생 매뉴얼로 독자에게 큰 감동을 줍니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://brunch.co.kr/@@fdxk/812&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;추천 대상&lt;/h2&gt;
&lt;p style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 책은 막연히 회사를 그만두고 싶지만 두려움 때문에 망설이는 직장인, 경력 전환을 고민하는 이들에게 추천됩니다. 사회 초년생뿐만 아니라, 30~50대 커리어 전환기를 맞는 분들에게도 유용합니다. 결국, 가장 중요한 것은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;나 자신을 아는 것&lt;/b&gt;입니다&lt;span&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://brunch.co.kr/@@fdxk/812&quot; data-state=&quot;closed&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #000000; text-align: center;&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p style=&quot;background-color: oklch(0.99 0.004 106.471); color: oklch(0.304 0.04 213.681); text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&quot;비상이동 매뉴얼&quot;은 경직된 이직 가이드북이 아닌, 따뜻한 조언과 실질적인 팁을 제공하는 책입니다. 독자가 자신의 비상구를 찾아갈 수 있도록 도와주는 가치 있는 책으로, 읽는 동안 내 마음속 비상구가 어디에 있는지 차근차근 찾아갈 수 있는 기회를 제공합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1742805849160&quot; class=&quot;erlang&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;본 독서 인증은 스노우폭스북스의 지원을 받아 작성되었습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <category>매뉴얼</category>
      <category>비상이동</category>
      <category>스노우폭스</category>
      <category>이동</category>
      <category>이직</category>
      <category>자기계발</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/454</guid>
      <comments>https://maketh.tistory.com/454#entry454comment</comments>
      <pubDate>Mon, 24 Mar 2025 17:44:18 +0900</pubDate>
    </item>
    <item>
      <title>성공과 행복을 이루고 싶다면 결코, 배불리 먹지말것!</title>
      <link>https://maketh.tistory.com/453</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;오늘은 성공과 행복을 이루고 싶다면 결코, 배불리 먹지말것 이라는 책을 소개하러 왔습니다&lt;br&gt;&lt;br&gt;이 책은 최초출간일이 1812년인 일본 원작을 배경으로 하고 있습니다&lt;br&gt;&lt;br&gt;수많은 성공과 자기개발을 다룬 책들 중, 거의 유일하다시피 ‘음식’을 주제로 하고 있습니다&lt;br&gt;&lt;br&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/bgePKu/btsL5DxW9ho/mqHHEWo1yGFHwkFqEULgx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgePKu/btsL5DxW9ho/mqHHEWo1yGFHwkFqEULgx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgePKu/btsL5DxW9ho/mqHHEWo1yGFHwkFqEULgx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgePKu%2FbtsL5DxW9ho%2FmqHHEWo1yGFHwkFqEULgx1%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brbYZE/btsL5taYVMW/XS5fGlaquj7lTtjWWfgmG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brbYZE/btsL5taYVMW/XS5fGlaquj7lTtjWWfgmG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brbYZE/btsL5taYVMW/XS5fGlaquj7lTtjWWfgmG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrbYZE%2FbtsL5taYVMW%2FXS5fGlaquj7lTtjWWfgmG0%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;미즈노 남보쿠 작가의 책을 기반으로, 음식의 절제에 대하여 다루고 있습니다&lt;br&gt;&lt;br&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/bvZPiS/btsL5DdEtB9/jYVUS2k3rZc4VEulrUg0KK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvZPiS/btsL5DdEtB9/jYVUS2k3rZc4VEulrUg0KK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvZPiS/btsL5DdEtB9/jYVUS2k3rZc4VEulrUg0KK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvZPiS%2FbtsL5DdEtB9%2FjYVUS2k3rZc4VEulrUg0KK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;이처럼 중간중간 일러스트를 포함하여 지루하지 않고,&lt;br&gt;&lt;br&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/IHy2n/btsL6AUwaXp/PzkyiVTCaRskggoZqun6lK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IHy2n/btsL6AUwaXp/PzkyiVTCaRskggoZqun6lK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IHy2n/btsL6AUwaXp/PzkyiVTCaRskggoZqun6lK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIHy2n%2FbtsL6AUwaXp%2FPzkyiVTCaRskggoZqun6lK%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&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;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UVu7Y/btsL534abeW/Klv7qVc4b38kZVVTFA6gwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UVu7Y/btsL534abeW/Klv7qVc4b38kZVVTFA6gwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UVu7Y/btsL534abeW/Klv7qVc4b38kZVVTFA6gwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUVu7Y%2FbtsL534abeW%2FKlv7qVc4b38kZVVTFA6gwk%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;3024&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;성공과 자기개발을 다루면서 고전, 습관 등&lt;br&gt;많은 주제들을 만나봤지만, 음식을 주제로 하여 신선한 경험 인 것 같습니다&lt;br&gt;&lt;br&gt;한번쯤 천천히 읽어보시는것 추천합니다&lt;br&gt;&lt;br&gt;본 독서 인증은 스노우폭스북스의 지원을 받아 작성되었습니다.&lt;/p&gt;</description>
      <category>리뷰/Book</category>
      <category>고전</category>
      <category>성공</category>
      <category>스노우폭스북스</category>
      <category>음식</category>
      <category>자기개발</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/453</guid>
      <comments>https://maketh.tistory.com/453#entry453comment</comments>
      <pubDate>Tue, 4 Feb 2025 10:18:01 +0900</pubDate>
    </item>
    <item>
      <title>배달 부업 추천(배민 vs 쿠팡)</title>
      <link>https://maketh.tistory.com/452</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;그동안 뭔가 자기개발 관련해서 책만 읽다가, 결국엔 실행이다 싶어 새해 들어 배달 부업을 시작했습니다&lt;br&gt;&lt;br&gt;이번에 정말 크기 느낀건, 실행이 답이다 라는 것입니다&lt;br&gt;&lt;br&gt;저는 쿠팡이츠를 주로 사용했어서 시작은 쿠팡이츠배달파트너로 시작했어요&lt;br&gt;그러다 배민이 수수료도 높고 배정도 잘된다는 얘기를 듣고 시작한 배민.&lt;br&gt;둘 비교의결론은….&lt;br&gt;의외로 배달사고에서 발생했습니다&lt;br&gt;쿠팡이츠배달파트너는 뭔가 느낌이 좋습니다&lt;br&gt;연결도 잘되고, 고객들의 요청사항 등 주소를 안내하는 것도 자연스러워요&lt;br&gt;길안내 안내도 티맵도 가능하고요( 배민은 네이버 &amp;amp; 카카오맵만 가능 - 제일 큰 불만이자 애로사항)&lt;br&gt;이 점에서 가장 큰 차이가 발생합니다&lt;br&gt;사용하다보면 쿠팡이츠배달파트너는 티맵연결도 필요없습니다. 어플 자체에서 최적의 경로를 알려주거든요&lt;br&gt;초반에는 티맵을 사용했었는데, 갈수록 외부어플은 사용하지 않게 됩니다. 왜냐하면 어플 자체에서 안내해주는 경로가 오토바이에 더 최적화 돼있습니다.&lt;br&gt;멋있어요&lt;br&gt;&lt;br&gt;오늘 배민 배달사고(오배달)을 내고 나니까&lt;br&gt;쿠팡이츠가 더 대단해 보입니다&lt;br&gt;만약 그 사고건이 쿠팡이츠 배달이었다면 사고를 내지&lt;br&gt;않았을겁니다&lt;br&gt;실제 배달을 3주정도 해본 사람의&lt;br&gt;개인적인 의견입니다&lt;br&gt;&lt;br&gt;저처럼 쿠팡이츠로 배달을 시작하신다면&lt;br&gt;꽤 괜찮은 선택이라고 생각합니다&lt;br&gt;시작에 도움되고자 추천인 이벤트 공유합니다&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DeHVI/btsLRDZHdIb/fuyB3YTE1Qdk81Q0Ug8ks0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DeHVI/btsLRDZHdIb/fuyB3YTE1Qdk81Q0Ug8ks0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DeHVI/btsLRDZHdIb/fuyB3YTE1Qdk81Q0Ug8ks0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDeHVI%2FbtsLRDZHdIb%2FfuyB3YTE1Qdk81Q0Ug8ks0%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;1179&quot; height=&quot;1743&quot; data-origin-width=&quot;1179&quot; data-origin-height=&quot;1743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;a href=&quot;https://eatscourier.app.link/fHFAH5OXhQb&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://eatscourier.app.link/fHFAH5OXhQb&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;[초대 코드 : 833EBU6R]&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;친구 초대 코드 입력 후 배달하면 1만원 보너스!&quot; data-og-host=&quot;eatscourier.app.link&quot; data-og-source-url=&quot;https://eatscourier.app.link/fHFAH5OXhQb&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biPQlZ/hyX4kL8fkl/eF9j4FXz1JCpvq9E7A71v1/img.png?width=1600&amp;amp;height=800&amp;amp;face=445_182_1130_312&quot; data-og-url=&quot;https://eatscourier.app.link/fHFAH5OXhQb&quot;&gt;&lt;a href=&quot;https://eatscourier.app.link/fHFAH5OXhQb&quot; target=&quot;_blank&quot; data-source-url=&quot;https://eatscourier.app.link/fHFAH5OXhQb&quot;&gt;&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biPQlZ/hyX4kL8fkl/eF9j4FXz1JCpvq9E7A71v1/img.png?width=1600&amp;amp;height=800&amp;amp;face=445_182_1130_312')&quot;&gt; &lt;/div&gt;&lt;div class=&quot;og-text&quot;&gt;&lt;p class=&quot;og-title&quot;&gt;[초대 코드 : 833EBU6R]&lt;/p&gt;&lt;p class=&quot;og-desc&quot;&gt;친구 초대 코드 입력 후 배달하면 1만원 보너스!&lt;/p&gt;&lt;p class=&quot;og-host&quot;&gt;eatscourier.app.link&lt;/p&gt;&lt;/div&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;가입시 위 링크를 이용하시거나 추천인에 833EBU6R 입력시&lt;br&gt;여러분께 포인트(현금) 지급됩니다&lt;br&gt;만약 추천인에 저를 입력하시면 관련되는 비용은 어려운분을 돕는데 사용할 예정입니다. 아마도 저도 애가 있다 보니 고아원이나 보육원쪽으로 생각중입니다&lt;br&gt;&lt;br&gt;무엇보다 라이더를 하시려는 분들..&lt;br&gt;항상 안전하게, 천천히, 슬로우 를 되새기면서 배달부탁드립니다.&lt;br&gt;오늘도 배달히면서, 슬로우 슬로우, 천천히 천천히&lt;br&gt;를&lt;br&gt;천번 만번 되새기면서 했네요&lt;br&gt;조금 늦어도 나를 기다리는 가족들 품에, 아빠를 기다리는 아들딸, 아들을 기다리는 부모님께 다행이다 를&lt;br&gt;선물 할 수 있습니다.&lt;br&gt;항상&lt;br&gt;언제나&lt;br&gt;안전하게 운전하십시오&lt;br&gt;오배달 같은 배달사고는 그저 돈으로 책임지면 됩니다&lt;br&gt;허나,&lt;br&gt;사고나면 가족들에게 더 큰 짐이 될 수 있습니다&lt;br&gt;&lt;br&gt;항상 안운하십시오 응원합니다!!&lt;/p&gt;</description>
      <category>잡다한지식</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/452</guid>
      <comments>https://maketh.tistory.com/452#entry452comment</comments>
      <pubDate>Mon, 20 Jan 2025 01:26:47 +0900</pubDate>
    </item>
    <item>
      <title>돈 후안 마누엘 : 선과 악의 기준은 무엇인가?</title>
      <link>https://maketh.tistory.com/451</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;700년 전의 고전&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;lt;고전이 답했다 마땅히 살아야 할 삶에 대하여&amp;gt; 책을 읽었던 터라 더욱 고전에 대한 관심이 갔다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누구나 한번쯤 가슴에 던졌던 질문, 과연 선과 악의 기준은 무엇일까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20241223_174357382.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rn3hC/btsLteZVtlJ/zAEnTJsCq0ceYVtzYaedkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rn3hC/btsLteZVtlJ/zAEnTJsCq0ceYVtzYaedkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rn3hC/btsLteZVtlJ/zAEnTJsCq0ceYVtzYaedkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRn3hC%2FbtsLteZVtlJ%2FzAEnTJsCq0ceYVtzYaedkK%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;379&quot; height=&quot;505&quot; data-filename=&quot;KakaoTalk_20241223_174357382.jpg&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;이 책은 돈 후안 마누엘의 48가지 단편으로 이루어져 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20241223_174357382_01.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dweb6K/btsLs86okR4/yRytmkjLNIehccfu2SMbL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dweb6K/btsLs86okR4/yRytmkjLNIehccfu2SMbL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dweb6K/btsLs86okR4/yRytmkjLNIehccfu2SMbL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdweb6K%2FbtsLs86okR4%2FyRytmkjLNIehccfu2SMbL1%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;372&quot; height=&quot;496&quot; data-filename=&quot;KakaoTalk_20241223_174357382_01.jpg&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20241223_174357382_02.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKN7xe/btsLtcOAVbE/4muaiyhd59DD3YEXtO35nk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKN7xe/btsLtcOAVbE/4muaiyhd59DD3YEXtO35nk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKN7xe/btsLtcOAVbE/4muaiyhd59DD3YEXtO35nk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKN7xe%2FbtsLtcOAVbE%2F4muaiyhd59DD3YEXtO35nk%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;360&quot; height=&quot;480&quot; data-filename=&quot;KakaoTalk_20241223_174357382_02.jpg&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;서문과 추천사, 48편의 단편 중 한편을 읽었으나&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;</description>
      <category>리뷰/Book</category>
      <category>고전</category>
      <category>돈 후안 마누엘</category>
      <category>마누엘</category>
      <category>선</category>
      <category>선과악의기준</category>
      <category>스노우폭스북스</category>
      <category>악</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/451</guid>
      <comments>https://maketh.tistory.com/451#entry451comment</comments>
      <pubDate>Mon, 23 Dec 2024 17:51:53 +0900</pubDate>
    </item>
    <item>
      <title>Java의 RetentionPolicy 완벽 가이드</title>
      <link>https://maketh.tistory.com/450</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java Annotation은 메타데이터를 코드에 추가하는 데 사용되며, 이를 통해 다양한 정보를 코드에 부여할 수 있습니다. 하지만 모든 Annotation이 항상 유지되지는 않습니다. Annotation이 어느 시점까지 유지될지는 &lt;b&gt;RetentionPolicy&lt;/b&gt;에 따라 결정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 &lt;b&gt;RetentionPolicy&lt;/b&gt;가 무엇인지, 각 옵션(SOURCE, CLASS, RUNTIME)이 어떤 의미를 가지는지, 그리고 이를 실제로 어떻게 활용할 수 있는지 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. &lt;b&gt;RetentionPolicy란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 RetentionPolicy는 Annotation이 &lt;b&gt;어느 시점까지 유지될지&lt;/b&gt;를 정의합니다. @Retention 어노테이션을 사용하여 RetentionPolicy를 지정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733899825367&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Logging {
    String value() default &quot;&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RetentionPolicy에는 세 가지 옵션이 있습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;SOURCE&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CLASS&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RUNTIME&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 옵션들은 각각 Annotation이 유지되는 기간을 결정합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;RetentionPolicy의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) RetentionPolicy.SOURCE&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명&lt;/b&gt;: Annotation이 &lt;b&gt;소스 코드에서만 유지&lt;/b&gt;됩니다. 컴파일 이후 .class 파일에는 포함되지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 코드 레벨에서만 필요한 메타데이터로, 런타임이나 컴파일 이후에는 더 이상 필요 없는 경우 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예&lt;/b&gt;: @Override, @SuppressWarnings&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드 예제&lt;/h4&gt;
&lt;pre id=&quot;code_1733899850227&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface DeveloperNote {
    String comment();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예제&lt;/p&gt;
&lt;pre id=&quot;code_1733899869869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@DeveloperNote(comment = &quot;This method is critical for performance&quot;)
public void process() {
    // 메서드 로직
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 @DeveloperNote Annotation은 개발자가 코드를 읽을 때 참고용으로만 사용되며, 컴파일된 .class 파일에는 포함되지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(2) RetentionPolicy.CLASS&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명&lt;/b&gt;: Annotation이 &lt;b&gt;컴파일된 .class 파일에 포함&lt;/b&gt;되지만, &lt;b&gt;런타임에는 사용되지 않습니다&lt;/b&gt;. JVM이 애플리케이션을 실행할 때는 이 정보를 읽을 수 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: 런타임에서 필요하지 않지만, 컴파일 이후 다른 도구(예: 바이트코드 분석 도구)에서 활용할 수 있는 메타데이터를 저장할 때 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기본값&lt;/b&gt;: RetentionPolicy.CLASS는 Annotation의 기본 RetentionPolicy입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드 예제&lt;/h4&gt;
&lt;pre id=&quot;code_1733899902733&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface CompileTimeInfo {
    String version();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용 예제&lt;/h4&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1733899920702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@CompileTimeInfo(version = &quot;1.0.0&quot;)
public class MyClass {
    // 클래스 로직
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Annotation은 .class 파일에는 포함되지만, 런타임에 Reflection으로 접근할 수는 없습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(3) RetentionPolicy.RUNTIME&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;설명&lt;/b&gt;: Annotation이 &lt;b&gt;컴파일된 .class 파일에 포함&lt;/b&gt;되고, &lt;b&gt;애플리케이션이 실행되는 동안(JVM 실행 시점)에도 유지&lt;/b&gt;됩니다. Reflection API를 사용하여 Annotation 정보를 읽을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;용도&lt;/b&gt;: Spring, Hibernate, JPA 등 다양한 프레임워크와 라이브러리에서 동적으로 Annotation 정보를 처리할 때 사용됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예&lt;/b&gt;: @Entity, @Transactional, @Component&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코드 예제&lt;/h4&gt;
&lt;pre id=&quot;code_1733899940344&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Logging {
    String level() default &quot;INFO&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예제&lt;/p&gt;
&lt;pre id=&quot;code_1733899953872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Logging(level = &quot;DEBUG&quot;)
public void execute() {
    System.out.println(&quot;Executing method&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflection을 사용하여 Annotation 읽기&lt;/p&gt;
&lt;pre id=&quot;code_1733899969698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.reflect.Method;

public class AnnotationTest {
    public static void main(String[] args) throws Exception {
        Method method = AnnotationTest.class.getMethod(&quot;execute&quot;);
        if (method.isAnnotationPresent(Logging.class)) {
            Logging logging = method.getAnnotation(Logging.class);
            System.out.println(&quot;Logging level: &quot; + logging.level());
        }
    }

    @Logging(level = &quot;DEBUG&quot;)
    public void execute() {
        System.out.println(&quot;Executing method&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 결과&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1733899988345&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Logging level: DEBUG&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;RetentionPolicy 비교&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RetentionPolicy소스 코드컴파일된 .class 파일런타임용도&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SOURCE&lt;/td&gt;
&lt;td&gt;유지&lt;/td&gt;
&lt;td&gt;포함 안 됨&lt;/td&gt;
&lt;td&gt;사용 불가&lt;/td&gt;
&lt;td&gt;개발자 주석, 코드 힌트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLASS&lt;/td&gt;
&lt;td&gt;유지&lt;/td&gt;
&lt;td&gt;포함&lt;/td&gt;
&lt;td&gt;사용 불가&lt;/td&gt;
&lt;td&gt;바이트코드 분석 도구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RUNTIME&lt;/td&gt;
&lt;td&gt;유지&lt;/td&gt;
&lt;td&gt;포함&lt;/td&gt;
&lt;td&gt;사용 가능&lt;/td&gt;
&lt;td&gt;Reflection, 프레임워크&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. RetentionPolicy 활용 사례&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(1) SOURCE 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Override와 같은 Annotation은 개발자가 코드 작성 시 참고할 수 있도록 도와줍니다. 컴파일 이후에는 의미가 없기 때문에 SOURCE로 설정됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733900008570&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.METHOD)
public @interface CodeReview {
    String reviewer();
    String date();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(2) CLASS 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@CompileTimeInfo와 같은 Annotation은 런타임에는 필요 없지만, 컴파일 후 바이트코드를 분석하거나 다른 도구로 처리할 때 유용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733900026881&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface Generated {
    String value();
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;(3) RUNTIME 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Logging, @Entity, @Component와 같은 Annotation은 런타임에 동적 처리를 위해 사용됩니다. 이는 Spring, Hibernate 등의 프레임워크에서 필수적입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1733900054222&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Transactional {
    String isolation() default &quot;DEFAULT&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. RetentionPolicy 선택 가이드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Annotation을 만들 때, 어떤 RetentionPolicy를 선택할지 다음 기준을 참고하세요:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;개발 단계에서만 필요한 경우&lt;/b&gt;: SOURCE를 사용.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자가 참고하거나 컴파일러가 경고를 생성하는 용도로 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;런타임에는 필요 없지만, .class 파일에 정보를 포함해야 하는 경우&lt;/b&gt;: CLASS를 사용.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바이트코드 분석, 문서 생성 도구에서 사용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Reflection 또는 프레임워크에서 동적으로 처리해야 하는 경우&lt;/b&gt;: RUNTIME을 사용.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring, Hibernate, JPA 등의 프레임워크에서 Annotation을 활용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java의 RetentionPolicy는 Annotation의 유지 기간을 결정하는 중요한 요소입니다. 올바른 RetentionPolicy를 선택하면 코드의 의도를 명확히 하고, 컴파일러와 런타임 환경에서 적절히 동작하도록 제어할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SOURCE는 코드 힌트와 주석에,&lt;/li&gt;
&lt;li&gt;CLASS는 바이트코드 분석 및 컴파일 이후 정보 제공에,&lt;/li&gt;
&lt;li&gt;RUNTIME은 Reflection 및 프레임워크 동작에 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Annotation을 정의할 때 RetentionPolicy를 적절히 설정하여 효율적이고 명확한 코드를 작성해 보세요!&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;</description>
      <category>Programing/Spring</category>
      <category>annotation</category>
      <category>annotation 적용범위</category>
      <category>annotation 정책</category>
      <category>retention policy</category>
      <category>범위</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/450</guid>
      <comments>https://maketh.tistory.com/450#entry450comment</comments>
      <pubDate>Wed, 11 Dec 2024 15:54:55 +0900</pubDate>
    </item>
    <item>
      <title>계엄령 선포와 군인의 명령 지연: 사회, 법적, 윤리적 문제 분석</title>
      <link>https://maketh.tistory.com/449</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;DALL&amp;amp;middot;E 2024-12-11 11.28.11 - A dramatic image representing the tension between military orders and personal ethics. The scene shows a military officer standing in front of a large.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CxQXw/btsLd6gtY3I/xegz0myVUkk2a19ZlzqbM1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CxQXw/btsLd6gtY3I/xegz0myVUkk2a19ZlzqbM1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CxQXw/btsLd6gtY3I/xegz0myVUkk2a19ZlzqbM1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCxQXw%2FbtsLd6gtY3I%2Fxegz0myVUkk2a19ZlzqbM1%2Fimg.webp&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;1024&quot; height=&quot;1024&quot; data-filename=&quot;DALL&amp;middot;E 2024-12-11 11.28.11 - A dramatic image representing the tension between military orders and personal ethics. The scene shows a military officer standing in front of a large.webp&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 대한민국에서 대통령이 계엄령을 선포한 사건이 발생하면서, 일부 군인들이 자기판단에 따라 명령 수행을 지연한 상황이 논란이 되고 있습니다. 계엄령은 국가의 위기 상황에서 법적, 행정적 조치를 강화하기 위해 군을 동원하는 제도이며, 이로 인해 군인의 역할이 중요한 상황에 직면합니다. 이 사건은 여러 면에서 심각한 사회적, 법적, 윤리적 문제를 야기할 수 있습니다. 본 글에서는 이와 관련된 문제를 다각도로 분석해보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;군인의 명령 불복종과 법적 문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;군인은 군사적 계층 구조와 명령 체계에 따라 움직여야 하며, 그 명령 불복종은 법적 처벌을 받을 수 있습니다. 군대 내에서 명령을 따르지 않는 것은 &quot;불법 명령 불복종&quot;으로 간주될 수 있으며, 이에 대한 법적 책임이 따를 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;군법&lt;/b&gt;에 따르면, 군인은 상관의 명령을 거부할 수 없으며, 명령을 수행하지 않거나 지연하는 행위는 군 법정에서 처벌을 받을 수 있습니다.&lt;/li&gt;
&lt;li&gt;만약 명령이 불법적이거나 헌법에 위반되는 경우, 군인은 그 명령을 거부할 수 있다는 법적 근거도 존재합니다. 그러나 이는 매우 예외적인 경우이며, 해당 명령이 헌법에 반하거나 국제법에 위배되는 경우에 한정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 군인의 명령 지연은 법적인 측면에서 큰 논란을 일으킬 수 있으며, 그에 대한 처벌 여부가 중요한 쟁점이 될 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;사회적 신뢰와 군의 역할 문제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계엄령 선포는 국가가 위기에 처했음을 의미하며, 군은 그 위기 상황에서 중요한 역할을 해야 합니다. 군의 명령 지연은 군의 신뢰를 떨어뜨릴 수 있으며, 사회적 불안감을 초래할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;군이 제대로 명령을 수행하지 않으면, 시민들의 안전이 위협받을 수 있으며, 정부의 권위에 대한 의문이 제기될 수 있습니다.&lt;/li&gt;
&lt;li&gt;군의 내부에서 명령이 제대로 실행되지 않으면, 국가의 방위력이 약화될 수 있으며, 외부의 위협에 대응하는 데 어려움이 있을 수 있습니다.&lt;/li&gt;
&lt;li&gt;또한, 군인의 자율적 판단이 중요시되는 경우, 군 내부의 단합과 효율성이 떨어질 우려도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제는 군과 시민 간의 신뢰의 저하로 이어질 수 있으며, 사회적으로 매우 민감한 사안입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;윤리적 문제: 군인의 도덕적 판단과 개인의 권리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;군인의 명령을 지연시키는 행위는 군인이 직면하는 윤리적 딜레마를 드러냅니다. 군인은 국가와 사회의 안전을 책임지는 존재로서, 명령을 따르는 것과 개인의 도덕적 판단 사이에서 충돌할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;도덕적 딜레마&lt;/b&gt;: 군인은 때때로 명령이 윤리적으로 문제가 있을 때 개인의 도덕적 판단을 내려야 하는 상황에 놓이게 됩니다. 예를 들어, 계엄령이 특정 시민의 자유를 억압하거나 불합리한 방식으로 시행될 경우, 군인은 자신이 수행해야 할 명령에 대해 도덕적 판단을 내릴 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;군인의 책임&lt;/b&gt;: 군인이 명령을 지연시키는 경우, 그가 명령을 따르지 않은 이유가 무엇이든 간에 그로 인해 발생할 수 있는 결과에 대해 책임을 져야 합니다. 이는 군인의 도덕적 책임과 관련이 있으며, 개인의 양심과 직무 사이에서 갈등을 일으킬 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 군인의 개인적인 가치관과 국가의 명령 사이에서 발생할 수 있는 윤리적 충돌은 중요한 문제입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;정치적, 사회적 논란&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계엄령 선포와 군인의 명령 지연 문제는 정치적, 사회적 논란을 야기할 수 있습니다. 계엄령이 정치적 목적에 의해 남용될 수 있다는 우려는 항상 존재합니다. 이는 민주주의 원칙과 자유로운 사회를 유지하려는 시민들의 신뢰를 흔들 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계엄령이 남용되면, 시민들의 기본적인 자유가 침해될 수 있으며, 정치적 탄압이나 권력 남용의 도구로 변질될 수 있습니다.&lt;/li&gt;
&lt;li&gt;군인의 명령 지연은 이러한 우려에 대한 반응으로 나타날 수 있습니다. 군인은 국가의 안정성을 유지하는 중요한 역할을 하지만, 명령을 지연시키는 행위는 민주적 가치에 대한 지지로 해석될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국, 군의 역할과 정치적 판단은 민감한 문제로 다뤄져야 하며, 군인의 명령 거부나 지연은 정치적 배경과 결합되어 사회적 논란을 일으킬 수 있습니다.&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;</description>
      <category>잡다한지식</category>
      <category>계엄령</category>
      <category>명령</category>
      <category>복종</category>
      <category>불복종</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/449</guid>
      <comments>https://maketh.tistory.com/449#entry449comment</comments>
      <pubDate>Wed, 11 Dec 2024 11:28:44 +0900</pubDate>
    </item>
    <item>
      <title>Spring AOP로 Custom Annotation을 만들고 사용하는 방법</title>
      <link>https://maketh.tistory.com/448</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java와 Spring Framework에서는 AOP(Aspect-Oriented Programming)라는 강력한 기능을 제공하여, 코드의 중복을 제거하고 특정 기능을 쉽게 확장할 수 있습니다. AOP의 핵심은 &lt;b&gt;Aspect&lt;/b&gt;라는 개념인데, 이는 특정 기능을 모듈화하여 코드에서 중복을 제거하고 다양한 곳에서 재사용할 수 있도록 해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 &lt;b&gt;Spring AOP&lt;/b&gt;를 사용하여 &lt;b&gt;Custom Annotation&lt;/b&gt;을 만들고 이를 메서드에 적용하여 &lt;b&gt;Advice&lt;/b&gt;(부가기능)을 실행하는 방법에 대해 자세히 설명하겠습니다. 예를 들어, @Logging이라는 Custom Annotation을 만들어, 특정 메서드가 실행될 때마다 자동으로 로그를 기록하는 방법을 알아보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Spring AOP 개념과 사용 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring AOP는 메서드 실행 전후로 추가적인 동작을 처리할 수 있게 해주는 기능입니다. 이를 통해 &lt;b&gt;로깅&lt;/b&gt;, &lt;b&gt;트랜잭션 관리&lt;/b&gt;, &lt;b&gt;권한 체크&lt;/b&gt; 등 여러 부가기능을 핵심 비즈니스 로직과 분리하여 코드의 중복을 줄이고, 유지보수를 쉽게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AOP에서 핵심적인 개념은 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Aspect&lt;/b&gt;: 하나 이상의 부가기능(로깅, 트랜잭션 등)을 포함하는 모듈.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Advice&lt;/b&gt;: 실제 부가기능을 구현한 코드.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Pointcut&lt;/b&gt;: AOP가 적용될 지점(메서드, 클래스 등)을 정의하는 표현식.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JoinPoint&lt;/b&gt;: Advice가 실행되는 구체적인 지점(메서드 호출 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 AOP의 동작 원리를 이해했으니, Custom Annotation을 만들고 이를 AOP에서 사용하는 방법을 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Custom Annotation 만들기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Spring AOP에서 사용할 Custom Annotation을 만듭니다. 이 Annotation은 우리가 적용하고 싶은 메서드에 &lt;b&gt;메타데이터&lt;/b&gt;를 추가하는 역할을 합니다. 예를 들어, @Logging이라는 Annotation을 정의하여 메서드가 호출될 때마다 로그를 남기게 만들겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Logging Annotation 정의&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1733883866868&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 메서드에 적용할 수 있는 Annotation
@Retention(RetentionPolicy.RUNTIME)  // 런타임 동안 유지되도록 설정
@Target(ElementType.METHOD)          // 메서드에만 적용
public @interface Logging {
    String value() default &quot;&quot;;       // Annotation에 값을 설정할 수 있는 속성
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@Retention(RetentionPolicy.RUNTIME): 이 Annotation이 &lt;b&gt;런타임 동안 유지&lt;/b&gt;되도록 설정합니다. 이 설정 덕분에 Spring AOP가 Annotation을 읽을 수 있습니다.&lt;/li&gt;
&lt;li&gt;@Target(ElementType.METHOD): 이 Annotation이 &lt;b&gt;메서드에만 적용&lt;/b&gt;될 수 있도록 설정합니다.&lt;/li&gt;
&lt;li&gt;String value() default &quot;&quot;;: Annotation에 value라는 속성을 추가하여, 메서드에 대한 추가 정보를 저장할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정의된 @Logging Annotation은 특정 메서드에 적용되어, AOP에서 해당 메서드가 호출될 때마다 부가적인 동작을 실행할 수 있게 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. AOP에서 Custom Annotation 사용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 우리가 만든 @Logging Annotation을 활용해, &lt;b&gt;AOP Advice&lt;/b&gt;를 정의하여 메서드 실행 시 로그를 기록하도록 하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Aspect 클래스 정의&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1733883882268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

// @Aspect: AOP 기능을 제공하는 클래스임을 나타냄
// @Component: Spring Bean으로 등록
@Aspect
@Component
public class LoggingAspect {

    // @Before: 해당 메서드 실행 전에 로그를 남기기 위한 Advice
    @Before(&quot;@annotation(logging)&quot;)  // 메서드에 @Logging이 붙은 경우
    public void logBefore(JoinPoint joinPoint, Logging logging) {
        // 메서드 정보 출력
        System.out.println(&quot;Logging before method: &quot; + joinPoint.getSignature());
        
        // @Logging에서 설정한 value 속성 값 출력
        System.out.println(&quot;Annotation value: &quot; + logging.value());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 설명&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;@Aspect&lt;/b&gt;: 이 클래스가 AOP의 &lt;b&gt;Aspect&lt;/b&gt; 역할을 한다는 것을 나타냅니다. 이 클래스를 통해 AOP의 핵심 동작을 정의합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Component&lt;/b&gt;: 이 클래스를 Spring의 Bean으로 등록하여, Spring 컨텍스트에서 관리되도록 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;@Before(&quot;@annotation(logging)&quot;)&lt;/b&gt;: @Logging Annotation이 붙은 메서드가 호출될 때, 이 logBefore 메서드가 실행되도록 설정합니다. logging은 @Logging Annotation의 객체를 참조하는 변수로, logging.value()를 통해 Annotation의 속성값에 접근할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JoinPoint&lt;/b&gt;: JoinPoint는 AOP에서 메서드 실행 시점의 정보(메서드 시그니처, 메서드 파라미터 등)를 제공하는 객체입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정의된 LoggingAspect는 @Logging Annotation이 붙은 모든 메서드 실행 전에 자동으로 로그를 출력합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. @Logging Annotation 적용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 실제로 @Logging Annotation을 메서드에 적용하여, AOP가 어떻게 동작하는지 확인해보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;대상 클래스에서 @Logging 사용&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1733883894607&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.springframework.stereotype.Service;

@Service
public class MyService {

    // @Logging Annotation을 사용하여 로그를 남기고자 하는 메서드에 적용
    @Logging(&quot;This is a test log&quot;)  // value 속성에 값 전달
    public void myMethod() {
        System.out.println(&quot;Executing myMethod&quot;);
    }

    // 다른 메서드는 AOP 영향을 받지 않음
    public void anotherMethod() {
        System.out.println(&quot;Executing anotherMethod&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 myMethod가 실행될 때마다 @Logging Annotation의 value 속성 값이 로그로 남고, 해당 메서드 실행 전 logBefore 메서드가 실행됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 전체 흐름 정리&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Custom Annotation 정의&lt;/b&gt;: @Logging이라는 Annotation을 생성하여 메서드에 적용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AOP Aspect 정의&lt;/b&gt;: LoggingAspect 클래스를 작성하여, @Logging Annotation이 붙은 메서드 실행 시 자동으로 로그를 남기도록 설정.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Annotation 적용&lt;/b&gt;: MyService 클래스에서 메서드에 @Logging을 적용하여, 해당 메서드가 실행될 때마다 로그를 자동으로 기록.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring AOP는 &lt;b&gt;cross-cutting concerns&lt;/b&gt;(로깅, 보안, 트랜잭션 등)을 &lt;b&gt;핵심 비즈니스 로직과 분리&lt;/b&gt;하여 구현할 수 있도록 해줍니다. Custom Annotation을 활용하면, 원하는 동작을 특정 메서드에 적용할 수 있으며, 코드 중복을 줄이고 &lt;b&gt;유지보수성을 높이는 데 유용&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 **@Logging**이라는 Custom Annotation을 만들어, Spring AOP와 결합하여 메서드 실행 시 로그를 자동으로 기록하는 방법을 알아보았습니다. 이 방식은 &lt;b&gt;로깅&lt;/b&gt;, &lt;b&gt;트랜잭션 처리&lt;/b&gt;, &lt;b&gt;권한 체크&lt;/b&gt; 등 여러 가지 부가기능을 구현할 때 유용하게 사용될 수 있습니다.&lt;/p&gt;</description>
      <category>Programing/Spring</category>
      <category>annotation 만들어 사용하기</category>
      <category>annotation생성</category>
      <category>aop aspect</category>
      <category>ASPECT</category>
      <category>Spring</category>
      <category>Spring AOP</category>
      <category>어노테이션</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/448</guid>
      <comments>https://maketh.tistory.com/448#entry448comment</comments>
      <pubDate>Wed, 11 Dec 2024 11:25:27 +0900</pubDate>
    </item>
    <item>
      <title>대한민국 대통령 탄핵결의안 부결, 이후 정국은?</title>
      <link>https://maketh.tistory.com/447</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;2024년 12월 7일, 대한민국 정치의 중대한 분수령이 될 탄핵결의안이 부결되었습니다. 정치권과 국민들 사이에서 뜨거운 논란을 불러일으킨 이번 사안은 앞으로의 한국 정치와 사회에 큰 영향을 미칠 것으로 보입니다. 이번 글에서는 대통령의 예상되는 향후 행보와 정치적 미래를 전망해 보겠습니다.&lt;br&gt;&lt;br&gt;1. 대통령의 향후 행보&lt;br&gt;&lt;br&gt;탄핵결의안이 부결되었다는 것은 대통령이 법적, 제도적으로는 자신의 지위를 유지한다는 의미입니다. 그러나 국민적 신뢰와 정치적 정당성은 여전히 도전 과제일 수밖에 없습니다.&lt;br&gt;&lt;br&gt;(1) 강경한 국정 운영 가능성&lt;br&gt;부결 결과는 여당과 대통령에게 어느 정도의 승리를 의미합니다. 이로 인해 대통령이 &quot;탄핵 저지&quot;라는 성과를 바탕으로 강경한 국정 운영 기조를 이어갈 가능성이 큽니다. 특히, 탄핵 사유로 지적된 정책 실패나 도덕적 문제를 강하게 반박하며 기존 국정 과제를 밀어붙이는 모습을 보일 수 있습니다. 주요 공약 이행에 속도를 내거나, 야당을 비판하며 정치적 결속을 강화하려 할 것입니다.&lt;br&gt;&lt;br&gt;(2) 국민 통합 시도&lt;br&gt;반면, 탄핵 위기를 겪은 만큼 대통령이 정치적 생존과 역사적 평가를 염두에 두고 국민 통합에 힘쓰는 모습을 보일 가능성도 있습니다. &quot;분열된 국민을 하나로 묶겠다&quot;는 메시지를 던지며 화해 제스처를 취하거나, 중도층의 지지를 확보하기 위해 정책적 유연성을 보일 수도 있습니다. 이 과정에서 개각이나 인사 교체가 단행될 가능성도 있습니다.&lt;br&gt;&lt;br&gt;2. 정국의 변화와 예상 시나리오&lt;br&gt;&lt;br&gt;탄핵 부결 이후, 정치권과 사회에는 몇 가지 중요한 흐름이 나타날 것으로 보입니다.&lt;br&gt;&lt;br&gt;(1) 야당의 강경 투쟁&lt;br&gt;탄핵이 부결되었지만, 이는 야당과 반대 세력이 물러난다는 의미는 아닙니다. 오히려 야당은 &quot;부결은 국회 내 수적 열세 때문&quot;이라며 강력한 거리 투쟁이나 대중 동원을 시도할 가능성이 큽니다. 대규모 집회와 시위가 전국적으로 확산될 수 있으며, 내년 총선에 이를 정치적 에너지로 활용하려 할 것입니다.&lt;br&gt;&lt;br&gt;(2) 정치적 양극화 심화&lt;br&gt;탄핵을 둘러싼 논란은 이미 국민적 갈등을 심화시켰습니다. 부결 이후에도 대통령 지지층과 반대층 사이의 대립이 더욱 첨예해질 가능성이 높습니다. SNS와 미디어를 통한 여론전이 격화되면서 정치적 양극화는 점차 심화될 것입니다.&lt;br&gt;&lt;br&gt;(3) 국민의 피로감&lt;br&gt;지속적인 정쟁과 대립은 국민들에게 정치적 피로감을 안길 수 있습니다. 특히 경제 위기, 사회 불안 등 실질적 문제를 해결하지 못한 채 정치적 갈등만 지속된다면, 정부와 야당 모두에 대한 불신이 확산될 것입니다. 이는 제3지대 정치세력의 부상을 촉진할 가능성을 열어둡니다.&lt;br&gt;&lt;br&gt;3. 미래를 위한 제언&lt;br&gt;&lt;br&gt;탄핵 부결 이후 한국 사회는 새로운 전환점을 맞고 있습니다. 이러한 위기 속에서 정치권과 시민 모두가 장기적 관점에서 문제를 해결하려는 노력이 필요합니다.&lt;br&gt;&lt;br&gt;정치권의 책임 있는 자세: 대통령은 이번 사태를 계기로 자신의 정치적 한계를 성찰하고, 국민의 목소리에 귀를 기울여야 합니다. 동시에 야당은 합리적인 대안을 제시하며 국정에 건설적으로 참여해야 합니다.&lt;br&gt;국민의 냉철한 판단: 시민들은 정치적 대립의 소모적 측면을 경계하고, 정책의 본질과 각 세력의 비전을 꼼꼼히 평가해야 합니다.&lt;br&gt;제도적 개선 논의: 이번 사태는 탄핵 제도의 한계와 정치적 안정성 확보의 중요성을 재조명했습니다. 여야는 탄핵 제도와 관련된 헌법 및 법률 개정을 논의할 필요가 있습니다.&lt;br&gt;결론&lt;br&gt;탄핵 부결은 단지 한 사건의 끝이 아니라 새로운 정치적 논쟁의 시작점입니다. 대통령의 리더십과 정치권의 태도, 그리고 국민의 선택이 앞으로 한국의 미래를 결정지을 것입니다. 부결의 의미를 넘어 더 나은 미래를 만들기 위한 논의와 행동이 필요한 시점입니다.&lt;/p&gt;</description>
      <category>국민의힘</category>
      <category>부결</category>
      <category>비상계엄</category>
      <category>비상계엄령</category>
      <category>비상계엄선포</category>
      <category>윤석렬</category>
      <category>탄핵</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/447</guid>
      <comments>https://maketh.tistory.com/447#entry447comment</comments>
      <pubDate>Sat, 7 Dec 2024 22:18:32 +0900</pubDate>
    </item>
    <item>
      <title>대한민국 비상계엄 선포 시 알아야 할 사항: 행동 요령과 변화</title>
      <link>https://maketh.tistory.com/446</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;비상계엄은 국가의 안보와 공공질서를 심각하게 위협하는 상황에서 정부가 국가의 통치 능력을 강화하기 위해 헌법에 따라 선포하는 특별한 조치입니다. 대한민국 헌법 제77조에 따라 비상계엄은 군사적 상황 또는 치안 상황이 악화될 때 선포될 수 있습니다. 이런 상황에서 국민이 알아야 할 행동 요령과 달라지는 점을 정리했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 비상계엄이란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비상계엄은 두 가지 유형으로 나뉩니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;경비계엄&lt;/b&gt;: 비교적 낮은 수준의 계엄으로, 주로 치안 유지와 공공질서 보호를 목적으로 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비상계엄&lt;/b&gt;: 군사적 위협이나 대규모 반란 등으로 치안과 국가 안전이 심각하게 위협받을 때 선포되며, 군사적 권한이 강화됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 비상계엄 시 국민의 행동 요령&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;공식 발표 주의 깊게 청취&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정부와 계엄사령부의 공식 발표에 귀를 기울이고 정확한 정보를 파악하세요. 가짜 뉴스나 루머에 흔들리지 않도록 주의해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출입 통제 준수&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계엄령이 선포되면 특정 지역에 통행금지가 내려질 수 있습니다. 외출이 제한되거나 금지될 수 있으니, 해당 지침을 철저히 따르세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;불필요한 행동 자제&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 집회, 시위, 소셜미디어를 통한 불필요한 정보 공유 등을 자제하세요. 이는 계엄법에 따라 처벌받을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비상 물자 확보&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;식료품, 생수, 약품 등 최소한의 비상 물자를 준비하세요. 단, 사재기는 다른 사람들에게 피해를 줄 수 있으니 적정 수준으로 준비합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;군&amp;middot;경과의 마찰 회피&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;군대와 경찰이 치안 유지와 질서 관리를 위해 배치됩니다. 불필요한 충돌이나 논쟁을 피하고 지시에 협조하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 비상계엄 선포 시 달라지는 점&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;군대의 치안 유지 권한 확대&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;군대가 경찰의 역할을 대신하거나 보조할 수 있습니다. 이는 헌법상 허용된 권한으로, 군사적 치안 활동이 강화됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;헌법상 기본권 일부 제한&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;집회와 결사의 자유, 언론의 자유 등이 제한될 수 있습니다. 모든 발표나 출판물은 검열을 받을 수 있으며, 이는 공공질서를 유지하기 위한 조치입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;통행 제한 및 지역 봉쇄&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주요 도로와 도시, 특정 지역의 출입이 금지될 수 있습니다. 개인의 이동이 제한될 가능성이 높습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;재판소 기능 조정&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비상계엄 시 군사재판소가 설치될 수 있으며, 계엄 사령부가 주요 사법 권한을 행사할 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;경제 활동 및 금융 제한&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시장, 은행 등의 운영 시간이 단축되거나 제한될 수 있습니다. 또한, 특정 물자의 거래가 금지되거나 배급제가 시행될 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 비상계엄이 끝난 후&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비상계엄이 해제되면 모든 통제 조치는 해제되며, 헌법상 기본권이 회복됩니다. 이 과정에서 국민의 협조와 질서 유지는 국가 안정을 빠르게 회복하는 데 중요한 역할을 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;마무리하며&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비상계엄은 헌법에 근거한 국가의 비상 조치이지만, 국민 입장에서는 불안감을 초래할 수 있습니다. 그러나 침착하게 상황에 대응하고 정부의 지침에 협력하는 것이 가장 중요합니다. 무엇보다도 정확한 정보에 기반하여 현명하게 행동하는 것이 여러분과 사회 전체의 안전을 지키는 길입니다.&lt;/p&gt;</description>
      <category>잡다한지식</category>
      <category>비상계엄</category>
      <category>비상계엄령</category>
      <category>비상계엄선포</category>
      <category>윤대통령</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/446</guid>
      <comments>https://maketh.tistory.com/446#entry446comment</comments>
      <pubDate>Tue, 3 Dec 2024 22:50:43 +0900</pubDate>
    </item>
    <item>
      <title>더 빠르게 실패하기: 빠른 실패가 빠른 성공을 만든다</title>
      <link>https://maketh.tistory.com/445</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저자: 존 크럼볼츠, 라이언 바비노 / 옮긴이: 최현성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-12-01-21-40-29 001.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PFwfj/btsK2CNBnzd/4rVDFWC3ciNus0BXXrgFGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PFwfj/btsK2CNBnzd/4rVDFWC3ciNus0BXXrgFGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PFwfj/btsK2CNBnzd/4rVDFWC3ciNus0BXXrgFGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPFwfj%2FbtsK2CNBnzd%2F4rVDFWC3ciNus0BXXrgFGk%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;439&quot; height=&quot;585&quot; data-filename=&quot;KakaoTalk_Photo_2024-12-01-21-40-29 001.jpeg&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2024-12-01-21-40-29 002.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1081&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrhZC/btsK3sKhsho/JjKSCOeNURD61WexHikuNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrhZC/btsK3sKhsho/JjKSCOeNURD61WexHikuNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrhZC/btsK3sKhsho/JjKSCOeNURD61WexHikuNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrhZC%2FbtsK3sKhsho%2FJjKSCOeNURD61WexHikuNk%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;436&quot; height=&quot;327&quot; data-filename=&quot;KakaoTalk_Photo_2024-12-01-21-40-29 002.jpeg&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1081&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3102.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dV8L40/btsK3PrItiu/rK0BAjVQz6pWk9cqdCuY61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dV8L40/btsK3PrItiu/rK0BAjVQz6pWk9cqdCuY61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dV8L40/btsK3PrItiu/rK0BAjVQz6pWk9cqdCuY61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdV8L40%2FbtsK3PrItiu%2FrK0BAjVQz6pWk9cqdCuY61%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;443&quot; height=&quot;591&quot; data-filename=&quot;IMG_3102.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3103.jpeg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OFomA/btsK4vfgdSg/47Tst8dIhBIp2o3afmk8O1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OFomA/btsK4vfgdSg/47Tst8dIhBIp2o3afmk8O1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OFomA/btsK4vfgdSg/47Tst8dIhBIp2o3afmk8O1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOFomA%2FbtsK4vfgdSg%2F47Tst8dIhBIp2o3afmk8O1%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;440&quot; height=&quot;587&quot; data-filename=&quot;IMG_3103.jpeg&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세상은 성공을 찬양합니다. 우리는 성공한 사람들의 이야기를 듣고 그들의 길을 따르려 노력하죠. 그런데 *&quot;더 빠르게 실패하기&quot;*는 전혀 다른 이야기를 전합니다. 저자인 존 크럼볼츠와 라이언 바비노는 이 책에서 &amp;ldquo;성공하려면 실패하라, 그리고 그것도 빠르게 하라&amp;rdquo;고 외칩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실행의 힘: 실패를 두려워하지 않는 자세&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책은 계획보다 실행을 강조합니다. 많은 사람들이 완벽한 계획을 세운 뒤에야 행동으로 옮기려 합니다. 그러나 저자들은 이를 성공으로 가는 길을 오히려 늦추는 요소로 봅니다. 완벽한 계획은 존재하지 않으며, 계획은 실행을 통해 점점 나아져야 한다는 것이 그들의 핵심 메시지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 실패하면 빠르게 교훈을 얻을 수 있고, 그 교훈을 통해 다음 단계를 개선할 수 있습니다. 이 과정을 반복하는 것이 성공의 지름길이라는 것이죠.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;구체적인 사례와 실용적인 조언&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책은 단순히 이론에 머물지 않고, 실패를 성공의 발판으로 삼은 다양한 사례를 제공합니다. 기업가, 예술가, 운동선수 등 다양한 인물들의 이야기를 통해, 실패의 순간이 어떻게 성장을 위한 중요한 도약점이 될 수 있었는지 설명합니다. 또한, 실패를 긍정적으로 받아들이는 데 필요한 마음가짐과 실용적인 방법을 제시해 독자가 이를 실생활에 적용할 수 있도록 돕습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 '빠르게 실패하기'인가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 슬로건은 단순한 실패의 미화를 넘어서 실행력을 강조합니다. 누구나 실패는 두렵습니다. 하지만 실패를 통해 배우는 경험과 교훈은 성공으로 가는 필수적인 요소입니다. 빠르게 실패한다는 것은 단순히 '많이 실패하라'는 것이 아니라, '실행 속도를 높이고, 배움을 얻으며, 끊임없이 수정해나가라'는 의미입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;번역의 매끄러움과 최현성의 기여&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최현성 옮긴이는 책의 메시지를 한국 독자들에게 친근하게 전달합니다. 책을 읽으며 느낄 수 있는 매끄러운 번역과 구체적인 사례 설명은 이 책의 가치를 더욱 높여줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;당신의 성공은 실행에서 시작된다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*&amp;ldquo;더 빠르게 실패하기&amp;rdquo;*는 완벽주의에서 벗어나 실행 중심의 사고방식을 갖도록 독려합니다. 이 책은 실패를 두려워하는 모든 이들에게 강력한 용기를 줄 뿐만 아니라, 실패를 통해 얻는 배움이 어떻게 우리를 더 나은 성공으로 이끄는지를 생생하게 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 성공하고 싶다면, 빠르게 실패하세요. 실패는 끝이 아니라, 새로운 시작입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추천 독자&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 도전을 앞둔 사람&lt;/li&gt;
&lt;li&gt;실패를 두려워하거나 완벽주의에 갇힌 사람&lt;/li&gt;
&lt;li&gt;성공으로 가는 효과적인 방법을 고민하는 사람&lt;/li&gt;
&lt;/ul&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;</description>
      <category>리뷰/Book</category>
      <category>더 빠르게 실패하기</category>
      <category>도전하는 길</category>
      <category>성공하는사람들의실패</category>
      <category>실패방법</category>
      <category>실행력</category>
      <category>실행만이성공</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/445</guid>
      <comments>https://maketh.tistory.com/445#entry445comment</comments>
      <pubDate>Sun, 1 Dec 2024 21:41:42 +0900</pubDate>
    </item>
    <item>
      <title>Java에서 두 날짜 배열 비교하기: 정답과 올바른 구현 방법</title>
      <link>https://maketh.tistory.com/444</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 두 개의 int 배열을 받아서 배열이 나타내는 날짜를 비교하는 방법을 다룹니다. 두 배열은 [year, month, day] 형태로 구성되어 있으며, 첫 번째 배열이 두 번째 배열보다 앞선 날짜일 경우 1을 반환하고, 그렇지 않으면 0을 반환하는 메서드를 작성해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;질문과 예시를 통해 먼저 문제를 정의한 다음, 잘못된 접근 방식과 이를 수정한 올바른 접근 방식을 설명하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;질문: 두 날짜 비교하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서 다음과 같은 두 날짜 배열을 비교하는 메서드를 작성하고자 합니다. 조건은 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열 arr1이 배열 arr2보다 앞선 날짜라면 1을 반환하고, 그렇지 않으면 0을 반환합니다.&lt;/li&gt;
&lt;li&gt;단, if문만을 사용해서 비교해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시&lt;/h4&gt;
&lt;pre id=&quot;code_1730359905902&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr1 = {2023, 11, 28};
int[] arr2 = {2023, 11, 29};
System.out.println(compareDates(arr1, arr2)); // 출력: 1&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정답: 두 날짜 배열을 비교하는 코드&lt;/h4&gt;
&lt;pre id=&quot;code_1730359943101&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class DateCompare {
    public static int compareDates(int[] arr1, int[] arr2) {
        // 연도 비교
        if (arr1[0] &amp;lt; arr2[0]) {
            return 1;
        } else if (arr1[0] &amp;gt; arr2[0]) {
            return 0;
        }
        
        // 월 비교
        if (arr1[1] &amp;lt; arr2[1]) {
            return 1;
        } else if (arr1[1] &amp;gt; arr2[1]) {
            return 0;
        }
        
        // 일 비교
        if (arr1[2] &amp;lt; arr2[2]) {
            return 1;
        } else {
            return 0;
        }
    }

    public static void main(String[] args) {
        int[] date1 = {2023, 10, 31};
        int[] date2 = {2023, 11, 1};

        System.out.println(compareDates(date1, date2)); // 출력: 1
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서는 arr1과 arr2의 연도, 월, 일을 순차적으로 비교합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;연도 비교&lt;/b&gt;: arr1[0]이 arr2[0]보다 작으면 arr1이 더 이른 날짜이므로 1을 반환합니다. 크면 0을 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;월 비교&lt;/b&gt;: 연도가 같을 때만 월을 비교합니다. arr1[1]이 arr2[1]보다 작으면 1을, 크면 0을 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일 비교&lt;/b&gt;: 연도와 월이 같은 경우, 일자를 비교하여 arr1[2]가 arr2[2]보다 작으면 1, 크거나 같으면 0을 반환합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서는 입력된 두 날짜 배열을 순차적으로 비교하며 조건에 맞게 if문만 사용하여 작동합니다.&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;pre id=&quot;code_1730359967612&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (arr1[0] &amp;lt; arr2[0]) {
    return 1;
} else if (arr1[1] &amp;lt; arr2[1]) {
    return 1;
} else if (arr1[2] &amp;lt; arr2[2]) {
    return 1;
} else {
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 연도 &amp;rarr; 월 &amp;rarr; 일의 순서를 확인하지 않고 각 조건을 독립적으로 비교합니다. 이 접근 방식의 문제점은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;순차적 비교가 누락됨&lt;/b&gt;: else if 구문을 통해 arr1[1] &amp;lt; arr2[1] 또는 arr1[2] &amp;lt; arr2[2]을 확인하게 되면, 연도나 월이 같지 않아도 일(day) 조건을 비교할 수 있습니다. 예를 들어, 연도가 다르거나 월이 다를 때, 잘못된 결과가 반환될 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;잘못된 조건 흐름&lt;/b&gt;: 연도, 월, 일의 비교는 각각이 독립적이 아니라 순차적으로 연결되어 있어야 합니다. 그렇지 않으면 연도와 월이 같은지를 확인하기 전에 일을 비교할 가능성이 생깁니다.&lt;/li&gt;
&lt;/ol&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;pre id=&quot;code_1730359991576&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr1 = {2023, 10, 31};
int[] arr2 = {2023, 11, 1};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 arr1은 arr2보다 앞선 날짜이므로 올바른 결과는 1입니다. 그러나 잘못된 코드에서는 arr1[0] == arr2[0] (연도가 같음)을 확인하지 않은 상태에서 arr1[1] &amp;lt; arr2[1] 조건을 독립적으로 비교합니다. 이로 인해 잘못된 조건 흐름이 발생하고, 1을 반환하게 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;</description>
      <category>Programing/JAVA</category>
      <category>if-else if 독립비교</category>
      <category>java</category>
      <category>날짜비교</category>
      <category>독립비교</category>
      <category>배열비교</category>
      <category>순차적비교</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/444</guid>
      <comments>https://maketh.tistory.com/444#entry444comment</comments>
      <pubDate>Thu, 31 Oct 2024 16:34:46 +0900</pubDate>
    </item>
    <item>
      <title>Java의 Arrays.stream(), map(), toArray()를 이용한 배열 처리 방법</title>
      <link>https://maketh.tistory.com/443</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서는 배열을 다루는 다양한 방법이 있으며, 그중에서도 스트림(Stream)을 사용하면 배열 요소들을 간편하게 변환하거나 필터링할 수 있습니다. 이번 글에서는 Arrays.stream(), map(), toArray() 등의 메서드를 활용하여 배열을 처리하는 방법을 설명하고, 이를 기반으로 간단한 예제를 만들어보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Arrays.stream() 메서드란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arrays.stream()은 Java 8부터 추가된 스트림(Stream) API의 일부로, 배열을 스트림 형태로 변환하여 다양한 처리를 할 수 있게 해줍니다. 스트림은 배열이나 컬렉션의 요소를 함수형 프로그래밍 방식으로 처리할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1729734274513&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3, 4, 5};
Arrays.stream(arr).forEach(System.out::println);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 Arrays.stream(arr)을 통해 배열 arr의 각 요소를 스트림으로 변환하고, forEach() 메서드를 사용하여 각 요소를 출력합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. map() 메서드란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트림의 map() 메서드는 각 요소를 주어진 함수에 따라 변환하여 새로운 스트림을 생성하는 데 사용됩니다. 예를 들어, 배열의 각 요소에 특정 값을 더하거나 곱하는 연산을 손쉽게 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 문법&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1729734290916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Stream&amp;lt;T&amp;gt; map(Function&amp;lt;? super T, ? extends R&amp;gt; mapper)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 함수는 입력값 T를 다른 타입 R으로 변환하는 작업을 합니다. 배열의 각 요소를 변환할 때 주로 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1729734309803&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3};
int k = 2;
int[] result = Arrays.stream(arr)
    .map(operand -&amp;gt; operand * k)  // 각 요소에 k를 곱한다
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서는 배열 arr의 각 요소에 k(여기서는 2)를 곱한 값을 새로운 배열로 변환한 후, toArray() 메서드를 사용해 배열로 다시 변환합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. toArray() 메서드란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트림 연산의 결과를 다시 배열로 변환하고 싶을 때는 toArray() 메서드를 사용합니다. 이 메서드는 스트림의 요소를 배열로 변환해 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 문법&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1729734327561&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;T[] toArray()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;toArray()는 스트림에서 처리한 결과를 배열로 바꿔줍니다. 스트림으로 작업한 데이터를 다시 배열로 반환할 때 매우 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1729734343237&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3};
int[] result = Arrays.stream(arr)
    .map(operand -&amp;gt; operand + 1)  // 각 요소에 1을 더한다
    .toArray();                   // 결과를 배열로 변환&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 실전 예제: k 값에 따른 배열 요소 변환&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 위에서 설명한 Arrays.stream(), map(), toArray()를 모두 활용한 예제를 살펴보겠습니다. 배열의 각 요소를 주어진 값 k에 따라 변환하는 함수를 구현해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열의 각 요소를 k의 값에 따라 변환합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k가 짝수일 때는 각 요소에 k를 더하고,&lt;/li&gt;
&lt;li&gt;k가 홀수일 때는 각 요소에 k를 곱합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드 구현&lt;/b&gt;:&lt;/p&gt;
&lt;pre id=&quot;code_1729734371904&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int[] solution(int[] arr, int k) {
    return Arrays.stream(arr)
        .map(operand -&amp;gt; k % 2 == 0 ? operand + k : operand * k)
        .toArray();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;코드 설명&lt;/b&gt;:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Arrays.stream(arr)을 통해 배열을 스트림으로 변환합니다.&lt;/li&gt;
&lt;li&gt;map()을 이용해 배열의 각 요소 operand에 대해 변환 작업을 수행합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k가 짝수일 경우 (k % 2 == 0)에는 각 요소에 k를 더하고,&lt;/li&gt;
&lt;li&gt;k가 홀수일 경우에는 각 요소에 k를 곱합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;변환된 결과를 toArray()로 배열로 다시 반환합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실행 예시&lt;/b&gt;:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력: arr = [1, 2, 3], k = 4
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k가 짝수이므로 배열의 각 요소에 k를 더하여 [5, 6, 7]이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;입력: arr = [1, 2, 3], k = 3
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;k가 홀수이므로 배열의 각 요소에 k를 곱하여 [3, 6, 9]이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 연산자&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 중간 연산 (Intermediate Operations)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중간 연산은 스트림에서 변환 작업을 수행하며, 여러 개의 중간 연산을 연결해서 사용할 수 있습니다. 이 연산들은 스트림을 반환하며, 종료 연산이 호출될 때까지 실제로 수행되지 않습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1. filter()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞는 요소들만 걸러냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734533258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3, 4, 5};
int[] result = Arrays.stream(arr)
    .filter(n -&amp;gt; n % 2 == 0)  // 짝수만 걸러냄
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2. distinct()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복된 요소를 제거합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734553291&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 2, 3, 3, 3, 4};
int[] result = Arrays.stream(arr)
    .distinct()  // 중복 제거
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3. sorted()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 요소를 정렬합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734579947&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {5, 3, 1, 4, 2};
int[] result = Arrays.stream(arr)
    .sorted()  // 오름차순 정렬
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.4. limit()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 요소 중 상위 몇 개만 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734598286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3, 4, 5};
int[] result = Arrays.stream(arr)
    .limit(3)  // 처음 3개 요소만 선택
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.5. skip()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 앞부분에서 지정한 개수만큼의 요소를 건너뜁니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734618951&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3, 4, 5};
int[] result = Arrays.stream(arr)
    .skip(2)  // 처음 2개 요소를 건너뜀
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.6. peek()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 각 요소에 대해 추가 작업을 수행합니다. 주로 디버깅이나 로깅에 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734633705&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Arrays.stream(arr)
    .peek(n -&amp;gt; System.out.println(n))  // 요소 출력 (연산 사이에 사용)
    .toArray();&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 종료 연산 (Terminal Operations)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종료 연산은 스트림의 처리를 끝내고 결과를 반환하는 연산입니다. 종료 연산은 스트림을 소비하여 실행됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1. forEach()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 요소에 대해 주어진 작업을 수행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734763903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3};
Arrays.stream(arr).forEach(System.out::println);  // 각 요소 출력&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2. reduce()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 모든 요소를 하나의 결과로 합칩니다. 축약(reduce) 작업에 주로 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734780183&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] arr = {1, 2, 3, 4, 5};
int sum = Arrays.stream(arr)
    .reduce(0, Integer::sum);  // 모든 요소의 합 계산&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.3. collect()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 요소를 List, Set, Map과 같은 컬렉션으로 변환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734800775&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;Integer&amp;gt; list = Arrays.stream(arr)
    .boxed()  // 기본형 int를 Integer로 변환
    .collect(Collectors.toList());  // List로 변환&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.4. count()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 요소 개수를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734817275&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;long count = Arrays.stream(arr).count();  // 요소의 개수 반환&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.5. anyMatch(), allMatch(), noneMatch()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림의 요소 중 조건에 맞는 요소가 있는지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734832921&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean anyEven = Arrays.stream(arr).anyMatch(n -&amp;gt; n % 2 == 0);  // 짝수가 있는지 확인&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.6. findFirst(), findAny()&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스트림에서 첫 번째 요소 또는 아무 요소나 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1729734846281&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;OptionalInt first = Arrays.stream(arr).findFirst();  // 첫 번째 요소&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;중간 연산&lt;/b&gt;: map(), filter(), distinct(), sorted(), limit(), skip(), peek() 등이 있으며, 여러 중간 연산을 연결하여 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;종료 연산&lt;/b&gt;: forEach(), reduce(), collect(), count(), anyMatch(), findFirst() 등이 있으며, 스트림을 끝내고 결과를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Java의 스트림 API에서 자주 사용되는 Arrays.stream(), map(), toArray() 메서드를 활용하여 배열을 처리하는 방법을 살펴보았습니다. 이 메서드들을 조합하면 배열의 요소에 다양한 변환을 적용할 수 있어 매우 유용합니다. 이를 통해 코드를 더욱 간결하고 직관적으로 작성할 수 있으며, 함수형 프로그래밍의 장점을 충분히 활용할 수 있습니다.&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;</description>
      <category>Programing/JAVA</category>
      <category>API</category>
      <category>array</category>
      <category>arrays.stream()</category>
      <category>map()</category>
      <category>stream</category>
      <category>toArray</category>
      <category>배열변환</category>
      <category>배열연산</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/443</guid>
      <comments>https://maketh.tistory.com/443#entry443comment</comments>
      <pubDate>Thu, 24 Oct 2024 10:47:28 +0900</pubDate>
    </item>
    <item>
      <title>URL 예약어와 URL 인코딩: 웹 개발자를 위한 필수 가이드</title>
      <link>https://maketh.tistory.com/442</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발을 하다 보면 URL 예약어와 URL 인코딩에 대한 이해는 필수적입니다. 이 글에서는 URL 예약어의 정의와 그 역할, URL 인코딩이 필요한 이유와 그 방법에 대해 예제를 통해 자세히 설명하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URL 예약어란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL(Uniform Resource Locator)은 웹 주소를 나타내는 문자열입니다. 이 문자열은 특정 규칙에 따라 구조화되며, 그 안에는 프로토콜, 도메인 이름, 경로, 쿼리 파라미터 등이 포함됩니다. 이러한 URL의 구조를 구성하는 데 사용되는 몇 가지 특수 문자들이 있는데, 이를 URL 예약어(Reserved Characters)라고 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 URL 예약어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;: (콜론)&lt;/b&gt;: 프로토콜과 호스트를 구분하는 데 사용됩니다. 예: https://&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/ (슬래시)&lt;/b&gt;: 경로를 구분하는 데 사용됩니다. 예: /path/to/resource&lt;/li&gt;
&lt;li&gt;&lt;b&gt;? (물음표)&lt;/b&gt;: 쿼리 문자열의 시작을 나타냅니다. 예: ?query=example&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&amp;amp; (앰퍼샌드)&lt;/b&gt;: 쿼리 파라미터를 연결하는 데 사용됩니다. 예: ?param1=value1&amp;amp;param2=value2&lt;/li&gt;
&lt;li&gt;&lt;b&gt;# (샵)&lt;/b&gt;: 프래그먼트를 나타내는 데 사용됩니다. 예: #section&lt;/li&gt;
&lt;li&gt;&lt;b&gt;= (등호)&lt;/b&gt;: 쿼리 파라미터의 키와 값을 구분하는 데 사용됩니다. 예: key=value&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URL 인코딩이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 인코딩은 URL에서 허용되지 않거나 특수한 의미를 가지는 문자(예: 공백, 한글, 특수 문자 등)를 안전하게 표현하기 위해 이들을 % 기호와 두 자리의 16진수 코드로 변환하는 과정입니다. 이 인코딩 방식은 모든 문자를 URL에서 안전하게 사용할 수 있도록 보장합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;URL 인코딩의 필요성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL에 포함될 수 없는 문자나 예약어가 값의 일부로 포함될 경우, 이들을 제대로 인식할 수 있도록 인코딩해야 합니다. 예를 들어, 공백 문자는 URL에서 허용되지 않으므로 %20으로 인코딩됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;URL 인코딩 예제&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;공백( ) &amp;rarr; %20&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한글(가) &amp;rarr; %EA%B0%80&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특수문자(@) &amp;rarr; %40&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제: URL 예약어와 인코딩 적용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상의 검색 기능을 예로 들어 보겠습니다. 사용자가 다음과 같은 검색어를 입력한다고 가정해봅시다: &quot;URL 예약어와 인코딩 예제&quot;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 검색어를 URL에 포함하려면 다음과 같이 인코딩해야 합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1724292288207&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;검색어: URL 예약어와 인코딩 예제
인코딩 전: https://www.example.com/search?q=URL 예약어와 인코딩 예제
인코딩 후: https://www.example.com/search?q=URL%20%EC%98%88%EC%A0%9C&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 보듯이, 공백은 %20으로 인코딩되고, 한글 &quot;예제&quot;는 %EC%98%88%EC%A0%9C로 인코딩되었습니다. 이 과정이 없다면, 브라우저나 서버는 이 URL을 제대로 처리하지 못할 가능성이 큽니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;URL 인코딩을 수행하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 인코딩은 대부분의 프로그래밍 언어와 웹 프레임워크에서 지원합니다. 다음은 JavaScript에서 URL 인코딩을 수행하는 방법입니다:&lt;/p&gt;
&lt;pre id=&quot;code_1724292303401&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const original = &quot;URL 예약어와 인코딩 예제&quot;;
const encoded = encodeURIComponent(original);
console.log(encoded); // &quot;URL%20%EC%98%88%EC%A0%9C&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예제에서 encodeURIComponent 함수는 문자열을 URL에서 안전하게 사용할 수 있도록 인코딩해줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 예약어와 URL 인코딩은 웹 개발에서 중요한 개념입니다. 예약어를 올바르게 이해하고 URL 인코딩을 적절하게 사용하면, 웹 애플리케이션의 URL을 안전하고 신뢰성 있게 처리할 수 있습니다. 다음 번에 URL을 작성하거나 파싱할 때 이 가이드를 참고하여 올바른 인코딩을 적용해보세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programing/JAVA</category>
      <category>URL</category>
      <category>예약어</category>
      <category>인코딩</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/442</guid>
      <comments>https://maketh.tistory.com/442#entry442comment</comments>
      <pubDate>Thu, 22 Aug 2024 11:05:27 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ로 생성한 프로젝트를 GitHub에 Push하는 방법</title>
      <link>https://maketh.tistory.com/441</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ IDEA는 Java 개발자에게 가장 인기 있는 IDE 중 하나로, 강력한 기능을 갖추고 있습니다. 이 포스팅에서는 IntelliJ로 프로젝트를 생성한 후, GitHub에 새 repository를 생성하고 코드를 Push하는 방법을 단계별로 설명하겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Git 초기화 및 GitHub Repository 연동&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, IntelliJ에서 프로젝트를 Git으로 관리할 수 있도록 설정하고, GitHub의 원격 저장소와 연동하는 작업을 진행하겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1. Git 초기화&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;IntelliJ에서 프로젝트를 엽니다.&lt;/li&gt;
&lt;li&gt;상단 메뉴에서 VCS (Version Control) &amp;gt; Enable Version Control Integration을 선택합니다.&lt;/li&gt;
&lt;li&gt;팝업창이 뜨면 Git을 선택하고 OK 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면, IntelliJ에서 프로젝트 디렉토리가 Git으로 관리되기 시작합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2. 로컬 커밋&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Git 초기화 후, 프로젝트 파일들이 Git에 추가되었는지 확인합니다.&lt;/li&gt;
&lt;li&gt;상단 메뉴에서 VCS &amp;gt; Commit...을 선택하여 첫 커밋을 생성합니다.&lt;/li&gt;
&lt;li&gt;커밋 창에서 변경된 파일 목록을 확인한 후, 커밋 메시지를 작성합니다.&lt;/li&gt;
&lt;li&gt;모든 준비가 완료되면 Commit 버튼을 클릭하여 커밋을 완료합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.3. GitHub Repository 연결&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GitHub에 접속하여 새 repository를 생성합니다.&lt;/li&gt;
&lt;li&gt;IntelliJ에서 상단 메뉴의 VCS &amp;gt; Git &amp;gt; Remotes...를 선택합니다.&lt;/li&gt;
&lt;li&gt;팝업창에서 + 버튼을 클릭하여 새 원격 저장소를 추가합니다.&lt;/li&gt;
&lt;li&gt;GitHub에서 생성한 repository URL을 입력하고 OK를 클릭합니다.
&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://github.com/username/repository.git&quot;&gt;https://github.com/username/repository.git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 로컬 프로젝트와 GitHub 원격 저장소가 연동되었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. GitHub에 코드 Push&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 로컬에서 작성한 코드를 GitHub에 Push해 보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.1. Push&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상단 메뉴에서 VCS &amp;gt; Git &amp;gt; Push...를 선택합니다.&lt;/li&gt;
&lt;li&gt;Push할 브랜치를 선택한 후 Push 버튼을 클릭합니다.&lt;/li&gt;
&lt;li&gt;이 과정에서 IntelliJ는 로컬 브랜치의 변경 사항을 원격 저장소에 반영합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2.2. GitHub에서 확인&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Push가 완료되면, GitHub에서 repository 페이지를 열어 코드를 확인할 수 있습니다. 모든 파일이 정상적으로 업로드되었는지 확인하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. (선택 사항) 터미널에서 Git 명령어 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ 내의 터미널을 이용하여 직접 Git 명령어를 입력하는 방법도 있습니다. Git 명령어를 직접 입력하면 보다 세밀하게 작업을 제어할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.1. 터미널 열기&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상단 메뉴에서 View &amp;gt; Tool Windows &amp;gt; Terminal을 선택하여 터미널을 엽니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3.2. Git 명령어 입력&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 아래 명령어를 순서대로 입력하여 GitHub에 프로젝트를 Push할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1723734442219&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git init  # Git 초기화 (이미 초기화 했다면 생략)
git add .  # 모든 파일을 스테이징
git commit -m &quot;Initial commit&quot;  # 첫 커밋 생성
git remote add origin https://github.com/username/repository.git  # 원격 저장소 추가
git branch -M main  # 기본 브랜치를 main으로 설정
git push -u origin main  # main 브랜치에 코드 Push&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;size16&quot;&gt;이제 IntelliJ에서 만든 프로젝트를 성공적으로 GitHub에 업로드할 수 있습니다. IntelliJ의 직관적인 UI와 GitHub의 강력한 버전 관리 기능을 활용하면, 개발 작업을 보다 효율적으로 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>commit</category>
      <category>GIT</category>
      <category>github</category>
      <category>Intellij</category>
      <category>intellij에서git사용</category>
      <category>push</category>
      <category>연동</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/441</guid>
      <comments>https://maketh.tistory.com/441#entry441comment</comments>
      <pubDate>Fri, 16 Aug 2024 00:08:33 +0900</pubDate>
    </item>
    <item>
      <title>맥북사용중 저장하는 것</title>
      <link>https://maketh.tistory.com/440</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 맥북 터미널에서 어플리케이션 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt; Homebrew 이용&lt;/p&gt;
&lt;pre id=&quot;code_1720533639652&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew search jmeter
brew install jmeter
brew list jmeter

jmeter 실행
open /opt/homebrew/bin/Jmeter&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>잡다한지식</category>
      <category>BREW</category>
      <category>Homebrew</category>
      <category>JMeter</category>
      <category>맥북</category>
      <category>터미널설치</category>
      <category>터미널에서 어플설치</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/440</guid>
      <comments>https://maketh.tistory.com/440#entry440comment</comments>
      <pubDate>Tue, 9 Jul 2024 23:02:20 +0900</pubDate>
    </item>
    <item>
      <title>Java Spring Boot를 사용하여 Slack으로 메시지 보내기</title>
      <link>https://maketh.tistory.com/439</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;요즘 Slack을 이용하는 사람들이 점점 늘어나고 있습니다. 이는 Slack이 팀 커뮤니케이션 및 협업을 위한 강력한 도구를 제공하기 때문입니다. Slack은 실시간 메시징, 파일 공유, 통합 API를 통한 다양한 기능 제공 등으로 많은 장점을 가지고 있습니다. 그러나 설정 및 API 사용에 익숙하지 않은 사용자에게는 초기 설정이 어려울 수 있습니다. 이 블로그 글에서는 Java Spring Boot를 사용하여 Slack으로 메시지를 보내는 방법을 단계별로 설명하겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Slack의 장단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;실시간 커뮤니케이션:&lt;/b&gt; 팀원 간 실시간 메시지 전송 및 확인이 가능합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;파일 공유:&lt;/b&gt; 간편한 파일 공유 기능을 제공합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다양한 통합:&lt;/b&gt; 수많은 서드파티 애플리케이션과 쉽게 통합할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;검색 기능:&lt;/b&gt; 과거 대화 및 파일을 쉽게 검색할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;비용:&lt;/b&gt; 무료 플랜은 제한적이며, 모든 기능을 사용하려면 유료 플랜이 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;복잡성:&lt;/b&gt; 다양한 기능이 있어 초보자가 익히기 어렵습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제 코드: Spring Boot로 Slack 메시지 보내기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로젝트 설정&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Spring Boot 프로젝트 생성:&lt;/b&gt; Spring Initializr를 사용하여 새로운 Spring Boot 프로젝트를 생성합니다. 필요한 종속성은 Spring Web과 Lombok입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Gradle 설정:&lt;/b&gt; build.gradle 파일에 필요한 종속성을 추가합니다.
&lt;pre id=&quot;code_1720361196754&quot; class=&quot;clean&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.slack.api:slack-api-client:1.7.0'
    implementation 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;application.properties 파일 설정:&lt;/b&gt; Slack Bot Token과 채널 ID를 설정 파일에 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1720361224518&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;slack.token=xoxb-your-slack-bot-token
slack.channel=CXXXXX  # 채널 ID&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;★ slack.token 은 아래 bot 의 Oauth&amp;amp;Permissions 에서 확인가능&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;692&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GXXWI/btsIpSZ7wew/GuUu1354UKAojuQ8yQNxe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GXXWI/btsIpSZ7wew/GuUu1354UKAojuQ8yQNxe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GXXWI/btsIpSZ7wew/GuUu1354UKAojuQ8yQNxe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGXXWI%2FbtsIpSZ7wew%2FGuUu1354UKAojuQ8yQNxe1%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;692&quot; height=&quot;670&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Slack API 설정&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Slack 앱 생성 및 권한 설정:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a&gt;Slack API Apps&lt;/a&gt; 페이지로 이동하여 새로운 앱을 생성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OAuth &amp;amp; Permissions&lt;/b&gt; 섹션에서 &lt;b&gt;Scopes&lt;/b&gt; 설정을 추가합니다. chat:write, channels:read, groups:read, im:read, mpim:read 권한을 추가합니다.&lt;/li&gt;
&lt;li&gt;권한을 추가한 후, &lt;b&gt;Install App&lt;/b&gt; 또는 &lt;b&gt;Reinstall App&lt;/b&gt; 버튼을 클릭하여 변경된 권한을 적용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;봇을 채널에 초대:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;슬랙 웹 클라이언트에 로그인합니다.&lt;/li&gt;
&lt;li&gt;봇을 초대하려는 채널로 이동합니다.&lt;/li&gt;
&lt;li&gt;채널 메시지 입력 창에 /invite @your-bot-name 명령을 입력하여 봇을 채널에 초대합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Spring Boot 코드 작성&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;SlackService 클래스 작성:&lt;/b&gt;
&lt;pre id=&quot;code_1720361262600&quot; class=&quot;kotlin&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;package com.example.slackdemo.service;

import com.slack.api.Slack;
import com.slack.api.methods.SlackApiException;
import com.slack.api.methods.request.chat.ChatPostMessageRequest;
import com.slack.api.methods.response.chat.ChatPostMessageResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class SlackService {

    @Value(&quot;${slack.token}&quot;)
    private String slackToken;

    @Value(&quot;${slack.channel}&quot;)
    private String slackChannel;

    public void sendMessage(String message) throws IOException, SlackApiException {
        Slack slack = Slack.getInstance();
        ChatPostMessageRequest request = ChatPostMessageRequest.builder()
                .channel(slackChannel)
                .text(message)
                .build();

        ChatPostMessageResponse response = slack.methods(slackToken).chatPostMessage(request);

        if (!response.isOk()) {
            throw new RuntimeException(&quot;Error sending message to Slack: &quot; + response.getError());
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt; SlackController 클래스 작성: &lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1720361279293&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.example.slackdemo.controller;

import com.example.slackdemo.service.SlackService;
import com.slack.api.methods.SlackApiException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@RestController
public class SlackController {

    @Autowired
    private SlackService slackService;

    @GetMapping(&quot;/send-message&quot;)
    public String sendMessage(@RequestParam String message) {
        try {
            slackService.sendMessage(message);
            return &quot;Message sent successfully!&quot;;
        } catch (IOException | SlackApiException e) {
            return &quot;Error sending message: &quot; + e.getMessage();
        }
    }
}&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;Java Spring Boot를 사용하여 Slack으로 메시지를 보내는 방법을 알아보았습니다. Slack API 설정 및 권한 추가, 봇을 채널에 초대하는 과정 등을 통해 메시지를 성공적으로 전송할 수 있습니다. 이를 통해 팀의 커뮤니케이션을 자동화하고 효율성을 높일 수 있습니다. 슬랙 API를 활용하여 더 많은 기능을 구현해 보세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는, 실제로 메시지를 전송 한 결과입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MgsAq/btsIqeaEfU5/JeSFBKFWDKJPXqmyzGXL71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MgsAq/btsIqeaEfU5/JeSFBKFWDKJPXqmyzGXL71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MgsAq/btsIqeaEfU5/JeSFBKFWDKJPXqmyzGXL71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMgsAq%2FbtsIqeaEfU5%2FJeSFBKFWDKJPXqmyzGXL71%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;286&quot; height=&quot;48&quot; data-origin-width=&quot;286&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4BKCK/btsIqcw87wl/Keph2XQeLucZibagZFlQ20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4BKCK/btsIqcw87wl/Keph2XQeLucZibagZFlQ20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4BKCK/btsIqcw87wl/Keph2XQeLucZibagZFlQ20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4BKCK%2FbtsIqcw87wl%2FKeph2XQeLucZibagZFlQ20%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;450&quot; height=&quot;106&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;106&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;</description>
      <category>Programing/Spring</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/439</guid>
      <comments>https://maketh.tistory.com/439#entry439comment</comments>
      <pubDate>Sun, 7 Jul 2024 23:11:56 +0900</pubDate>
    </item>
    <item>
      <title>Java 애플리케이션을 데몬으로 실행하기: Apache Commons Daemon과 jsvc 사용법</title>
      <link>https://maketh.tistory.com/438</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java 애플리케이션을 백그라운드 서비스로 실행하고 싶으신가요? Apache Commons Daemon 라이브러리와 jsvc 도구를 사용하면 Java 애플리케이션을 시스템 서비스나 데몬으로 쉽게 실행할 수 있습니다. 이 글에서는 jsvc의 개념과 사용법을 자세히 설명합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Apache Commons Daemon이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache Commons Daemon은 Java 애플리케이션을 Unix-like 시스템에서 시스템 서비스 또는 데몬으로 실행할 수 있게 해주는 라이브러리입니다. 이를 통해 Java 애플리케이션을 시스템 부팅 시 자동으로 시작하거나 종료할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;jsvc란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsvc는 Apache Commons Daemon 프로젝트의 일부로 제공되는 도구입니다. jsvc는 Java 애플리케이션을 데몬으로 실행할 수 있게 해주며, root 권한으로 시작한 다음 권한을 낮추는 기능도 제공합니다. 이를 통해 보안성을 높일 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;jsvc의 주요 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 애플리케이션을 백그라운드 서비스로 실행&lt;/li&gt;
&lt;li&gt;권한 승격 후 권한 낮추기&lt;/li&gt;
&lt;li&gt;애플리케이션의 시작, 중지, 재시작 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;jsvc 설치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsvc는 Apache Commons Daemon 프로젝트의 일부로 제공되며, 소스 코드를 다운로드 받아 빌드할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Apache Commons Daemon 소스 코드 다운로드:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1719460525476&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;wget https://archive.apache.org/dist/commons/daemon/source/commons-daemon-1.2.4-src.tar.gz
tar xzf commons-daemon-1.2.4-src.tar.gz
cd commons-daemon-1.2.4-src/src/native/unix&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2. jsvc 빌드:&lt;/p&gt;
&lt;pre id=&quot;code_1719460546854&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;./configure
make
sudo cp jsvc /usr/bin&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Daemon 인터페이스 구현&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, Daemon 인터페이스를 구현하는 클래스를 작성합니다. 이 클래스는 데몬의 초기화, 시작, 중지, 종료 메서드를 포함합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1719460560123&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;

public class MyDaemon implements Daemon {

    @Override
    public void init(DaemonContext context) throws DaemonInitException, Exception {
        // 초기화 코드
        System.out.println(&quot;Daemon 초기화&quot;);
    }

    @Override
    public void start() throws Exception {
        // 서비스 시작 코드
        System.out.println(&quot;Daemon 시작&quot;);
    }

    @Override
    public void stop() throws Exception {
        // 서비스 중지 코드
        System.out.println(&quot;Daemon 중지&quot;);
    }

    @Override
    public void destroy() {
        // 정리 코드
        System.out.println(&quot;Daemon 종료&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Maven 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트의 pom.xml 파일에 Apache Commons Daemon 라이브러리를 추가합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1719460575867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;commons-daemon&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-daemon&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.2.4&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;Maven을 사용하여 프로젝트를 빌드합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1719460587979&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mvn clean package&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;jsvc로 데몬 실행&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다음 명령을 사용하여 jsvc로 데몬을 실행합니다:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1719460613353&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo jsvc -cp /path/to/your/classes:/path/to/commons-daemon.jar MyDaemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령에서 /path/to/your/classes는 컴파일된 클래스 파일의 경로를, /path/to/commons-daemon.jar는 Commons Daemon JAR 파일의 경로를 가리킵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2. 데몬 중지:&lt;/p&gt;
&lt;pre id=&quot;code_1719460628698&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo jsvc -stop -pidfile /path/to/your/pidfile MyDaemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;3.추가 옵션:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-user &amp;lt;username&amp;gt;: 데몬 실행 후 권한을 낮출 사용자 이름&lt;/li&gt;
&lt;li&gt;-outfile &amp;lt;filename&amp;gt;: 표준 출력 리다이렉션 파일&lt;/li&gt;
&lt;li&gt;-errfile &amp;lt;filename&amp;gt;: 표준 에러 리다이렉션 파일&lt;/li&gt;
&lt;li&gt;-pidfile &amp;lt;filename&amp;gt;: 데몬의 PID를 저장할 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache Commons Daemon과 jsvc를 사용하면 Java 애플리케이션을 손쉽게 시스템 서비스나 데몬으로 실행할 수 있습니다. Daemon 인터페이스를 구현하고 jsvc 도구를 사용하여 애플리케이션을 백그라운드에서 안정적으로 실행해보세요. 이를 통해 시스템 부팅 시 자동으로 애플리케이션을 시작하거나 종료할 수 있으며, 높은 보안성을 유지할 수 있습니다.&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>Programing/JAVA</category>
      <category>apache</category>
      <category>commons</category>
      <category>commons daemon</category>
      <category>daemon</category>
      <category>jsvc</category>
      <category>데몬</category>
      <category>데몬실행</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/438</guid>
      <comments>https://maketh.tistory.com/438#entry438comment</comments>
      <pubDate>Thu, 27 Jun 2024 12:58:12 +0900</pubDate>
    </item>
    <item>
      <title>Apache Commons Daemon으로 데몬 서비스 구현하기</title>
      <link>https://maketh.tistory.com/437</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java&amp;nbsp;애플리케이션을&amp;nbsp;시스템&amp;nbsp;서비스나&amp;nbsp;데몬으로&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;방법을&amp;nbsp;찾고&amp;nbsp;계신가요?&amp;nbsp;Apache&amp;nbsp;Commons&amp;nbsp;Daemon을&amp;nbsp;사용하면&amp;nbsp;Java&amp;nbsp;애플리케이션을&amp;nbsp;쉽게&amp;nbsp;데몬&amp;nbsp;서비스로&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이&amp;nbsp;글에서는&amp;nbsp;Apache&amp;nbsp;Commons&amp;nbsp;Daemon을&amp;nbsp;사용하여&amp;nbsp;main&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;Apache Commons Daemon이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache Commons Daemon은 Java 애플리케이션을 Unix-like 시스템에서 시스템 서비스나 데몬으로 실행할 수 있도록 지원하는 라이브러리입니다. 이 라이브러리를 사용하면 Java 애플리케이션을 백그라운드 서비스로 실행할 수 있으며, 시스템 시작 시 자동으로 시작되거나 종료될 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기본 개념&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache Commons Daemon은 Daemon 인터페이스를 제공하며, 이 인터페이스를 구현하여 데몬 서비스를 작성할 수 있습니다. Daemon 인터페이스는 다음과 같은 메서드를 정의합니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;init(DaemonContext context): 데몬 초기화 메서드&lt;/li&gt;
&lt;li&gt;start(): 데몬 시작 메서드&lt;/li&gt;
&lt;li&gt;stop(): 데몬 중지 메서드&lt;/li&gt;
&lt;li&gt;destroy(): 데몬 종료 메서드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 인터페이스를 구현한 클래스는 main 메서드 없이도 동작할 수 있습니다. 대신, 이러한 클래스는 jsvc와 같은 도구를 사용하여 실행됩니다. jsvc는 Java 애플리케이션을 Unix-like 시스템에서 데몬으로 실행시키기 위한 도구입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Daemon 인터페이스를 구현한 간단한 예제입니다:&lt;/p&gt;
&lt;pre id=&quot;code_1719455024447&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;

public class MyDaemon implements Daemon {

    @Override
    public void init(DaemonContext context) throws DaemonInitException, Exception {
        // 초기화 코드
        System.out.println(&quot;Daemon 초기화&quot;);
    }

    @Override
    public void start() throws Exception {
        // 서비스 시작 코드
        System.out.println(&quot;Daemon 시작&quot;);
    }

    @Override
    public void stop() throws Exception {
        // 서비스 중지 코드
        System.out.println(&quot;Daemon 중지&quot;);
    }

    @Override
    public void destroy() {
        // 정리 코드
        System.out.println(&quot;Daemon 종료&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;위 클래스는 main 메서드 없이도 Apache Commons Daemon 라이브러리를 통해 데몬으로 동작할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Maven 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Maven을 사용하여 프로젝트를 빌드하는 경우, pom.xml 파일에 commons-daemon 의존성을 추가해야 합니다:&lt;/p&gt;
&lt;pre id=&quot;code_1719455043662&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;commons-daemon&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;commons-daemon&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.2.4&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;이렇게 설정하면 필요한 라이브러리를 포함시켜 프로젝트를 컴파일하고 패키징할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데몬 실행&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데몬을 실행하려면 jsvc 도구를 사용해야 합니다. jsvc는 Apache Commons Daemon 프로젝트의 일부로 제공되며, Java 애플리케이션을 데몬으로 실행하기 위한 명령줄 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsvc를 사용하여 데몬을 실행하는 방법은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;jsvc 다운로드 및 설치&lt;/li&gt;
&lt;li&gt;다음 명령을 사용하여 데몬 실행:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1719455071334&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;jsvc -cp /path/to/your/classes:/path/to/commons-daemon.jar MyDaemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령에서 /path/to/your/classes는 컴파일된 클래스 파일의 경로를, /path/to/commons-daemon.jar는 Commons Daemon JAR 파일의 경로를 가리킵니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Apache Commons Daemon을 사용하면 Java 애플리케이션을 손쉽게 데몬 서비스로 구현할 수 있습니다. Daemon 인터페이스를 구현하고 jsvc 도구를 사용하여 실행하면 main 메서드 없이도 동작하는 데몬 서비스를 만들 수 있습니다. 이 글을 통해 Apache Commons Daemon의 기본 사용 방법을 이해하고, 여러분의 애플리케이션을 백그라운드 서비스로 실행해보세요!&lt;/p&gt;</description>
      <category>Programing/JAVA</category>
      <category>apache</category>
      <category>daemon</category>
      <category>main method 불필요</category>
      <category>데몬</category>
      <category>데몬서비스</category>
      <category>데몬실행</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/437</guid>
      <comments>https://maketh.tistory.com/437#entry437comment</comments>
      <pubDate>Thu, 27 Jun 2024 11:25:28 +0900</pubDate>
    </item>
    <item>
      <title>&amp;quot;@Controller&amp;quot;와 &amp;quot;@RestController&amp;quot;의 차이점</title>
      <link>https://maketh.tistory.com/436</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring&amp;nbsp;프레임워크에서는&amp;nbsp;웹&amp;nbsp;애플리케이션의&amp;nbsp;요청을&amp;nbsp;처리하기&amp;nbsp;위해&amp;nbsp;컨트롤러(Controller)&amp;nbsp;클래스를&amp;nbsp;사용합니다.&amp;nbsp;이때&amp;nbsp;@Controller와&amp;nbsp;@RestController는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;주요한&amp;nbsp;어노테이션으로,&amp;nbsp;각각의&amp;nbsp;역할과&amp;nbsp;동작&amp;nbsp;방식에&amp;nbsp;차이가&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;@Controller &lt;br /&gt;@Controller&amp;nbsp;어노테이션은&amp;nbsp;Spring&amp;nbsp;MVC에서&amp;nbsp;컨트롤러&amp;nbsp;클래스를&amp;nbsp;정의할&amp;nbsp;때&amp;nbsp;사용됩니다.&amp;nbsp;이&amp;nbsp;어노테이션이&amp;nbsp;붙은&amp;nbsp;클래스는&amp;nbsp;HTTP&amp;nbsp;요청을&amp;nbsp;처리하고,&amp;nbsp;해당&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;응답을&amp;nbsp;생성합니다.&amp;nbsp;주로&amp;nbsp;HTML&amp;nbsp;페이지를&amp;nbsp;반환하거나&amp;nbsp;뷰(View)를&amp;nbsp;처리하기&amp;nbsp;위해&amp;nbsp;사용됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711805080612&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class MyController {
    @GetMapping(&quot;/hello&quot;)
    public String hello() {
        return &quot;hello&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의&amp;nbsp;코드에서&amp;nbsp;/hello&amp;nbsp;경로로&amp;nbsp;GET&amp;nbsp;요청이&amp;nbsp;들어오면&amp;nbsp;hello()&amp;nbsp;메서드가&amp;nbsp;실행되고,&amp;nbsp;&quot;hello&quot;&amp;nbsp;라는&amp;nbsp;뷰를&amp;nbsp;반환합니다. &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;@RestController &lt;br /&gt;@RestController&amp;nbsp;어노테이션은&amp;nbsp;@Controller와&amp;nbsp;유사하지만,&amp;nbsp;RESTful&amp;nbsp;웹&amp;nbsp;서비스를&amp;nbsp;제공하는&amp;nbsp;데&amp;nbsp;사용됩니다.&amp;nbsp;@RestController&amp;nbsp;어노테이션이&amp;nbsp;붙은&amp;nbsp;클래스의&amp;nbsp;모든&amp;nbsp;핸들러&amp;nbsp;메서드는&amp;nbsp;HTTP&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;데이터를&amp;nbsp;반환하고,&amp;nbsp;해당&amp;nbsp;데이터는&amp;nbsp;직렬화된&amp;nbsp;형태로&amp;nbsp;클라이언트에게&amp;nbsp;전송됩니다.&amp;nbsp;주로&amp;nbsp;JSON&amp;nbsp;또는&amp;nbsp;XML&amp;nbsp;형식의&amp;nbsp;데이터를&amp;nbsp;반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711805098803&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class MyRestController {
    @GetMapping(&quot;/api/hello&quot;)
    public String hello() {
        return &quot;Hello, World!&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의&amp;nbsp;코드에서&amp;nbsp;/api/hello&amp;nbsp;경로로&amp;nbsp;GET&amp;nbsp;요청이&amp;nbsp;들어오면&amp;nbsp;&quot;Hello,&amp;nbsp;World!&quot;라는&amp;nbsp;문자열이&amp;nbsp;JSON&amp;nbsp;형식으로&amp;nbsp;클라이언트에게&amp;nbsp;반환됩니다. &lt;br /&gt;&lt;br /&gt;차이점&amp;nbsp;요약 &lt;br /&gt;@Controller:&amp;nbsp;HTML&amp;nbsp;페이지나&amp;nbsp;뷰를&amp;nbsp;반환하기&amp;nbsp;위해&amp;nbsp;사용되며,&amp;nbsp;@ResponseBody&amp;nbsp;어노테이션이&amp;nbsp;필요하다. &lt;br /&gt;@RestController:&amp;nbsp;RESTful&amp;nbsp;웹&amp;nbsp;서비스를&amp;nbsp;제공하기&amp;nbsp;위해&amp;nbsp;사용되며,&amp;nbsp;@ResponseBody를&amp;nbsp;각&amp;nbsp;메서드에&amp;nbsp;붙일&amp;nbsp;필요가&amp;nbsp;없다. &lt;br /&gt;결론 &lt;br /&gt;@Controller와&amp;nbsp;@RestController는&amp;nbsp;Spring&amp;nbsp;애플리케이션에서&amp;nbsp;웹&amp;nbsp;요청을&amp;nbsp;처리하는&amp;nbsp;데&amp;nbsp;사용됩니다.&amp;nbsp;전자는&amp;nbsp;주로&amp;nbsp;HTML&amp;nbsp;페이지를&amp;nbsp;반환하고,&amp;nbsp;후자는&amp;nbsp;주로&amp;nbsp;JSON&amp;nbsp;또는&amp;nbsp;XML&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;</description>
      <category>Programing/Spring</category>
      <category>API</category>
      <category>controller</category>
      <category>JSON</category>
      <category>MVC</category>
      <category>RestController</category>
      <category>RESTful</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/436</guid>
      <comments>https://maketh.tistory.com/436#entry436comment</comments>
      <pubDate>Sat, 30 Mar 2024 22:25:48 +0900</pubDate>
    </item>
    <item>
      <title>VSC(visual studio code)에서 자동완성 지정하여 사용하기(clog -&amp;gt; console.log()</title>
      <link>https://maketh.tistory.com/435</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-testid=&quot;conversation-turn-3&quot;&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;3abcd9c1-3d03-454f-b673-2b9c13f7e470&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio Code (VSC)에서 &quot;clog&quot;을 입력하면 자동으로 &quot;console.log&quot;를 나타내는 기능을 설정하려면 다음과 같이 사용자 정의 코드 조각(Users Snippets)을 활용할 수 있습니다. 아래는 JavaScript에서 사용자 정의 코드 조각을 설정하는 방법입니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Visual Studio Code를 엽니다.&lt;/li&gt;
&lt;li&gt;상단 메뉴에서 &quot;파일(File)&quot;을 클릭하고 &quot;기본 설정(Preferences)&quot;을 선택합니다.&lt;/li&gt;
&lt;li&gt;&quot;사용자 코드 조각(User Snippets)&quot;을 선택합니다.&lt;/li&gt;
&lt;li&gt;만약 없으면, VSC 좌측 아래 톱니바퀴 모양을 누르면 나옵니다.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LCmqP/btsFLqdMtK7/3JkYKhRzkAMX9zJ8szIBNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LCmqP/btsFLqdMtK7/3JkYKhRzkAMX9zJ8szIBNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LCmqP/btsFLqdMtK7/3JkYKhRzkAMX9zJ8szIBNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLCmqP%2FbtsFLqdMtK7%2F3JkYKhRzkAMX9zJ8szIBNK%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;370&quot; height=&quot;329&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;5. JavaScript를 선택하거나, 해당 언어의 구문을 사용하는 파일의 코드 조각을 만들려면 해당 언어를 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 나타나는 파일에 다음과 같은 코드를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1710382607481&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    // JavaScript 코드 조각
    &quot;clog&quot;: {
        &quot;prefix&quot;: &quot;clog&quot;,
        &quot;body&quot;: [
            &quot;console.log($1);&quot;,
            &quot;$2&quot;
        ],
        &quot;description&quot;: &quot;console.log statement&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;이 코드 조각은 &quot;clog&quot;이라는 단축어를 입력하면 &quot;console.log();&quot;을 자동으로 생성해줍니다. $1, $2 등은 커서의 위치를 나타냅니다. $1은 처음으로 커서가 이동할 위치를, $2는 두 번째로 커서가 이동할 위치를 나타냅니다. 이를 통해 console.log()의 인수를 빠르게 입력할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Visual Studio Code에서 JavaScript 파일을 편집할 때 &quot;clog&quot;를 입력하면 자동으로 &quot;console.log();&quot;이 표시될 것입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div style=&quot;color: #000000;&quot;&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;&lt;span data-state=&quot;closed&quot;&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Programing/JavaScript</category>
      <category>vsC</category>
      <category>단축어</category>
      <category>축약어</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/435</guid>
      <comments>https://maketh.tistory.com/435#entry435comment</comments>
      <pubDate>Thu, 14 Mar 2024 11:22:42 +0900</pubDate>
    </item>
    <item>
      <title>Maven을 사용한 프로젝트 빌드하기: 명령 프롬프트(cmd)에서 간단한 가이드</title>
      <link>https://maketh.tistory.com/434</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Maven은 자바 프로젝트의 의존성 관리와 빌드 자동화를 위한 강력한 도구입니다. Maven을 사용하여 프로젝트를 빌드하는 방법을 배우고자 한다면, 이 가이드를 따라해 보세요. 이 가이드는 명령 프롬프트(cmd)를 사용하여 Maven을 통해 프로젝트를 빌드하는 방법에 대해 설명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;소개&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Maven은 Apache Software Foundation에서 개발한 프로젝트 관리 및 빌드 자동화 도구입니다. Maven은 프로젝트의 의존성 관리, 라이프사이클 관리, 빌드 및 배포를 자동화하는 데 사용됩니다. Maven은 프로젝트를 더욱 효율적으로 관리하고 개발자들이 일관된 방식으로 프로젝트를 빌드할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Maven으로 프로젝트 빌드하기&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;명령 프롬프트(cmd) 열기&lt;/b&gt;: 먼저 시스템에서 명령 프롬프트(cmd)를 엽니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로젝트 디렉토리로 이동&lt;/b&gt;: Maven 프로젝트의 루트 디렉토리로 이동합니다. 이 디렉토리에는 pom.xml 파일이 있어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빌드 명령어 실행&lt;/b&gt;: 다음과 같은 명령어를 사용하여 Maven 프로젝트를 빌드합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mvn: Maven 명령어입니다.&lt;/li&gt;
&lt;li&gt;clean: 이전 빌드에서 생성된 파일들을 제거합니다.&lt;/li&gt;
&lt;li&gt;install: 프로젝트를 빌드하고 컴파일된 코드를 로컬 Maven 저장소에 설치합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;
&lt;div style=&quot;background-color: #000000; color: #000000;&quot;&gt;&lt;span data-state=&quot;closed&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px;&quot;&gt;mvn clean install&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빌드 결과 확인&lt;/b&gt;: 빌드가 완료되면, 빌드된 파일은 대개 target 디렉토리에 생성됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 위의 가이드를 따라 Maven을 사용하여 프로젝트를 빌드할 수 있습니다. Maven은 자바 프로젝트를 빌드하는 강력한 도구이며, 이 가이드를 통해 Maven을 쉽게 활용할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이상입니다. 위의 내용은 Maven을 사용하여 프로젝트를 빌드하는 방법에 대한 간단한 블로그 글 예시입니다. 필요에 따라 내용을 보완하거나 더 자세히 설명할 수 있습니다.&lt;/p&gt;</description>
      <category>Programing/Spring</category>
      <category>build</category>
      <category>Maven install</category>
      <category>mvn</category>
      <category>Spring</category>
      <category>war 생성</category>
      <category>메이븐</category>
      <category>빌드</category>
      <category>프로젝트build</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/434</guid>
      <comments>https://maketh.tistory.com/434#entry434comment</comments>
      <pubDate>Mon, 26 Feb 2024 11:17:23 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot JPA를 활용한 Lazy Loading과 Eager Loading의 이해</title>
      <link>https://maketh.tistory.com/433</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;Spring Boot와 JPA를 이용한 데이터베이스 처리를 할 때, Lazy Loading과 Eager Loading은 중요한 개념 중 하나입니다. 이 둘은 데이터를 가져오는 시점과 방식에 대한 접근을 나타내며, 각각의 장단점을 고려하여 적절히 활용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Lazy Loading (지연 로딩)&lt;/h3&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Lazy Loading은 데이터를 실제로 필요한 시점에 가져오는 방식입니다. 예를 들어, 엔터티 간의 관계가 있을 때, 특정 엔터티를 조회할 때 관련된 엔터티들은 초기에는 로딩되지 않고, 실제로 해당 엔터티에 접근할 때 로딩됩니다. 이는 성능 향상을 가져올 수 있으나, 사용자가 이를 실제로 필요로 할 때까지 데이터를 로딩하지 않기 때문에 네트워크 레이턴시를 줄일 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음과 같은 엔터티 구조를 가정해봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1707209374851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Question {
    @Id
    private Long id;
    private String title;
    
    @OneToMany(mappedBy = &quot;question&quot;, fetch = FetchType.LAZY)
    private List&amp;lt;Answer&amp;gt; answers;
    
    // getters and setters
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 예시에서 Question과 Answer는 일대다 관계를 가지고 있습니다. Question을 조회할 때 관련된 Answer들은 Lazy Loading으로 설정되어 있습니다. 이 경우, Question을 조회할 때 Answer들은 실제로 데이터베이스에서 로딩되지 않고, Question 객체에 접근할 때 비로소 로딩됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Eager Loading (즉시 로딩)&lt;/h3&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Eager Loading은 반대로, 연관된 모든 데이터를 미리 가져오는 방식입니다. Lazy Loading과 달리, 해당 엔터티를 조회할 때 즉시 필요한 모든 데이터를 가져오게 됩니다. 이는 데이터를 사용하는 즉시 관련 데이터를 모두 로딩하기 때문에 성능적으로는 부하가 있을 수 있으나, 사용자가 데이터에 접근할 때마다 따로 로딩할 필요가 없어 편리합니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 위의 Question 엔터티를 Eager Loading으로 설정해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1707209389653&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Entity
public class Question {
    @Id
    private Long id;
    private String title;
    
    @OneToMany(mappedBy = &quot;question&quot;, fetch = FetchType.EAGER)
    private List&amp;lt;Answer&amp;gt; answers;
    
    // getters and setters
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 설정에서 answers 필드는 Eager Loading으로 설정되어 있습니다. 따라서 Question을 조회할 때 관련된 모든 Answer들도 함께 가져오게 됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;Spring Boot JPA에서의 Lazy Loading과 Eager Loading 활용&lt;/h3&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Spring Boot와 JPA를 함께 사용할 때는, Lazy Loading과 Eager Loading을 적절히 활용하여 성능을 최적화할 수 있습니다. 대규모 데이터베이스 애플리케이션에서는 Lazy Loading을 사용하여 필요한 데이터만을 가져오는 것이 효율적일 수 있으며, 작은 규모의 애플리케이션에서는 Eager Loading을 통해 간편하게 관련 데이터를 한 번에 가져올 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 실제 사용 사례에 따라 Lazy Loading과 Eager Loading을 혼합하여 사용할 수도 있습니다. 이는 각각의 상황에 맞게 최적의 성능을 얻기 위해 필요한 전략입니다.&lt;/p&gt;
&lt;p style=&quot;color: #374151; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이상으로 Spring Boot와 JPA에서의 Lazy Loading과 Eager Loading에 대한 개념과 활용에 대해 알아보았습니다. 이러한 데이터 로딩 전략을 적절히 활용하여 애플리케이션의 성능을 최적화할 수 있습니다.&lt;/p&gt;</description>
      <category>Programing/Spring</category>
      <category>DB</category>
      <category>eager loading</category>
      <category>JPA</category>
      <category>Lazy Loading</category>
      <category>Spring</category>
      <category>스프링 데이터</category>
      <category>즉시로딩</category>
      <category>지연로딩</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/433</guid>
      <comments>https://maketh.tistory.com/433#entry433comment</comments>
      <pubDate>Tue, 6 Feb 2024 17:50:32 +0900</pubDate>
    </item>
    <item>
      <title>함수형 인터페이스와 람다 표현식으로 코드 간편하게 작성하기</title>
      <link>https://maketh.tistory.com/432</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바&amp;nbsp;8부터&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;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;내용:&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;1.&amp;nbsp;함수형&amp;nbsp;인터페이스&amp;nbsp;정의:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706971469839&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@FunctionalInterface
interface Calculator {
    int calculate(int a, int b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;2.&amp;nbsp;람다&amp;nbsp;표현식으로&amp;nbsp;덧셈&amp;nbsp;구현:&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706971491655&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Calculator addition = (a, b) -&amp;gt; a + b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;3.&amp;nbsp;람다&amp;nbsp;표현식으로&amp;nbsp;뺄셈&amp;nbsp;구현:&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706971511259&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Calculator subtraction = (a, b) -&amp;gt; a - b;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;4.&amp;nbsp;함수형&amp;nbsp;인터페이스&amp;nbsp;활용:&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706971533411&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public static void main(String[] args) {
    int result1 = performOperation(10, 5, addition); // 10 + 5
    int result2 = performOperation(10, 5, subtraction); // 10 - 5
    System.out.println(&quot;Result1: &quot; + result1);
    System.out.println(&quot;Result2: &quot; + result2);
}

private static int performOperation(int a, int b, Calculator calculator) {
    return calculator.calculate(a, b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;5.&amp;nbsp;고전적인&amp;nbsp;방식과의&amp;nbsp;비교:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1706971552532&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface ClassicCalculator {
    int add(int a, int b);
    int subtract(int a, int b);
}

public static void main(String[] args) {
    ClassicCalculator classicCalculator = new ClassicCalculatorImpl();
    int result1 = classicCalculator.add(10, 5); // 10 + 5
    int result2 = classicCalculator.subtract(10, 5); // 10 - 5
    System.out.println(&quot;Result1: &quot; + result1);
    System.out.println(&quot;Result2: &quot; + result2);
}

static class ClassicCalculatorImpl implements ClassicCalculator {
    @Override
    public int add(int a, int b) {
        return a + b;
    }

    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;결론:&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;함수형&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;</description>
      <category>Programing/JAVA</category>
      <category>java8</category>
      <category>간결한코드</category>
      <category>고급개발자</category>
      <category>고전비교</category>
      <category>더하기빼기</category>
      <category>람다식</category>
      <category>설계</category>
      <category>함수형인터페이스</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/432</guid>
      <comments>https://maketh.tistory.com/432#entry432comment</comments>
      <pubDate>Sat, 3 Feb 2024 23:47:17 +0900</pubDate>
    </item>
    <item>
      <title>대형 프로젝트(협업) 에서 설계자의 할일</title>
      <link>https://maketh.tistory.com/431</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;대형 프로젝트를 진행할 때 설계자는 프로젝트 구조를 결정하고, 어떤 메서드를 어디에 위치시킬지, 어디에 인터페이스를 생성하고 구현할지 등을 설계합니다. 이는 소프트웨어 아키텍처를 정의하고 코드의 전체적인 구조를 결정하는 과정을 포함합니다.&lt;br&gt;&lt;br&gt;설계자의 역할에는 다음과 같은 주요 작업이 포함될 수 있습니다:&lt;br&gt;&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;아키텍처 설계:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;시스템의 전반적인 구조를 결정하고, 각 구성 요소 간의 관계를 정의합니다. 예를 들어, MVC(Model-View-Controller) 또는 Layered Architecture와 같은 아키텍처 패턴을 선택할 수 있습니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;패키지 구조 정의:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;프로젝트를 어떤 패키지로 구성할지 결정하고, 패키지 간의 의존성을 최소화하며 모듈화된 디자인을 구축합니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;클래스 및 메서드 설계:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;클래스의 역할과 책임을 정의하고, 메서드의 시그니처와 동작을 결정합니다. 어떤 클래스가 어떤 메서드를 가질지에 대한 결정을 내리게 됩니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;인터페이스 설계:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;시스템의 컴포넌트 간의 통신을 위한 인터페이스를 정의하고, 이를 통해 각 모듈을 분리하고 확장성을 높이는 데 기여합니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;의존성 관리:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;외부 라이브러리, 프레임워크, 서비스와의 의존성을 관리하고, 외부 컴포넌트와의 통합을 설계합니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;설계 패턴 적용:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;적절한 설계 패턴을 선택하고 적용하여 소프트웨어의 유지보수성과 확장성을 향상시킵니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;코딩 가이드라인 정의:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;코드의 일관성을 유지하기 위한 코딩 가이드라인을 정의하고, 개발자들이 일관된 스타일로 코드를 작성하도록 유도합니다.&lt;br&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;테스트 전략 수립:&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br&gt;테스트 케이스 작성, 단위 테스트, 통합 테스트 등의 전략을 수립하고 테스트 가능한 설계를 진행합니다.&lt;br&gt;설계자는 이러한 작업을 통해 프로젝트의 전반적인 구조를 설계하고, 팀의 다양한 구성원들이 협업하며 개발을 진행할 수 있도록 기반을 마련합니다. 이는 프로젝트의 효율성, 유지보수성, 확장성 등을 보장하는 중요한 역할입니다.&lt;/p&gt;</description>
      <category>Programing</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/431</guid>
      <comments>https://maketh.tistory.com/431#entry431comment</comments>
      <pubDate>Sat, 3 Feb 2024 22:00:53 +0900</pubDate>
    </item>
    <item>
      <title>java backend 고급 개발자 소양</title>
      <link>https://maketh.tistory.com/430</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;고급&lt;span&gt; Java &lt;/span&gt;백엔드 개발자로 성장하기 위해서는 다양한 기술과 개념을 숙지하고 다양한 프로젝트 경험을 쌓아야 합니다&lt;span&gt;. &lt;/span&gt;아래는 고급&lt;span&gt; Java &lt;/span&gt;백엔드 개발자로 발전하기 위한 몇 가지 핵심 기술과 개념들입니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;Java 8+&lt;/span&gt;의 새로운 기능 활용&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;람다 표현식과 스트림&lt;span&gt; API&lt;/span&gt;를 이해하고 활용하여 코드를 간결하게 작성할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Optional &lt;/span&gt;클래스를 사용하여 코드의 안정성을 높일 수 있습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;다중 스레드 및 병렬 프로그래밍&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Java&lt;/span&gt;에서 제공하는 스레드 및 병렬 처리 기능을 활용할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ConcurrentHashMap, CountDownLatch, Semaphore &lt;/span&gt;등과 같은 도구를 활용하여 동시성 문제를 다룰 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;Spring Framework &lt;/span&gt;활용&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spring MVC, Spring Boot &lt;/span&gt;등을 통한 웹 애플리케이션 개발 경험이 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spring Data JPA&lt;/span&gt;를 활용하여 데이터베이스와의 상호작용을 효과적으로 처리할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;ORM &lt;/span&gt;프레임워크&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Hibernate&lt;/span&gt;나&lt;span&gt; MyBatis &lt;/span&gt;등의&lt;span&gt; ORM &lt;/span&gt;프레임워크를 이해하고 활용할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 성능 최적화 및 트랜잭션 관리에 대한 이해가 필요합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;RESTful API &lt;/span&gt;개발&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;RESTful &lt;/span&gt;웹 서비스의 설계 및 구현 경험이 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spring REST &lt;/span&gt;또는&lt;span&gt; JAX-RS&lt;/span&gt;와 같은 기술을 사용하여&lt;span&gt; API&lt;/span&gt;를 개발할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;마이크로서비스 아키텍처&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스 패턴과 아키텍처를 이해하고 구축할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 디스커버리&lt;span&gt;, &lt;/span&gt;로드 밸런싱&lt;span&gt;, &lt;/span&gt;서킷 브레이킹 등과 관련된 개념에 익숙해져야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;보안 및 인증&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OAuth, JWT &lt;/span&gt;등을 사용하여 인증 및 보안 문제를 다룰 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;HTTPS &lt;/span&gt;및 기타 네트워크 보안 프로토콜에 대한 이해가 필요합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;컨테이너 기술&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Docker, Kubernetes &lt;/span&gt;등의 컨테이너 기술을 활용하여 애플리케이션을 배포하고 관리할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;&lt;span&gt;CI/CD &lt;/span&gt;및 자동화&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Jenkins, Travis CI, GitLab CI &lt;/span&gt;등을 사용하여 지속적 통합과 배포를 구현할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화된 테스트와 배포 환경을 구축할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;클라우드 서비스&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;AWS, Azure, Google Cloud Platform &lt;/span&gt;등의 클라우드 서비스를 활용하여 애플리케이션을 배포하고 관리할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;모니터링과 로깅&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션의 성능을 모니터링하고 로그를 분석하는 데 필요한 도구들을 사용할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;테스트 자동화&lt;span&gt;:&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JUnit, TestNG &lt;/span&gt;등의 테스트 프레임워크를 이용하여 자동화된 테스트를 작성할 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단위 테스트&lt;span&gt;, &lt;/span&gt;통합 테스트&lt;span&gt;, &lt;/span&gt;성능 테스트 등을 다룰 수 있어야 합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고급&lt;span&gt; Java &lt;/span&gt;백엔드 개발자로 성장하려면 이러한 기술들을 학습하고 실제 프로젝트에서 경험을 쌓아 나가는 것이 중요합니다&lt;span&gt;. &lt;/span&gt;또한 &lt;b&gt;열려 있는 소스 코드 및 커뮤니티 활동&lt;/b&gt;을 통해 최신 &lt;b&gt;기술 동향을 파악&lt;/b&gt;하고 적용하는 데 주의를 기울이는 것이 좋습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>java</category>
      <category>경력</category>
      <category>경험</category>
      <category>고급개발자</category>
      <category>공부</category>
      <category>백엔드</category>
      <category>원씽</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/430</guid>
      <comments>https://maketh.tistory.com/430#entry430comment</comments>
      <pubDate>Fri, 2 Feb 2024 23:25:45 +0900</pubDate>
    </item>
    <item>
      <title>아이의 후비루와 기침 문제: 엎드려 자는 것이 해결책이 될 수 있습니다</title>
      <link>https://maketh.tistory.com/429</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;후비루로 인한 어려움&lt;br&gt;&lt;br&gt;많은 부모님들이 겪는 고민 중 하나는 아이가 후비루로 인해 기침을 자주 하고, 때로는 기침을 너무 심하게 해서 토하기까지 하는 상황입니다. 이러한 상황은 아이에게 불편함을 주며 부모님들에게도 걱정을 안겨줍니다.&lt;br&gt;&lt;br&gt;전통적인 대처법과 한계&lt;br&gt;&lt;br&gt;후비루와 기침을 줄이기 위해 여러 방법이 시도되곤 합니다. 증상을 완화하기 위한 약물 치료, 습도 조절, 적절한 수분 섭취 등이 그 예입니다. 하지만 이러한 방법들이 항상 효과적인 것은 아닙니다. 대체로 후비루엔 치료법이 없다고도 합니다&lt;br&gt;&lt;br&gt;새로운 해결책: 엎드려 자기&lt;br&gt;&lt;br&gt;제 경험을 바탕으로, 엎드려 자는 것이 후비루로 인한 기침 문제에 효과적인 해결책이 될 수 있다는 것을 발견했습니다. 엎드려 자는 자세는 아이의 기도를 더욱 원활하게 해주어 기침을 줄이는 데 도움이 되었습니다.&lt;br&gt;&lt;br&gt;실제 경험&lt;br&gt;&lt;br&gt;제 아이가 후비루 때문에 잠을 자다가 자주 기침하고 토하는 문제를 겪었습니다. 하지만 엎드려 재우기 시작한 후, 아이가 한 번도 기침을 하지 않는 것을 경험했습니다. 이는 아이에게도 편안한 수면을 제공하고, 부모님들에게도 안심을 줄 수 있는 방법입니다.&lt;br&gt;&lt;br&gt;다른 부모님들에게의 권장&lt;br&gt;&lt;br&gt;이 방법이 모든 아이에게 효과적일 수는 없지만, 후비루로 인한 기침 문제에 대처하는 또 다른 방법으로 고려해볼 만합니다. 특히 전통적인 방법으로 해결이 어려웠던 경우에는 시도해볼 가치가 있습니다.&lt;br&gt;&lt;br&gt;이러한 경험을 바탕으로 작성한 이 글이 다른 부모님들에게 도움이 되길 바랍니다. 자녀의 건강 문제에 대해 항상 고민하는 부모님들에게 이 방법이 새로운 대안이 될 수 있기를 희망합니다.&lt;/p&gt;</description>
      <category>잡다한지식/건강</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/429</guid>
      <comments>https://maketh.tistory.com/429#entry429comment</comments>
      <pubDate>Sat, 25 Nov 2023 05:27:25 +0900</pubDate>
    </item>
    <item>
      <title>Java에서 파일 경로를 사용하여 File 객체 생성하기: 다양한 접근법</title>
      <link>https://maketh.tistory.com/428</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서 파일을 다루는 것은 어떤 애플리케이션에서도 흔히 발생하는 작업 중 하나입니다. 특히, 파일 경로로부터 File 객체를 생성하는 방법은 여러 가지가 있으며, 각각의 방법은 상황에 따라 유용하게 사용될 수 있습니다. 이 글에서는 Java에서 파일 경로를 사용하여 File 객체를 생성하는 여러 가지 방법과 그 특징을 살펴보겠습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 표준적인 방법: File 클래스 사용&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 기본적인 방법은 java.io.File 클래스를 사용하는 것입니다. 이 방법은 Java의 초기 버전부터 제공되며, 매우 간단하고 직관적입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700004228998&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;File file = new File(filePath);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 방법은 간단한 파일 작업에 적합하며, 쉽게 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. NIO 패키지 사용: Path와 Files 클래스&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Java 7부터는 java.nio.file 패키지를 통해 더 강력하고 유연한 파일 처리 방법이 제공됩니다. Path와 Files 클래스를 사용하면 보다 세련된 파일 처리가 가능합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700004248005&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Path path = Paths.get(filePath);
File file = path.toFile();&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 방법은 파일 메타데이터를 읽거나 파일 시스템에 쿼리를 수행할 때 더 효율적이며, 큰 파일을 처리하거나 비동기 I/O 작업을 수행할 때 유리합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 스트림 클래스 사용&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;FileInputStream 또는 FileOutputStream과 같은 스트림 클래스를 사용하여 파일을 처리할 수도 있습니다. 이 방법은 파일 입출력에 직접적으로 사용되며, 파일 객체를 내부적으로 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700004264469&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FileInputStream fis = new FileInputStream(filePath);
FileOutputStream fos = new FileOutputStream(filePath);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 방법은 파일의 내용을 직접 읽거나 쓸 때 유용합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 리소스로서의 파일 접근&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어플리케이션의 리소스로서 파일에 접근할 때는 Class.getResource() 또는 Class.getResourceAsStream() 메소드를 사용할 수 있습니다. 이 방법은 주로 클래스패스 내의 리소스를 찾을 때 사용됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1700004283765&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;URL resourceUrl = getClass().getResource(filePath);
File file = new File(resourceUrl.toURI());&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;또는&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700004291479&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;InputStream inputStream = getClass().getResourceAsStream(filePath);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 방법은 애플리케이션 내장 리소스에 접근할 때 특히 유용합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;성능 고려사항&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파일 객체를 생성하는 속도는 일반적으로 애플리케이션의 성능에 큰 영향을 미치지 않습니다. 그러나 파일 I/O 작업을 수행할 때는 java.nio.file 패키지를 사용하는 것이 더 나은 성능을 제공할 수 있습니다. 특히, 큰 파일을 처리하거나 비동기 I/O를 수행할 때 이 패키지의 사용이 권장됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Java에서 파일 경로로부터 File 객체를 생성하는 방법은 다양합니다. 각 방법은 특정한 상황과 요구사항에 따라 유용할 수 있으며, 효율적인 파일 처리를 위해 적절한 방법을 선택하는 것이 중요합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 100%; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dn/bU4oLa/btsAhfo3PQw/QCcMYmshJSFrCPyoBGAixK/img.jpg&quot; alt=&quot;Random Photo&quot; /&gt;&lt;/p&gt;</description>
      <category>Programing/JAVA</category>
      <category>File</category>
      <category>java</category>
      <category>PATH</category>
      <category>파일객체</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/428</guid>
      <comments>https://maketh.tistory.com/428#entry428comment</comments>
      <pubDate>Wed, 15 Nov 2023 08:06:03 +0900</pubDate>
    </item>
    <item>
      <title>Java로 특정 폴더 내의 모든 내용 삭제하기</title>
      <link>https://maketh.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍을 하다 보면 때때로 특정 디렉토리 내의 모든 파일과 하위 폴더를 삭제해야 하는 상황이 발생합니다. Java를 사용할 때 이러한 작업은 간단하게 처리할 수 있습니다. 이번 포스팅에서는 Java를 이용해 특정 폴더 내의 모든 내용을 삭제하는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;코드 설명&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 수행하기 위해, 우리는 두 개의 주요 메서드를 사용할 것입니다: deleteContents와 deleteDirectory. deleteContents 메서드는 주어진 경로에 있는 모든 파일과 하위 폴더를 찾아 삭제합니다. 그리고 deleteDirectory는 주어진 폴더 내의 모든 내용을 재귀적으로 삭제합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;메서드 구현&lt;/h3&gt;
&lt;pre id=&quot;code_1700003003851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.File;

public class FolderCleaner {

    public static void main(String[] args) {
        // 예시 폴더 경로
        String folderPath = &quot;aa/bb/cc&quot;;

        // 해당 경로의 모든 내용을 삭제
        deleteContents(new File(folderPath));
    }

    private static void deleteContents(File folder) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    // 재귀적으로 하위 폴더와 파일 삭제
                    deleteDirectory(file);
                }
            }
        }
    }

    private static void deleteDirectory(File folder) {
        if (folder.isDirectory()) {
            File[] files = folder.listFiles();
            if (files != null) {
                for (File file : files) {
                    // 재귀적으로 하위 폴더와 파일 삭제
                    deleteDirectory(file);
                }
            }
        }
        // 폴더 또는 파일 삭제
        folder.delete();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;이 코드는 주어진 경로 내의 모든 파일과 폴더를 삭제합니다. 따라서, 실제 파일 시스템에 적용하기 전에 충분히 테스트하고, 사용할 때는 주의를 기울여야 합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;폴더나 파일을 삭제하는 작업은 복구가 어려울 수 있으므로, 삭제하려는 경로가 정확한지 확인하는 것이 중요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 코드를 활용하여 Java에서 특정 디렉토리 내의 모든 파일과 하위 폴더를 쉽고 안전하게 삭제할 수 있습니다. 프로그래밍 과정에서 이런 유형의 파일 시스템 조작이 필요할 때 참고하시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 100%; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dn/c3WX7m/btsAm1Qsmd0/zEVTSb476YncKTsOjpXIA1/img.jpg&quot; alt=&quot;Random Photo&quot; /&gt;&lt;/p&gt;</description>
      <category>Programing/JAVA</category>
      <category>java</category>
      <category>재귀</category>
      <category>폴더내용삭제</category>
      <category>폴더삭제</category>
      <category>폴더하위삭제</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/427</guid>
      <comments>https://maketh.tistory.com/427#entry427comment</comments>
      <pubDate>Wed, 15 Nov 2023 08:02:35 +0900</pubDate>
    </item>
    <item>
      <title>java JSON 파싱 예제</title>
      <link>https://maketh.tistory.com/425</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서&amp;nbsp;JSON&amp;nbsp;객체를&amp;nbsp;파싱하려면&amp;nbsp;일반적으로&amp;nbsp;org.json&amp;nbsp;라이브러리나&amp;nbsp;Jackson,&amp;nbsp;Gson과&amp;nbsp;같은&amp;nbsp;라이브러리를&amp;nbsp;사용합니다. &lt;br /&gt;&lt;br /&gt;여기서는&amp;nbsp;org.json&amp;nbsp;라이브러리를&amp;nbsp;사용하여&amp;nbsp;JSON&amp;nbsp;객체를&amp;nbsp;파싱하는&amp;nbsp;간단한&amp;nbsp;예제를&amp;nbsp;제시하겠습니다. &lt;br /&gt;&lt;br /&gt;먼저&amp;nbsp;org.json&amp;nbsp;라이브러리를&amp;nbsp;프로젝트에&amp;nbsp;추가합니다.&amp;nbsp;Maven&amp;nbsp;프로젝트의&amp;nbsp;경우&amp;nbsp;pom.xml에&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;dependency를&amp;nbsp;추가합니다. &lt;/p&gt;
&lt;pre id=&quot;code_1695254473764&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.json&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;json&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;20210307&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;JSON&amp;nbsp;객체&amp;nbsp;파싱&amp;nbsp;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1695254504987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import org.json.JSONArray;
import org.json.JSONObject;

public class JsonExample {

    public static void main(String[] args) {
        String jsonString = &quot;{&quot;
                + &quot;\&quot;name\&quot;: \&quot;John\&quot;,&quot;
                + &quot;\&quot;age\&quot;: 30,&quot;
                + &quot;\&quot;address\&quot;: {&quot;
                + &quot;    \&quot;street\&quot;: \&quot;123 Main St\&quot;,&quot;
                + &quot;    \&quot;city\&quot;: \&quot;Anytown\&quot;&quot;
                + &quot;},&quot;
                + &quot;\&quot;phoneNumbers\&quot;: [\&quot;123-456-7890\&quot;, \&quot;987-654-3210\&quot;]&quot;
                + &quot;}&quot;;

        JSONObject jsonObject = new JSONObject(jsonString);

        // 기본 데이터 추출
        String name = jsonObject.getString(&quot;name&quot;);
        int age = jsonObject.getInt(&quot;age&quot;);

        // 내부 객체 추출
        JSONObject addressObject = jsonObject.getJSONObject(&quot;address&quot;);
        String street = addressObject.getString(&quot;street&quot;);
        String city = addressObject.getString(&quot;city&quot;);

        // JSON 배열 추출
        JSONArray phoneNumbersArray = jsonObject.getJSONArray(&quot;phoneNumbers&quot;);
        for (int i = 0; i &amp;lt; phoneNumbersArray.length(); i++) {
            String phoneNumber = phoneNumbersArray.getString(i);
            System.out.println(phoneNumber);
        }

        // 출력
        System.out.println(&quot;Name: &quot; + name);
        System.out.println(&quot;Age: &quot; + age);
        System.out.println(&quot;Street: &quot; + street);
        System.out.println(&quot;City: &quot; + city);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;예제에서는&amp;nbsp;org.json&amp;nbsp;라이브러리의&amp;nbsp;JSONObject와&amp;nbsp;JSONArray를&amp;nbsp;사용하여&amp;nbsp;JSON&amp;nbsp;데이터를&amp;nbsp;파싱합니다.&amp;nbsp;JSON&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;</description>
      <category>Programing/JAVA</category>
      <category>JAVA JSON</category>
      <category>JSON PARSE</category>
      <category>JSON 파싱</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/425</guid>
      <comments>https://maketh.tistory.com/425#entry425comment</comments>
      <pubDate>Thu, 21 Sep 2023 09:03:06 +0900</pubDate>
    </item>
    <item>
      <title>추상클래스를 구현하면 @Override를 안붙혀도 되나?</title>
      <link>https://maketh.tistory.com/424</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java가 됐든 뭐가 됐든 프로그램을 작성하다보면, 공통된 기능을 여기저기에 이용하는 경우가 생깁니다.&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;클래스에&amp;nbsp;정의된&amp;nbsp;추상&amp;nbsp;메서드를&amp;nbsp;하위&amp;nbsp;클래스에서&amp;nbsp;구현할&amp;nbsp;때,&amp;nbsp;@Override&amp;nbsp;어노테이션을&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;필수는&amp;nbsp;아닙니다.&amp;nbsp;그러나&amp;nbsp;@Override&amp;nbsp;어노테이션을&amp;nbsp;사용하는&amp;nbsp;것은&amp;nbsp;좋은&amp;nbsp;습관입니다.&amp;nbsp;왜냐하면&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;이유들&amp;nbsp;때문입니다: &lt;br /&gt;&lt;br /&gt;명시성:&amp;nbsp;@Override&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;br /&gt;&lt;br /&gt;컴파일러&amp;nbsp;검사:&amp;nbsp;@Override&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;이로&amp;nbsp;인해&amp;nbsp;오류를&amp;nbsp;빠르게&amp;nbsp;발견하고&amp;nbsp;수정할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;코드&amp;nbsp;유지보수:&amp;nbsp;만약&amp;nbsp;상위&amp;nbsp;클래스의&amp;nbsp;메서드&amp;nbsp;시그니처가&amp;nbsp;변경되었을&amp;nbsp;때,&amp;nbsp;@Override&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;br /&gt;&lt;br /&gt;결론적으로,&amp;nbsp;@Override&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;</description>
      <category>Programing/JAVA</category>
      <category>@Override</category>
      <category>abstract</category>
      <category>인터페이스</category>
      <category>추상클래스</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/424</guid>
      <comments>https://maketh.tistory.com/424#entry424comment</comments>
      <pubDate>Thu, 21 Sep 2023 08:51:37 +0900</pubDate>
    </item>
    <item>
      <title>제네릭, 그 시작은</title>
      <link>https://maketh.tistory.com/423</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;제네릭(Generic)은&amp;nbsp;Java에서&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;br /&gt;&lt;br /&gt;&lt;b&gt;제네릭의&amp;nbsp;기본&amp;nbsp;개념:&lt;/b&gt; &lt;br /&gt;&lt;b&gt;1.&amp;nbsp;타입&amp;nbsp;안전성(Type&amp;nbsp;Safety):&lt;/b&gt; &lt;br /&gt;제네릭을 사용하면 컴파일 시점에 타입 검사를 수행하여 런타임 에러를 방지할 수 있습니다. &lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&amp;nbsp;타입&amp;nbsp;파라미터(Type&amp;nbsp;Parameter):&lt;/b&gt; &lt;br /&gt;제네릭에서는 꺾쇠 괄호(&amp;lt;&amp;gt;) 안에 타입 파라미터를 사용합니다. &lt;br /&gt;예:&amp;nbsp;ArrayList&amp;lt;T&amp;gt;&amp;nbsp;여기서&amp;nbsp;T는&amp;nbsp;타입&amp;nbsp;파라미터입니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.&amp;nbsp;제네릭&amp;nbsp;클래스와&amp;nbsp;인터페이스:&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;클래스나&amp;nbsp;인터페이스를&amp;nbsp;정의할&amp;nbsp;때&amp;nbsp;타입&amp;nbsp;파라미터를&amp;nbsp;추가하여&amp;nbsp;제네릭화할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;b&gt;기본&amp;nbsp;예제:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1695200466876&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 제네릭 클래스의 예
public class Box&amp;lt;T&amp;gt; {
    private T content;

    public T getContent() {
        return content;
    }

    public void setContent(T content) {
        this.content = content;
    }
}

// 사용 예
Box&amp;lt;String&amp;gt; stringBox = new Box&amp;lt;&amp;gt;();
stringBox.setContent(&quot;Hello, Java!&quot;);
String value = stringBox.getContent();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;예에서&amp;nbsp;Box&amp;nbsp;클래스는&amp;nbsp;어떤&amp;nbsp;타입의&amp;nbsp;content를&amp;nbsp;담을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이를&amp;nbsp;사용할&amp;nbsp;때&amp;nbsp;원하는&amp;nbsp;타입으로&amp;nbsp;인스턴스화할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;제네릭&amp;nbsp;메서드:&lt;/b&gt; &lt;br /&gt;클래스뿐만&amp;nbsp;아니라&amp;nbsp;메서드도&amp;nbsp;제네릭화할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1695200484103&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class GenericMethodExample {

    public static &amp;lt;T&amp;gt; void printContent(T content) {
        System.out.println(content);
    }

    public static void main(String[] args) {
        printContent(&quot;Hello, World!&quot;); // 출력: Hello, World!
        printContent(123);             // 출력: 123
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제한된&amp;nbsp;타입&amp;nbsp;파라미터(Bounded&amp;nbsp;Type&amp;nbsp;Parameter):&lt;/b&gt; &lt;br /&gt;제네릭에서&amp;nbsp;특정&amp;nbsp;타입&amp;nbsp;또는&amp;nbsp;그&amp;nbsp;하위&amp;nbsp;타입만을&amp;nbsp;허용하고&amp;nbsp;싶을&amp;nbsp;때&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1695200500230&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class NumericBox&amp;lt;T extends Number&amp;gt; {
    private T content;

    // 나머지 코드 ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;예에서&amp;nbsp;NumericBox는&amp;nbsp;Number의&amp;nbsp;서브클래스만&amp;nbsp;담을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;(Integer,&amp;nbsp;Double&amp;nbsp;등) &lt;br /&gt;&lt;br /&gt;&lt;b&gt;장점:&lt;/b&gt; &lt;br /&gt;&lt;b&gt;타입&amp;nbsp;안전성:&lt;/b&gt;&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;br /&gt;&lt;b&gt;코드&amp;nbsp;재사용:&lt;/b&gt;&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;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;제네릭을&amp;nbsp;사용하면서&amp;nbsp;주의해야&amp;nbsp;할&amp;nbsp;점:&lt;/b&gt; &lt;br /&gt;&lt;b&gt;런타임&amp;nbsp;시&amp;nbsp;제네릭&amp;nbsp;정보&amp;nbsp;소실:&lt;/b&gt;&amp;nbsp;Java의&amp;nbsp;제네릭은&amp;nbsp;타입&amp;nbsp;소거(Type&amp;nbsp;Erasure)&amp;nbsp;때문에&amp;nbsp;런타임에는&amp;nbsp;제네릭&amp;nbsp;정보가&amp;nbsp;사라집니다.&amp;nbsp;따라서&amp;nbsp;List&amp;lt;Integer&amp;gt;와&amp;nbsp;List&amp;lt;String&amp;gt;은&amp;nbsp;런타임에&amp;nbsp;동일한&amp;nbsp;List&amp;nbsp;타입으로&amp;nbsp;취급됩니다. &lt;br /&gt;&lt;b&gt;기본&amp;nbsp;타입&amp;nbsp;사용&amp;nbsp;불가:&lt;/b&gt;&amp;nbsp;제네릭&amp;nbsp;타입&amp;nbsp;파라미터로는&amp;nbsp;기본&amp;nbsp;타입(int,&amp;nbsp;char,&amp;nbsp;double&amp;nbsp;등)을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;없습니다.&amp;nbsp;대신&amp;nbsp;래퍼&amp;nbsp;클래스(Integer,&amp;nbsp;Character,&amp;nbsp;Double&amp;nbsp;등)를&amp;nbsp;사용해야&amp;nbsp;합니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제네릭은&amp;nbsp;처음에는&amp;nbsp;복잡해&amp;nbsp;보일&amp;nbsp;수&amp;nbsp;있지만,&amp;nbsp;익숙해지면&amp;nbsp;Java&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;</description>
      <category>Programing/JAVA</category>
      <category>generic</category>
      <category>T</category>
      <category>제네릭</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/423</guid>
      <comments>https://maketh.tistory.com/423#entry423comment</comments>
      <pubDate>Wed, 20 Sep 2023 18:03:30 +0900</pubDate>
    </item>
    <item>
      <title>싱글톤 방식에서의 무상태 설계</title>
      <link>https://maketh.tistory.com/422</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Stateless Service 와 Controller&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stateless&amp;nbsp;Service: &lt;br /&gt;서비스&amp;nbsp;계층의&amp;nbsp;객체는&amp;nbsp;주로&amp;nbsp;상태를&amp;nbsp;가지지&amp;nbsp;않습니다(stateless).&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;br /&gt;&lt;br /&gt;Controller의&amp;nbsp;생명주기: &lt;br /&gt;웹&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;내의&amp;nbsp;일반&amp;nbsp;지역&amp;nbsp;변수와는&amp;nbsp;다르게&amp;nbsp;동작합니다. &lt;br /&gt;&lt;br /&gt;예를&amp;nbsp;들어,&lt;/p&gt;
&lt;pre id=&quot;code_1694994736256&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class MyController {

    @Autowired
    private MyService myService;

    @GetMapping(&quot;/data&quot;)
    public SomeResponse getData(@RequestParam String param) {
        SomeData data = myService.getData(param); // 서비스 호출
        return new SomeResponse(data); // 응답 반환
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의&amp;nbsp;예제에서&amp;nbsp;getData&amp;nbsp;메서드는&amp;nbsp;웹&amp;nbsp;요청이&amp;nbsp;들어올&amp;nbsp;때마다&amp;nbsp;호출되고,&amp;nbsp;그&amp;nbsp;요청에&amp;nbsp;대한&amp;nbsp;처리가&amp;nbsp;끝나면&amp;nbsp;param과&amp;nbsp;data&amp;nbsp;변수는&amp;nbsp;메모리에서&amp;nbsp;사라집니다.&amp;nbsp;myService는&amp;nbsp;Spring&amp;nbsp;Bean이므로&amp;nbsp;계속&amp;nbsp;존재하지만,&amp;nbsp;그&amp;nbsp;내부에서&amp;nbsp;처리하는&amp;nbsp;데이터는&amp;nbsp;메서드&amp;nbsp;호출이&amp;nbsp;끝나면&amp;nbsp;사라집니다. &lt;br /&gt;&lt;br /&gt;따라서,&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;</description>
      <category>stateless</category>
      <category>매개변수</category>
      <category>멤버변수</category>
      <category>무상태</category>
      <category>싱글톤</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/422</guid>
      <comments>https://maketh.tistory.com/422#entry422comment</comments>
      <pubDate>Mon, 18 Sep 2023 08:52:50 +0900</pubDate>
    </item>
    <item>
      <title>Java에서의 Set&amp;lt;String&amp;gt; 및 Map&amp;lt;String, ?&amp;gt; 자료구조</title>
      <link>https://maketh.tistory.com/421</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java의&amp;nbsp;Collection&amp;nbsp;Framework는&amp;nbsp;다양한&amp;nbsp;자료구조를&amp;nbsp;제공하며,&amp;nbsp;이&amp;nbsp;중&amp;nbsp;Set과&amp;nbsp;Map&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;Set&amp;lt;String&amp;gt;과&amp;nbsp;Map&amp;lt;String,&amp;nbsp;?&amp;gt;의&amp;nbsp;주요&amp;nbsp;구현에&amp;nbsp;대해&amp;nbsp;다루며,&amp;nbsp;각각의&amp;nbsp;특징을&amp;nbsp;예를&amp;nbsp;통해&amp;nbsp;설명합니다. &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;Set&amp;lt;String&amp;gt;&amp;nbsp;자료구조 &lt;br /&gt;1.1&amp;nbsp;HashSet&amp;lt;String&amp;gt; &lt;br /&gt;특징:&amp;nbsp;가장&amp;nbsp;일반적으로&amp;nbsp;사용되는&amp;nbsp;Set&amp;nbsp;구현체.&amp;nbsp;내부적으로&amp;nbsp;HashMap을&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;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650271618&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;String&amp;gt; hashSet = new HashSet&amp;lt;&amp;gt;();
hashSet.add(&quot;A&quot;);
hashSet.add(&quot;B&quot;);
hashSet.add(&quot;A&quot;);  // 중복이므로 추가되지 않음
System.out.println(hashSet);  // [A, B]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.2&amp;nbsp;LinkedHashSet&amp;lt;String&amp;gt; &lt;br /&gt;특징:&amp;nbsp;HashSet의&amp;nbsp;확장&amp;nbsp;버전.&amp;nbsp;추가&amp;nbsp;순서대로&amp;nbsp;데이터를&amp;nbsp;저장합니다. &lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650297743&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;String&amp;gt; linkedHashSet = new LinkedHashSet&amp;lt;&amp;gt;();
linkedHashSet.add(&quot;A&quot;);
linkedHashSet.add(&quot;B&quot;);
linkedHashSet.add(&quot;C&quot;);
System.out.println(linkedHashSet);  // [A, B, C]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.3&amp;nbsp;TreeSet&amp;lt;String&amp;gt; &lt;br /&gt;특징:&amp;nbsp;자연&amp;nbsp;순서&amp;nbsp;또는&amp;nbsp;지정된&amp;nbsp;comparator에&amp;nbsp;따라&amp;nbsp;데이터를&amp;nbsp;정렬하여&amp;nbsp;저장합니다. &lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650314909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;String&amp;gt; treeSet = new TreeSet&amp;lt;&amp;gt;();
treeSet.add(&quot;C&quot;);
treeSet.add(&quot;A&quot;);
treeSet.add(&quot;B&quot;);
System.out.println(treeSet);  // [A, B, C]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;Map&amp;lt;String,&amp;nbsp;?&amp;gt;&amp;nbsp;자료구조 &lt;br /&gt;2.1&amp;nbsp;HashMap&amp;lt;String,&amp;nbsp;String&amp;gt; &lt;br /&gt;특징:&amp;nbsp;가장&amp;nbsp;일반적으로&amp;nbsp;사용되는&amp;nbsp;Map&amp;nbsp;구현체.&amp;nbsp;키-값&amp;nbsp;쌍을&amp;nbsp;저장하며,&amp;nbsp;순서를&amp;nbsp;보장하지&amp;nbsp;않습니다. &lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650331903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, String&amp;gt; hashMap = new HashMap&amp;lt;&amp;gt;();
hashMap.put(&quot;A&quot;, &quot;Apple&quot;);
hashMap.put(&quot;B&quot;, &quot;Banana&quot;);
System.out.println(hashMap);  // {A=Apple, B=Banana}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.2&amp;nbsp;LinkedHashMap&amp;lt;String,&amp;nbsp;String&amp;gt; &lt;br /&gt;특징:&amp;nbsp;HashMap의&amp;nbsp;확장&amp;nbsp;버전.&amp;nbsp;추가&amp;nbsp;순서대로&amp;nbsp;키-값&amp;nbsp;쌍을&amp;nbsp;저장합니다. &lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650354231&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, String&amp;gt; linkedHashMap = new LinkedHashMap&amp;lt;&amp;gt;();
linkedHashMap.put(&quot;A&quot;, &quot;Apple&quot;);
linkedHashMap.put(&quot;B&quot;, &quot;Banana&quot;);
linkedHashMap.put(&quot;C&quot;, &quot;Cherry&quot;);
System.out.println(linkedHashMap);  // {A=Apple, B=Banana, C=Cherry}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.3&amp;nbsp;TreeMap&amp;lt;String,&amp;nbsp;String&amp;gt; &lt;br /&gt;특징:&amp;nbsp;자연&amp;nbsp;순서&amp;nbsp;또는&amp;nbsp;지정된&amp;nbsp;comparator에&amp;nbsp;따라&amp;nbsp;키를&amp;nbsp;정렬하여&amp;nbsp;키-값&amp;nbsp;쌍을&amp;nbsp;저장합니다. &lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650372795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, String&amp;gt; treeMap = new TreeMap&amp;lt;&amp;gt;();
treeMap.put(&quot;C&quot;, &quot;Cherry&quot;);
treeMap.put(&quot;A&quot;, &quot;Apple&quot;);
treeMap.put(&quot;B&quot;, &quot;Banana&quot;);
System.out.println(treeMap);  // {A=Apple, B=Banana, C=Cherry}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한&amp;nbsp;자료구조들은&amp;nbsp;Java에서&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;Set&amp;nbsp;및&amp;nbsp;Map을&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;Java의&amp;nbsp;Set&amp;nbsp;및&amp;nbsp;Map&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;br /&gt;&lt;br /&gt;1.&amp;nbsp;중복&amp;nbsp;제거 &lt;br /&gt;Set은&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;br /&gt;&lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650407836&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;List&amp;lt;String&amp;gt; fruits = Arrays.asList(&quot;Apple&quot;, &quot;Banana&quot;, &quot;Cherry&quot;, &quot;Apple&quot;, &quot;Banana&quot;);
Set&amp;lt;String&amp;gt; uniqueFruits = new HashSet&amp;lt;&amp;gt;(fruits);
System.out.println(uniqueFruits);  // [Apple, Banana, Cherry]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;FIFO&amp;nbsp;(First-In-First-Out) &lt;br /&gt;FIFO는&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;들어온&amp;nbsp;데이터가&amp;nbsp;가장&amp;nbsp;먼저&amp;nbsp;나가는&amp;nbsp;순서를&amp;nbsp;의미합니다.&amp;nbsp;LinkedHashMap은&amp;nbsp;데이터를&amp;nbsp;입력한&amp;nbsp;순서대로&amp;nbsp;저장하므로,&amp;nbsp;FIFO를&amp;nbsp;구현하는데&amp;nbsp;사용될&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650422614&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, String&amp;gt; fifoMap = new LinkedHashMap&amp;lt;&amp;gt;();
fifoMap.put(&quot;first&quot;, &quot;1st&quot;);
fifoMap.put(&quot;second&quot;, &quot;2nd&quot;);
fifoMap.put(&quot;third&quot;, &quot;3rd&quot;);
System.out.println(fifoMap.keySet().iterator().next());  // &quot;first&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;FILO&amp;nbsp;(First-In-Last-Out)&amp;nbsp;or&amp;nbsp;LIFO&amp;nbsp;(Last-In-First-Out) &lt;br /&gt;FILO&amp;nbsp;또는&amp;nbsp;LIFO는&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;ArrayDeque&amp;nbsp;(더블&amp;nbsp;엔드&amp;nbsp;큐)와&amp;nbsp;같은&amp;nbsp;자료구조를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;그러나&amp;nbsp;LinkedHashMap의&amp;nbsp;특정&amp;nbsp;조작을&amp;nbsp;통해&amp;nbsp;비슷한&amp;nbsp;행동을&amp;nbsp;수행할&amp;nbsp;수도&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650437225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Map&amp;lt;String, String&amp;gt; filoMap = new LinkedHashMap&amp;lt;&amp;gt;();
filoMap.put(&quot;first&quot;, &quot;1st&quot;);
filoMap.put(&quot;second&quot;, &quot;2nd&quot;);
filoMap.put(&quot;third&quot;, &quot;3rd&quot;);

List&amp;lt;String&amp;gt; keys = new ArrayList&amp;lt;&amp;gt;(filoMap.keySet());
System.out.println(keys.get(keys.size() - 1));  // &quot;third&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&amp;nbsp;정렬된&amp;nbsp;순서 &lt;br /&gt;TreeSet&amp;nbsp;및&amp;nbsp;TreeMap은&amp;nbsp;자연&amp;nbsp;순서로&amp;nbsp;요소&amp;nbsp;및&amp;nbsp;키를&amp;nbsp;정렬합니다.&amp;nbsp;사용자&amp;nbsp;정의&amp;nbsp;정렬이&amp;nbsp;필요한&amp;nbsp;경우,&amp;nbsp;Comparator를&amp;nbsp;제공하여&amp;nbsp;원하는&amp;nbsp;정렬을&amp;nbsp;구현할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;예제:&lt;/p&gt;
&lt;pre id=&quot;code_1694650452367&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set&amp;lt;String&amp;gt; sortedFruits = new TreeSet&amp;lt;&amp;gt;(Comparator.reverseOrder());
sortedFruits.add(&quot;Apple&quot;);
sortedFruits.add(&quot;Banana&quot;);
sortedFruits.add(&quot;Cherry&quot;);
System.out.println(sortedFruits);  // [Cherry, Banana, Apple]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼&amp;nbsp;Java의&amp;nbsp;Set&amp;nbsp;및&amp;nbsp;Map&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;</description>
      <category>Programing/JAVA</category>
      <category>java</category>
      <category>list</category>
      <category>map</category>
      <category>set</category>
      <category>Treemap</category>
      <category>TreeSet</category>
      <category>데이터구조</category>
      <category>자료구조</category>
      <category>컬랙션</category>
      <category>컬랙션프레임워크</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/421</guid>
      <comments>https://maketh.tistory.com/421#entry421comment</comments>
      <pubDate>Thu, 14 Sep 2023 09:15:12 +0900</pubDate>
    </item>
    <item>
      <title>만 5세 아이 영어놀이대화</title>
      <link>https://maketh.tistory.com/420</link>
      <description>아들이 만 5세인데 자꾸 영어로 대화하라고 하는데..무슨 말을 해야할 지 몰라 그냥 놀아주고만 있습니다.&lt;br&gt;도대체 아이와 놀때엔 무슨 대화를 해야 할까요?&lt;br&gt;우리말로도 무슨말을 해야할 지 모르겠는데 말이죠..&lt;br&gt;&lt;br&gt;만 5세 아이와 영어로 대화 연습을 할 때, 간단하고 재미있는 문장을 사용하는 것이 좋습니다. 아래는 장난감을 가지고 놀면서 사용할 수 있는 대화 예제입니다.&lt;br&gt;&lt;br&gt;부모: Hey, what toy are you playing with?&lt;br&gt;&lt;br&gt;아이: It's my car!&lt;br&gt;&lt;br&gt;부모: Wow! That's a cool car. What color is it?&lt;br&gt;&lt;br&gt;아이: It's blue!&lt;br&gt;&lt;br&gt;부모: Do you like blue cars?&lt;br&gt;&lt;br&gt;아이: Yes! Zoom zoom!&lt;br&gt;&lt;br&gt;부모: Can I play with you?&lt;br&gt;&lt;br&gt;아이: Okay!&lt;br&gt;&lt;br&gt;부모: Let's make a race track for your car. Are you ready to race?&lt;br&gt;&lt;br&gt;아이: Ready, set, go!&lt;br&gt;&lt;br&gt;부모: Beep beep! Watch out for the big mountain!&lt;br&gt;&lt;br&gt;아이: My car can climb it!&lt;br&gt;&lt;br&gt;부모: Oh no, there's a river ahead! How will your car get across?&lt;br&gt;&lt;br&gt;아이: It can jump!&lt;br&gt;&lt;br&gt;부모: That's amazing! Your car is really special. Who gave it to you?&lt;br&gt;&lt;br&gt;아이: Mommy did!&lt;br&gt;&lt;br&gt;부모: She must know you love cars. Would you like to play with another toy later?&lt;br&gt;&lt;br&gt;아이: Maybe... I like my car now!&lt;br&gt;&lt;br&gt;부모: That's okay. Let's keep racing then!&lt;br&gt;&lt;br&gt;Happy Today!&lt;img src=&quot;https://blog.kakaocdn.net/dn/elNOuL/btstg1vRHGb/4ZmkGglpikZf7Xbkcx5FJK/img.jpg&quot; alt=&quot;Random Photo&quot; style=&quot;width: 100%; height: auto;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <category>DAYS</category>
      <category>5세</category>
      <category>놀이 회화</category>
      <category>무슨말</category>
      <category>무슨말을해야할까?</category>
      <category>영어 대화</category>
      <category>영어 회화</category>
      <category>영어대화</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/420</guid>
      <comments>https://maketh.tistory.com/420#entry420comment</comments>
      <pubDate>Wed, 6 Sep 2023 11:46:01 +0900</pubDate>
    </item>
    <item>
      <title>프로그램 구성도와 아키텍처 그리기: 단계별 가이드</title>
      <link>https://maketh.tistory.com/419</link>
      <description>안녕하세요! 오늘은 프로그램의 구성도와 아키텍처를 그리는 방법에 대해 자세히 알아보겠습니다. 이 가이드를 통해 복잡한 프로그램이나 시스템의 구조를 명확하게 표현하는 방법을 배울 수 있습니다.&lt;br&gt;&lt;br&gt;목표 설정:&lt;br&gt;&lt;br&gt;구성도를 만드는 목적을 확실히 합니다.&lt;br&gt;예시: 서버와 클라이언트 간의 통신 방식을 파악하기 위해 구성도를 그릴 때, 목표는 &quot;서버와 클라이언트 간의 데이터 교환 방식을 시각화한다&quot;가 될 수 있습니다.&lt;br&gt;정보 수집:&lt;br&gt;&lt;br&gt;시스템의 주요 구성 요소와 이들 간의 관계를 파악합니다.&lt;br&gt;예시: 온라인 쇼핑몰 시스템의 경우, 주요 구성 요소로는 사용자, 장바구니, 상품 DB, 결제 시스템 등이 있을 수 있습니다.&lt;br&gt;추상화:&lt;br&gt;&lt;br&gt;중요한 정보만을 포함하여 구성도를 간소화합니다.&lt;br&gt;예시: 사용자의 상세 정보(이름, 주소)보다는 사용자의 행동(상품 검색, 결제)에 초점을 맞춰 구성도를 그릴 수 있습니다.&lt;br&gt;기호 및 표기법 선택:&lt;br&gt;&lt;br&gt;예시: 서버와 클라이언트 간의 데이터 흐름을 나타낼 때 UML의 시퀀스 다이어그램을 선택할 수 있습니다.&lt;br&gt;도구 선택:&lt;br&gt;&lt;br&gt;예시: 간단한 구성도는 Draw.io를 사용하여 작성하고, 복잡한 시스템 아키텍처는 Enterprise Architect를 활용하여 그릴 수 있습니다.&lt;br&gt;드래프트 작성:&lt;br&gt;&lt;br&gt;예시: 온라인 쇼핑몰의 주요 기능(상품 검색, 장바구니 추가, 결제)을 중심으로 초기 구성도를 작성해볼 수 있습니다.&lt;br&gt;리뷰 및 개선:&lt;br&gt;&lt;br&gt;예시: 개발팀과 함께 구성도를 검토하며 누락된 부분이나 오류를 찾아 수정합니다.&lt;br&gt;완성 및 공유:&lt;br&gt;&lt;br&gt;예시: 완성된 구성도를 팀원들과 공유하고, 필요한 경우 문서나 위키에 업로드하여 지속적으로 업데이트합니다.&lt;br&gt;시스템의 구조와 흐름을 시각화하는 것은 복잡한 프로젝트에서 중요한 단계입니다. 위 가이드를 참고하여 여러분의 프로젝트에 맞는 효과적인 구성도와 아키텍처를 그려보세요!&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5a6K7/btss3X95WAt/uM1GAnHTbzkzqrMSm9oMK1/img.jpg&quot; alt=&quot;Random Photo&quot; style=&quot;width: 100%; height: auto;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;</description>
      <category>Programing</category>
      <category>가이드</category>
      <category>구성도</category>
      <category>구조도</category>
      <category>그리기</category>
      <category>시스템 구성도</category>
      <category>아키텍처</category>
      <category>프로젝트 시각화</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/419</guid>
      <comments>https://maketh.tistory.com/419#entry419comment</comments>
      <pubDate>Tue, 5 Sep 2023 17:41:32 +0900</pubDate>
    </item>
    <item>
      <title>ByteBuffer를 활용하여 Protocol Data 파싱하기</title>
      <link>https://maketh.tistory.com/418</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 통신에서 프로토콜은 중요한 역할을 합니다. 오늘은 ByteBuffer를 사용하여 15바이트의 헤더와 100바이트의 바디로 구성된 데이터 프로토콜을 파싱하는 방법에 대해 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ByteBuffer 소개&lt;/b&gt;&lt;br /&gt;Java의 NIO 패키지에 있는 ByteBuffer는 바이트 버퍼를 표현하며, 바이너리 데이터를 읽고 쓰는 데 유용합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;데이터 프로토콜의 구조&lt;/b&gt;&lt;br /&gt;&amp;nbsp; Header (15 bytes)&lt;br /&gt;&amp;nbsp; Type (1 byte)&lt;br /&gt;&amp;nbsp; Version (1 byte)&lt;br /&gt;&amp;nbsp; ID (5 bytes)&lt;br /&gt;&amp;nbsp; Longitude (4 bytes)&lt;br /&gt;&amp;nbsp; Latitude (4 bytes)&lt;br /&gt;&amp;nbsp; Body (100 bytes)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;VO 클래스&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692850243927&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class DataVO {
    private String type;
    private String version;
    private String id;
    private String lon;
    private String lat;

    // getters and setters 생략...

    public static class Builder {
        private String type;
        private String version;
        private String id;
        private String lon;
        private String lat;

        public Builder setType(String type) {
            this.type = type;
            return this;
        }

        public Builder setVersion(String version) {
            this.version = version;
            return this;
        }

        public Builder setId(String id) {
            this.id = id;
            return this;
        }

        public Builder setLon(String lon) {
            this.lon = lon;
            return this;
        }

        public Builder setLat(String lat) {
            this.lat = lat;
            return this;
        }

        public DataVO build() {
            return new DataVO(this);
        }
    }

    private DataVO(Builder builder) {
        this.type = builder.type;
        this.version = builder.version;
        this.id = builder.id;
        this.lon = builder.lon;
        this.lat = builder.lat;
    }
}&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;b&gt;Unpack&amp;nbsp;메서드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692850282882&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public DataVO unpack(byte[] data) {
    ByteBuffer buffer = ByteBuffer.wrap(data);

    byte typeByte = buffer.get();
    String type = String.valueOf(typeByte &amp;amp; 0xFF);

    byte versionByte = buffer.get();
    String version = String.valueOf(versionByte &amp;amp; 0xFF);

    byte[] idBytes = new byte[5];
    buffer.get(idBytes);
    String id = new String(idBytes, StandardCharsets.UTF_8); // UTF-8로 디코딩

    int lonInt = buffer.getInt();
    String lon = String.valueOf(lonInt);

    int latInt = buffer.getInt();
    String lat = String.valueOf(latInt);

    return new DataVO.Builder()
            .setType(type)
            .setVersion(version)
            .setId(id)
            .setLon(lon)
            .setLat(lat)
            .build();
}&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;b&gt;Pack&amp;nbsp;메서드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692850299328&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public byte[] pack(DataVO vo) {
    ByteBuffer buffer = ByteBuffer.allocate(115); // 15(header) + 100(body)

    buffer.put(Byte.parseByte(vo.getType()));
    buffer.put(Byte.parseByte(vo.getVersion()));
    buffer.put(vo.getId().getBytes(StandardCharsets.UTF_8));
    buffer.putInt(Integer.parseInt(vo.getLon()));
    buffer.putInt(Integer.parseInt(vo.getLat()));

    // 본 예제에서는 body 부분을 처리하지 않았습니다.
    // 실제 환경에서는 body에 해당하는 데이터를 ByteBuffer에 추가해야 합니다.

    return buffer.array();
}&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;b&gt;결론&lt;/b&gt; &lt;br /&gt;ByteBuffer는&amp;nbsp;바이너리&amp;nbsp;데이터의&amp;nbsp;효율적인&amp;nbsp;처리를&amp;nbsp;도와주며,&amp;nbsp;get(),&amp;nbsp;getInt()와&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;p data-ke-size=&quot;size16&quot;&gt;VO클래스를 Lombok 라이브러리를 사용하여 간단하게 하면 아래와 같이 수정가능합니다&lt;/p&gt;
&lt;pre id=&quot;code_1692850366080&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class DataVO {
    private String type;
    private String version;
    private String id;
    private String lon;
    private String lat;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lombok&amp;nbsp;라이브러리의&amp;nbsp;@Builder와&amp;nbsp;@Getter&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 100%; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dn/crTjFs/btsr9PpDB44/gdKGZkHSLugNbuOqMOB5T1/img.jpg&quot; alt=&quot;Random Photo&quot; /&gt;&lt;/p&gt;</description>
      <category>Programing/JAVA</category>
      <category>buffer.get()</category>
      <category>ByteBuffer</category>
      <category>Protocol</category>
      <category>파싱</category>
      <category>프로토콜</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/418</guid>
      <comments>https://maketh.tistory.com/418#entry418comment</comments>
      <pubDate>Thu, 24 Aug 2023 13:08:46 +0900</pubDate>
    </item>
    <item>
      <title>스프링 웹플럭스: 비동기 프로그래밍을 이해하며 시작하기</title>
      <link>https://maketh.tistory.com/417</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요! 오늘은 최근에 많이 이야기되는 '스프링 웹플럭스'에 대해 함께 알아보려 합니다. &lt;br /&gt;비전문가 분들도 이해할 수 있도록, 쉽고 자세하게 설명해보려 합니다. &lt;br /&gt;그럼 시작해볼까요?&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1. 스프링 웹플럭스의 기본 개념&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;웹플럭스는 스프링 5에 도입된 반응형 웹 프레임워크입니다. 주로 '비동기'와 '논블로킹' 방식으로 데이터를 처리합니다. 여기서 비동기와 논블로킹이라는 단어가 나왔는데, 이게 무슨 뜻인지 간단하게 설명하겠습니다.&lt;br /&gt;&lt;br /&gt;비동기(Asynchronous): 작업을 순차적으로 기다리지 않고, 여러 작업을 동시에 진행하는 방식을 의미합니다. 예를 들어, 집에 있는 두 개의 전화기로 동시에 두 명의 친구에게 전화를 걸 수 있는 상황을 생각해보세요. 두 전화기로 동시에 전화를 걸면서 대화를 할 수 있는 것처럼, 비동기는 여러 작업을 동시에 처리합니다.&lt;br /&gt;&lt;br /&gt;논블로킹(Non-blocking): 한 작업이 완료될 때까지 다른 작업이 기다리지 않는 방식을 의미합니다. 예를 들어, 커피를 주문하고 바로 옆의 빵가게에서 빵을 사는 것처럼, 한 작업을 기다리지 않고 다른 작업을 진행합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2. 스프링 웹플럭스의 특징: 왜 사용할까?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;전통적인 웹 애플리케이션은 요청이 들어오면 그 요청을 처리하기 위해 스레드를 사용합니다. 그러나 동시에 많은 요청이 들어올 경우, 스레드의 수가 제한되어 있기 때문에 효율적인 처리가 어려울 수 있습니다. 이러한 문제점을 해결하기 위해 스프링 웹플럭스는 비동기와 논블로킹 방식을 통해 효율적으로 자원을 활용하려 합니다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;3. 데이터 스트리밍 이해하기: 1000개의 데이터 예제&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;이해하기 쉽게 예를 들어보겠습니다. 클라이언트가 서버에 1000개의 데이터를 요청한다고 가정해봅시다.&lt;br /&gt;&lt;br /&gt;전통적인 방식에서는:&lt;br /&gt;&lt;br /&gt;서버는 데이터베이스에서 1000개의 데이터를 모두 가져옵니다.&lt;br /&gt;그 후 클라이언트에게 한 번에 1000개의 데이터를 전송합니다.&lt;br /&gt;반면, 웹플럭스의 리액티브 방식에서는:&lt;br /&gt;&lt;br /&gt;서버는 데이터베이스에서 데이터를 100개씩 조각내어 가져옵니다.&lt;br /&gt;첫 100개의 데이터를 클라이언트에게 즉시 전송합니다.&lt;br /&gt;클라이언트는 그 데이터를 받자마자 화면에 표시하거나 처리합니다.&lt;br /&gt;서버는 다음 100개의 데이터를 가져와 클라이언트에게 전송합니다.&lt;br /&gt;이 과정이 1000개의 데이터를 모두 전송할 때까지 반복됩니다.&lt;br /&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;b&gt;1. 도메인 클래스: Member&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692707498307&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Member {
    private String id;
    private String name;
    private int age;
    
    // getters, setters, constructor
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 리포지토리 인터페이스: MemberRepository&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692707544522&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public interface MemberRepository extends ReactiveCrudRepository&amp;lt;Member, String&amp;gt; {
    Flux&amp;lt;Member&amp;gt; findByName(String name);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 서비스 클래스: MemberService&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692707572665&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    public Flux&amp;lt;Member&amp;gt; findAll() {
        return memberRepository.findAll();
    }

    public Mono&amp;lt;Member&amp;gt; findById(String id) {
        return memberRepository.findById(id);
    }

    public Mono&amp;lt;Member&amp;gt; save(Member member) {
        return memberRepository.save(member);
    }

    public Mono&amp;lt;Void&amp;gt; delete(String id) {
        return memberRepository.deleteById(id);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 컨트롤러 클래스: MemberController&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692707603948&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/members&quot;)
public class MemberController {
    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping
    public Flux&amp;lt;Member&amp;gt; list() {
        return memberService.findAll();
    }

    @GetMapping(&quot;/{id}&quot;)
    public Mono&amp;lt;ResponseEntity&amp;lt;Member&amp;gt;&amp;gt; get(@PathVariable String id) {
        return memberService.findById(id)
            .map(member -&amp;gt; ResponseEntity.ok(member))
            .defaultIfEmpty(ResponseEntity.notFound().build());
    }

    @PostMapping
    public Mono&amp;lt;Member&amp;gt; create(@RequestBody Member member) {
        return memberService.save(member);
    }

    @DeleteMapping(&quot;/{id}&quot;)
    public Mono&amp;lt;ResponseEntity&amp;lt;Void&amp;gt;&amp;gt; delete(@PathVariable String id) {
        return memberService.delete(id)
            .then(Mono.just(ResponseEntity.ok().&amp;lt;Void&amp;gt;build()))
            .defaultIfEmpty(ResponseEntity.notFound().build());
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&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;Mono&amp;nbsp;또는&amp;nbsp;Flux&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;스프링 웹플럭스는 현대의 빠르게 변하는 웹 환경에서 높은 효율과 성능을 제공하기 위해 탄생한 기술입니다. 오늘 포스트를 통해 그 기본적인 개념과 특징, 그리고 실제 예제를 통해 이해하셨길 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;width: 100%; height: auto;&quot; src=&quot;https://blog.kakaocdn.net/dn/lZxeJ/btsrNzbnT2t/PKQ7EkEiGZJ7uhFdQGs95K/img.jpg&quot; alt=&quot;Random Photo&quot; /&gt;&lt;/p&gt;</description>
      <category>Programing/Spring</category>
      <category>논블로킹</category>
      <category>비동기</category>
      <category>스프링</category>
      <category>스프링5</category>
      <category>웹플럭스</category>
      <category>플럭스</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/417</guid>
      <comments>https://maketh.tistory.com/417#entry417comment</comments>
      <pubDate>Tue, 22 Aug 2023 21:30:09 +0900</pubDate>
    </item>
    <item>
      <title>@Controller와 @RestController: Spring에서의 주요 차이점</title>
      <link>https://maketh.tistory.com/416</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요,&amp;nbsp;여러분!&amp;nbsp;오늘은&amp;nbsp;Spring&amp;nbsp;Framework에서&amp;nbsp;많이&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;두&amp;nbsp;어노테이션,&amp;nbsp;@Controller와&amp;nbsp;@RestController에&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;Spring&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;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;@Controller &lt;br /&gt;@Controller는&amp;nbsp;전통적인&amp;nbsp;Spring&amp;nbsp;MVC&amp;nbsp;컨트롤러로서&amp;nbsp;주로&amp;nbsp;웹&amp;nbsp;페이지를&amp;nbsp;반환하는데&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;메서드가&amp;nbsp;반환하는&amp;nbsp;값은&amp;nbsp;기본적으로&amp;nbsp;뷰&amp;nbsp;이름으로&amp;nbsp;해석됩니다.&amp;nbsp;예를&amp;nbsp;들어,&amp;nbsp;메서드가&amp;nbsp;&quot;home&quot;&amp;nbsp;문자열을&amp;nbsp;반환하면,&amp;nbsp;설정된&amp;nbsp;뷰&amp;nbsp;리졸버에&amp;nbsp;따라&amp;nbsp;&quot;home.jsp&quot;나&amp;nbsp;&quot;home.html&quot;&amp;nbsp;등의&amp;nbsp;뷰&amp;nbsp;페이지로&amp;nbsp;렌더링됩니다. &lt;br /&gt;&lt;br /&gt;웹&amp;nbsp;응답으로&amp;nbsp;데이터(예:&amp;nbsp;JSON)를&amp;nbsp;직접&amp;nbsp;반환하려면&amp;nbsp;@ResponseBody&amp;nbsp;어노테이션을&amp;nbsp;메서드에&amp;nbsp;추가해야&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;예시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1692188488723&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Controller
public class MyWebController {
    @RequestMapping(&quot;/page&quot;)
    public String showPage() {
        return &quot;myPage&quot;; // myPage.jsp 또는 myPage.html로 렌더링됩니다.
    }
}&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.&amp;nbsp;@RestController &lt;br /&gt;@RestController는&amp;nbsp;Spring&amp;nbsp;4에서&amp;nbsp;도입된&amp;nbsp;어노테이션으로,&amp;nbsp;@Controller와&amp;nbsp;@ResponseBody의&amp;nbsp;조합과&amp;nbsp;같습니다. &lt;br /&gt;&lt;br /&gt;주로&amp;nbsp;RESTful&amp;nbsp;웹&amp;nbsp;서비스를&amp;nbsp;구현하는데&amp;nbsp;사용됩니다. &lt;br /&gt;&lt;br /&gt;메서드가&amp;nbsp;반환하는&amp;nbsp;값은&amp;nbsp;HTTP&amp;nbsp;응답&amp;nbsp;본문으로&amp;nbsp;직렬화됩니다.&amp;nbsp;객체를&amp;nbsp;반환하면&amp;nbsp;기본적으로&amp;nbsp;JSON&amp;nbsp;형식으로&amp;nbsp;클라이언트에&amp;nbsp;전송됩니다. &lt;br /&gt;&lt;br /&gt;별도의&amp;nbsp;@ResponseBody&amp;nbsp;어노테이션을&amp;nbsp;사용할&amp;nbsp;필요가&amp;nbsp;없습니다. &lt;br /&gt;&lt;br /&gt;예시:&lt;/p&gt;
&lt;pre id=&quot;code_1692188508935&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RestController
public class MyApiController {
    @RequestMapping(&quot;/data&quot;)
    public MyData getData() {
        return new MyData(&quot;example&quot;, 123); // JSON 형식으로 응답됩니다.
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리 &lt;br /&gt;@Controller와&amp;nbsp;@RestController의&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;RESTful&amp;nbsp;API&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;br /&gt;&lt;br /&gt;그럼,&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;</description>
      <category>annotation</category>
      <category>API</category>
      <category>controller</category>
      <category>RestController</category>
      <category>restful api</category>
      <category>스프링</category>
      <category>컨트롤러</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/416</guid>
      <comments>https://maketh.tistory.com/416#entry416comment</comments>
      <pubDate>Wed, 16 Aug 2023 21:22:43 +0900</pubDate>
    </item>
    <item>
      <title>웹 애플리케이션에서 Bean의 생명주기와 무상태 설계 이해하기</title>
      <link>https://maketh.tistory.com/415</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹&amp;nbsp;애플리케이션을&amp;nbsp;설계하고&amp;nbsp;개발하는&amp;nbsp;과정에서&amp;nbsp;Bean의&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;br /&gt;&lt;br /&gt;1.&amp;nbsp;Bean의&amp;nbsp;생명주기 &lt;br /&gt;1.1.&amp;nbsp;싱글턴&amp;nbsp;스코프 &lt;br /&gt;스프링&amp;nbsp;프레임워크에서&amp;nbsp;Bean은&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;br /&gt;&lt;br /&gt;1.2.&amp;nbsp;프로토타입&amp;nbsp;스코프 &lt;br /&gt;필요에&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;br /&gt;&lt;br /&gt;2.&amp;nbsp;무상태&amp;nbsp;설계 &lt;br /&gt;무상태&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;br /&gt;&lt;br /&gt;예시&lt;/p&gt;
&lt;pre id=&quot;code_1692013080970&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class StatelessService {

    public int add(int a, int b) {
        int result = a + b;
        return result;
    }
}&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;예제는&amp;nbsp;무상태&amp;nbsp;서비스로,&amp;nbsp;여러&amp;nbsp;쓰레드가&amp;nbsp;동시에&amp;nbsp;add&amp;nbsp;메서드를&amp;nbsp;호출하더라도&amp;nbsp;서로&amp;nbsp;영향을&amp;nbsp;미치지&amp;nbsp;않습니다. &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;충돌&amp;nbsp;방지 &lt;br /&gt;상태를&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;사용해야&amp;nbsp;합니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.1.&amp;nbsp;데이터&amp;nbsp;무결성&amp;nbsp;손상 &lt;br /&gt;데이터의&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;p data-ke-size=&quot;size16&quot;&gt;&quot;충돌&quot;이&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;br /&gt;&lt;br /&gt;3.2.상태&amp;nbsp;있는&amp;nbsp;서비스의&amp;nbsp;예 &lt;br /&gt;아래의&amp;nbsp;서비스&amp;nbsp;클래스는&amp;nbsp;계산&amp;nbsp;결과를&amp;nbsp;result라는&amp;nbsp;인스턴스&amp;nbsp;변수에&amp;nbsp;저장하는&amp;nbsp;상태가&amp;nbsp;있는&amp;nbsp;서비스입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692013138990&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Service
public class StatefulService {
    
    private int result;

    public void add(int a, int b) {
        result = a + b;
    }

    public int getResult() {
        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;서비스&amp;nbsp;빈은&amp;nbsp;기본적으로&amp;nbsp;싱글턴&amp;nbsp;스코프로&amp;nbsp;생성되므로&amp;nbsp;애플리케이션&amp;nbsp;전체에서&amp;nbsp;하나의&amp;nbsp;인스턴스만&amp;nbsp;존재합니다. &lt;br /&gt;&lt;br /&gt;충돌&amp;nbsp;상황 &lt;br /&gt;&lt;u&gt;&lt;b&gt;쓰레드&amp;nbsp;A:&amp;nbsp;statefulService.add(10,&amp;nbsp;20);를&amp;nbsp;호출하여&amp;nbsp;result에&amp;nbsp;30을&amp;nbsp;저장합니다. &lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;쓰레드&amp;nbsp;B:&amp;nbsp;거의&amp;nbsp;동시에&amp;nbsp;statefulService.add(5,&amp;nbsp;5);를&amp;nbsp;호출하여&amp;nbsp;result에&amp;nbsp;10을&amp;nbsp;저장합니다.&lt;/b&gt;&lt;/u&gt; &lt;br /&gt;이&amp;nbsp;상황에서&amp;nbsp;쓰레드&amp;nbsp;A가&amp;nbsp;result&amp;nbsp;값을&amp;nbsp;읽으려고&amp;nbsp;하면&amp;nbsp;30이&amp;nbsp;아닌&amp;nbsp;10을&amp;nbsp;읽을&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;쓰레드&amp;nbsp;B가&amp;nbsp;쓰레드&amp;nbsp;A의&amp;nbsp;연산&amp;nbsp;후에&amp;nbsp;result&amp;nbsp;값을&amp;nbsp;변경했기&amp;nbsp;때문입니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;문제점&lt;/b&gt; &lt;br /&gt;이러한&amp;nbsp;충돌로&amp;nbsp;인해&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;문제가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;데이터&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;br /&gt;예측&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;br /&gt;해결&amp;nbsp;방법 &lt;br /&gt;이러한&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;애플리케이션에서는&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;무상태(stateless)&amp;nbsp;설계를&amp;nbsp;추천하는&amp;nbsp;것이&amp;nbsp;일반적입니다. &lt;br /&gt;&lt;br /&gt;무상태&amp;nbsp;설계는&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;특징을&amp;nbsp;가집니다: &lt;br /&gt;&lt;br /&gt;인스턴스&amp;nbsp;변수를&amp;nbsp;사용하지&amp;nbsp;않거나,&amp;nbsp;인스턴스&amp;nbsp;변수가&amp;nbsp;변경되지&amp;nbsp;않는&amp;nbsp;상수만을&amp;nbsp;포함합니다. &lt;br /&gt;메서드의&amp;nbsp;동작이&amp;nbsp;입력값만에&amp;nbsp;의존하며,&amp;nbsp;외부의&amp;nbsp;상태에&amp;nbsp;의존하지&amp;nbsp;않습니다. &lt;br /&gt;여러&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;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;결론 &lt;br /&gt;Bean의&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;복잡한&amp;nbsp;동시성&amp;nbsp;제어를&amp;nbsp;회피하고&amp;nbsp;코드의&amp;nbsp;유지&amp;nbsp;보수성을&amp;nbsp;향상시킬&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&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>Bean 생명주기</category>
      <category>stateless</category>
      <category>무상태</category>
      <category>쓰레드</category>
      <category>웹어플리케이션</category>
      <category>일관성</category>
      <category>충돌</category>
      <author>임프로</author>
      <guid isPermaLink="true">https://maketh.tistory.com/415</guid>
      <comments>https://maketh.tistory.com/415#entry415comment</comments>
      <pubDate>Mon, 14 Aug 2023 20:40:54 +0900</pubDate>
    </item>
  </channel>
</rss>