<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>와당탕탕 개발놀이터</title>
    <link>https://acisliver.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 1 Aug 2026 03:09:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>acisliver</managingEditor>
    <image>
      <title>와당탕탕 개발놀이터</title>
      <url>https://tistory1.daumcdn.net/tistory/4718990/attach/e0384f7ef17d43799e04010ff326eed4</url>
      <link>https://acisliver.tistory.com</link>
    </image>
    <item>
      <title>2024 네이버 신입 공채 합격 후기</title>
      <link>https://acisliver.tistory.com/entry/2024-%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%8B%A0%EC%9E%85-%EA%B3%B5%EC%B1%84-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2025 네이버 신입 공채 공고가 올라왔습니다.&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;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;  스펙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전형별 후기에 앞서 저의 스펙을 나열하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지거국 컴공 4점대, 국비교육 6개월, 정보처리기능사(군대에서 땀), 여러 프로젝트 경험(4+)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이정도가 있을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 준비 기간은 대학교 1학년부터 준비했다고 생각하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대학교 4년 + 취준 1.5년&lt;/b&gt; (+군대 1.5년?) 정도 준비했습니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;  서류전형&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자기소개서는 재료가 중요합니다. 그 재료가 되는 것이 &lt;b&gt;개발자가 되기 위해 겪은 나의 경험들&lt;/b&gt; 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경험들을 통해 나의 &lt;b&gt;강점&lt;/b&gt;을 보여주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작년과는 자기소개서 항목이 다르지만 결국 경험을 통해 나의 강점을 보여주는 것은 동일합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 SW개발 부문 Back-end 분야에 지원했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여태 개발자가 되기 위해 했던 공부 경험으로 성장능력을 어필했고 프로젝트 경험으로 협업 능력을 어필했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 첨부 자료에는 국비교육 6개월 동안 제가 정리한 TIL을 첨부했습니다.(포폴은 따로 첨부하지 않았습니다.)&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;ps) STAR 기법으로 작성하는 것을 추천드립니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코딩테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제에 관해서는 자세히 말씀 못드리지만 완전탐색으로는 시간초과가 나는 문제들이었습니다. 적절한 최적화가 필요했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어  N 최대값이 매우 커서 리니어한 알고리즘이 필요하거나,,,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 모든 문제를 다 풀었습니다.(다 맞추지는 못했지만,,,)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 너의 실력이 어느정도냐? 하면 위에 언급한 준비 기간 동안 아래 정도로 문제를 풀었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUCSId/btsMEc7ZW5H/CHl4kovWUNkZggYF0YcuF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUCSId/btsMEc7ZW5H/CHl4kovWUNkZggYF0YcuF1/img.png&quot; data-alt=&quot;BOJ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUCSId/btsMEc7ZW5H/CHl4kovWUNkZggYF0YcuF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUCSId%2FbtsMEc7ZW5H%2FCHl4kovWUNkZggYF0YcuF1%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;352&quot; height=&quot;172&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;BOJ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mVtKy/btsMEqkCCAK/ZBMGeBgOCTzzW4pytnukY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mVtKy/btsMEqkCCAK/ZBMGeBgOCTzzW4pytnukY0/img.png&quot; data-alt=&quot;프로그래머스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mVtKy/btsMEqkCCAK/ZBMGeBgOCTzzW4pytnukY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmVtKy%2FbtsMEqkCCAK%2FZBMGeBgOCTzzW4pytnukY0%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;260&quot; height=&quot;85&quot; data-origin-width=&quot;582&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로그래머스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEhoV/btsMEpFZHdo/fJpREiSVoDWKHKTwK4cAoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEhoV/btsMEpFZHdo/fJpREiSVoDWKHKTwK4cAoK/img.png&quot; data-alt=&quot;LeetCode&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEhoV/btsMEpFZHdo/fJpREiSVoDWKHKTwK4cAoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEhoV%2FbtsMEpFZHdo%2FfJpREiSVoDWKHKTwK4cAoK%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;364&quot; height=&quot;155&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LeetCode&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기업문화 적합도 검사&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기업문화 적합도 검사는 솔직하게 답변했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 인재상에 맞게 답변하겠다고 솔직하지 않은 답변을 하는 것 보다 마음 편하게 가지시고 검사 받는 것을 추천드립니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기술 역량 인터뷰&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 공채가 열리면 네이버 공채 &lt;b&gt;카카오 오픈채팅방&lt;/b&gt;이 생깁니다. 만약 기술 역량 인터뷰 안내를 받으셨다면 그때 오픈채팅방에 들어가 함께 모의 면접 스터디를 할 스터디원들을 구해 &lt;b&gt;스터디를 진행&lt;/b&gt;하는 것을 추천합니다. 저도 스터디를 통해 짧은 기간동안 CS 복기를 할 수 있었고 말문도 트였던 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접에서는 두 가지 스탠스로 임했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아는 것은 확실히 모르는 것은 모른다고 답변&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;면접관님을 실제 함께 일하는 동료라 생각하고 함께 문제를 해결해나간다 생각하면 편하게 면접을 볼 수 있을거라는 생각이 듭니다.&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 data-ke-size=&quot;size16&quot;&gt;기술 역량 인터뷰는 어떤 질문이 나오는지 다른 후기들을 보면 알 수 있습니다. 하지만 종합 역량 인터뷰는 면바면이라는 후기밖에 없어 막막했습니다. 걱정이 앞서지만 이전 인터뷰와 동일하게 모의 면접 스터디를 진행했습니다. 하지만 조금 다른 부분이라면 &lt;b&gt;'개발자 기술 면접 노트' &lt;/b&gt;라는 책을 읽은 것입니다.&lt;/p&gt;
&lt;figure id=&quot;og_1741378396749&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;개발자 기술 면접 노트 | 이남희 - 교보문고&quot; data-og-description=&quot;개발자 기술 면접 노트 | 합격하는 포트폴리오는 무엇이 다를까? 기술 면접에서는 어떤 답변이 최선일까?이 책은 저자가 SI 업체에서 빅테크 기업으로 이직한 경험과 쿠팡과 카카오 면접관으로 &quot; data-og-host=&quot;product.kyobobook.co.kr&quot; data-og-source-url=&quot;https://product.kyobobook.co.kr/detail/S000212738756&quot; data-og-url=&quot;https://product.kyobobook.co.kr/detail/S000212738756&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zz6sJ/hyYmSQrNSj/kJlqxM6oPCoaMc230XGk5K/img.jpg?width=458&amp;amp;height=668&amp;amp;face=0_0_458_668,https://scrap.kakaocdn.net/dn/eNhKO/hyYqLa4cGY/bx6gm1JfDUkx8E2FknrDzk/img.jpg?width=458&amp;amp;height=668&amp;amp;face=0_0_458_668,https://scrap.kakaocdn.net/dn/FagXM/hyYqaa0fUR/QXzh0QtPt85gLnsEvvEMpK/img.png?width=335&amp;amp;height=335&amp;amp;face=0_0_335_335&quot;&gt;&lt;a href=&quot;https://product.kyobobook.co.kr/detail/S000212738756&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://product.kyobobook.co.kr/detail/S000212738756&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zz6sJ/hyYmSQrNSj/kJlqxM6oPCoaMc230XGk5K/img.jpg?width=458&amp;amp;height=668&amp;amp;face=0_0_458_668,https://scrap.kakaocdn.net/dn/eNhKO/hyYqLa4cGY/bx6gm1JfDUkx8E2FknrDzk/img.jpg?width=458&amp;amp;height=668&amp;amp;face=0_0_458_668,https://scrap.kakaocdn.net/dn/FagXM/hyYqaa0fUR/QXzh0QtPt85gLnsEvvEMpK/img.png?width=335&amp;amp;height=335&amp;amp;face=0_0_335_335');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;개발자 기술 면접 노트 | 이남희 - 교보문고&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;개발자 기술 면접 노트 | 합격하는 포트폴리오는 무엇이 다를까? 기술 면접에서는 어떤 답변이 최선일까?이 책은 저자가 SI 업체에서 빅테크 기업으로 이직한 경험과 쿠팡과 카카오 면접관으로&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;product.kyobobook.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 책 챕터8에 2차 면접에 관한 내용이 나오는데 그 부분이 꽤 도움이 되었습니다. 이 챕터뿐만 아니라 책 전체적으로 개발자 취업에 많은 도움이 되는 책입니다. 어느정도 개발자 취업을 위한 공부를 하셨다면 이 책이 도움이 될 것 같습니다.&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;종합 역량 인터뷰는 자기소개서 기반의 질문과 제가 첨부한 TIL에 대한 질문 위주로 나왔습니다. 하지만 모든 질문에 답변을 하지 못했습니다. (핑계지만 면접 이틀 전에 채칼에 손이 베이고,, 당일까지 감기로 고생해서 철저하게 면접준비를 하지 못했습니다 ) 그래도 기술 역량 인터뷰 때와 동일한 스탠스로 모른다고 답변하고 제가 아는 것은 모르는 내용을 질문하실 때까지 답변했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;최종 합격&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/91Ywd/btsMFMGq2GH/Znjas1WG5lgRBFFSZivzs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/91Ywd/btsMFMGq2GH/Znjas1WG5lgRBFFSZivzs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/91Ywd/btsMFMGq2GH/Znjas1WG5lgRBFFSZivzs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F91Ywd%2FbtsMFMGq2GH%2FZnjas1WG5lgRBFFSZivzs0%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;747&quot; height=&quot;395&quot; data-origin-width=&quot;1634&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;오랜 취준 끝에 원하던 기업에 갈 수 있었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여러분도 제 후기를 읽고 최종합격하여 네이버 1784에서 인사할 수 있으면 좋겠습니다!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>회고</category>
      <category>2024</category>
      <category>공채</category>
      <category>네이버</category>
      <category>신입</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/84</guid>
      <comments>https://acisliver.tistory.com/entry/2024-%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%8B%A0%EC%9E%85-%EA%B3%B5%EC%B1%84-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0#entry84comment</comments>
      <pubDate>Sat, 8 Mar 2025 05:48:07 +0900</pubDate>
    </item>
    <item>
      <title>@WebMvcTest, Spring Security 적용 후 403 에러</title>
      <link>https://acisliver.tistory.com/entry/WebMvcTest-Spring-Security-%EC%A0%81%EC%9A%A9-%ED%9B%84-403-%EC%97%90%EB%9F%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;바쁜 현대인을 위한 &lt;a href=&quot;https://acisliver.tistory.com/entry/WebMvcTest-Spring-Security-%EC%A0%81%EC%9A%A9-%ED%9B%84-403-%EC%97%90%EB%9F%AC#%EC%84%B8%20%EC%A4%84%20%EC%9A%94%EC%95%BD-1&quot;&gt;세 줄 요약&lt;/a&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;Spring Security와 커스텀 SecurityFilterChain 적용 후 @WebMvcTest를 적용한 테스트 코드가 테스트를 통과하지 못했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 내가 추가한 SecurityFilterChain 빈 설정 클래스입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711524330949&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(
            HttpSecurity http,
            TokenAuthenticationFilter tokenAuthenticationFilter
    ) throws Exception {
        return http
                .csrf(AbstractHttpConfigurer::disable)
                .formLogin(AbstractHttpConfigurer::disable)
                .httpBasic(AbstractHttpConfigurer::disable)
                .sessionManagement(configurer -&amp;gt; configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .addFilterBefore(tokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
                .authorizeHttpRequests(auth -&amp;gt; auth
                        .anyRequest().permitAll()
                )
                .build();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 해당 커스텀 설정은 적용되지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 이런 현상이 발생했을까?&lt;/p&gt;
&lt;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_1711422165768&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;logging:
  level:
    org:
      springframework:
        security: info&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정하면 애플리케이션이&amp;nbsp; 실행될 때 SecurityFilterChain에 설정된 필터를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 @WebMvcTest가 적용된 테스트의 로그 중 필터를 나타내는 로그입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(가독성을 위해 패키지명과 해시코드를 생략)&lt;/p&gt;
&lt;pre id=&quot;code_1711422395701&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Will secure any request with [
	DisableEncodeUrlFilter, 
	WebAsyncManagerIntegrationFilter, 
	SecurityContextHolderFilter, 
	HeaderWriterFilter, 
	CorsFilter, 
	CsrfFilter, 
	LogoutFilter, 
	UsernamePasswordAuthenticationFilter, 
	DefaultLoginPageGeneratingFilter, 
	DefaultLogoutPageGeneratingFilter, 
	BasicAuthenticationFilter, 
	RequestCacheAwareFilter, 
	SecurityContextHolderAwareRequestFilter, 
	AnonymousAuthenticationFilter, 
	ExceptionTranslationFilter, 
	AuthorizationFilter
]&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;16개의 필터가 설정되어 있습니다. 여기서 이상한 점은 프로젝트에 설정하지 않은 필터가 등록돼 있다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;제가 설정한 필터 체인이 아닌 다른 필터 체인이 등록된 것입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 내가 설정한 필터 목록을 애플리케이션 실행(테스트 실행이 아닌)을 통해 확인한 로그입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711422497722&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Will secure any request with [
	DisableEncodeUrlFilter, 
	WebAsyncManagerIntegrationFilter, 
	SecurityContextHolderFilter, 
	HeaderWriterFilter, 
	CorsFilter, 
	LogoutFilter, 
	TokenAuthenticationFilter, 
	RequestCacheAwareFilter, 
	SecurityContextHolderAwareRequestFilter, 
	AnonymousAuthenticationFilter, 
	SessionManagementFilter, 
	ExceptionTranslationFilter, 
	AuthorizationFilter
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 컨텍스트와 애플리케이션 컨텍스트가 다른 이유를 확인하기 위해 @WebMvcTest가 어떤 컴포넌트를 스캔하는지 확인할 필요가 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@WebMvcTest&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션 컨텍스트 전체를 초기화하지 않고 Spring MVC 관련 컴포넌트들만으로 애플리케이션 컨텍스트를 구성해 테스트 환경을 가볍고 빠르게 만들기 위해 @WebMvcTest를 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Security 또한 이 어노테이션을 통해 설정됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;By default, tests annotated with @WebMvcTest will also auto-configure Spring Security and MockMvc&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 제가 등록한 SecurityFilterChain 빈은 Spring Security와 관련이 없는 건가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 @WebMvcTest 어노테이션에 선언된 어노테이션입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711525677445&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;...
@TypeExcludeFilters(WebMvcTypeExcludeFilter.class)
@AutoConfigureCache
@AutoConfigureWebMvc
@AutoConfigureMockMvc
@ImportAutoConfiguration
public @interface WebMvcTest {
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@TypeExcludeFilters을 살펴봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 애너테이션의 역할은 어떤 클래스를 빈으로 등록할지 나타내고 WebMvcTypeExcludeFilter 클래스에 다음과 같은 코드로 명시되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1711527998880&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static final String[] OPTIONAL_INCLUDES = { &quot;com.fasterxml.jackson.databind.Module&quot;,
        &quot;org.springframework.security.config.annotation.web.WebSecurityConfigurer&quot;,
        &quot;org.springframework.security.web.SecurityFilterChain&quot;, &quot;org.thymeleaf.dialect.IDialect&quot; };

private static final Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; DEFAULT_INCLUDES;

static {
    Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; includes = new LinkedHashSet&amp;lt;&amp;gt;();
    includes.add(ControllerAdvice.class);
    ...
    for (String optionalInclude : OPTIONAL_INCLUDES) {
        try {
            includes.add(ClassUtils.forName(optionalInclude, null));
        }
        catch (Exception ex) {
            // Ignore
        }
    }
    DEFAULT_INCLUDES = Collections.unmodifiableSet(includes);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SecurityFilterChain도 OPTIONAL_INCLUDES로 포함되어 있는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 제가 등록한 SecurityFilterChain 빈은 컴포넌트 스캔되지 않았습니다.&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;이 문제와 관련된 이슈가 이미 존재했습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1711531772448&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;WebMcvTest no longer auto-configures Spring Security when Using SecurityFilterChain Instead of WebSecurityConfigurerAdapter &amp;middot; I&quot; data-og-description=&quot;Copied from spring-projects/spring-security#11275 Describe the bug After upgrading spring-boot-starter-parent from version 2.6.4 to 2.7.0 and then making the suggested changes described in Spring S...&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/spring-projects/spring-boot/issues/31162#issuecomment-1137099136&quot; data-og-url=&quot;https://github.com/spring-projects/spring-boot/issues/31162&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMVlF6/hyVGO2VA09/RZS52diLeotlbaoHsMJ7YK/img.png?width=1200&amp;amp;height=600&amp;amp;face=991_123_1052_190&quot;&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-boot/issues/31162#issuecomment-1137099136&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/spring-projects/spring-boot/issues/31162#issuecomment-1137099136&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMVlF6/hyVGO2VA09/RZS52diLeotlbaoHsMJ7YK/img.png?width=1200&amp;amp;height=600&amp;amp;face=991_123_1052_190');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;WebMcvTest no longer auto-configures Spring Security when Using SecurityFilterChain Instead of WebSecurityConfigurerAdapter &amp;middot; I&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Copied from spring-projects/spring-security#11275 Describe the bug After upgrading spring-boot-starter-parent from version 2.6.4 to 2.7.0 and then making the suggested changes described in Spring S...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조금만 생각해 보면 당연한 것이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 SecurityFilterChain을 등록한 방법은 @Configuration을 에서 @Bean 메서드를 통해 등록했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 SecurityFilterChain 빈이 테스트 컨텍스트에 등록되려면 @Configuration이 선언된 클래스가 먼저 스캔되어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 @Configuration은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;WebMvcTypeExcludeFilter&lt;span&gt; 클래스에 포함돼있지 않습니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;결과적으로 @Configuration 빈을 스캔하지 못해 제가 등록한 SecurityFilterChain을 스캔하지 못한 것입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;테스트를 위해 SecurityFilterChain을 직접 구현해 보았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1711532840853&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Component
public class CustomSecurityFilterChain implements SecurityFilterChain {
    @Override
    public boolean matches(HttpServletRequest request) {
        return false;
    }

    @Override
    public List&amp;lt;Filter&amp;gt; getFilters() {
        return Collections.emptyList();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 추가하니 테스트가 통과했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 @Configuration에서 빈을 등록하고 @WebMvcTest에서 해당 SecurityFilterChain을 사용하는 방법은 무엇일까요?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Import 어노테이션을 통해 SecurityFilterChain을 등록하는 @Bean 메서드가 있는 @Configuration을 스캔합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711533595606&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@WebMvcTest
@Import(WebSecurityConfig.class)
class Test {
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 @Configuration 클래스에 @WebMvcTest가 스캔하지 않는 추가적인 컴포넌트가 필요한 경우 @Import에 추가해주어야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;의문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 마주한 상황에서는 Spring Boot가 제공하는 기본 SecurityFilterChain이 등록되었습니다. 어떻게 이런 일이 가능했을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@WebMvcTest 애노테이션을 살펴보면 답을 알 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711536730897&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
@TypeExcludeFilters(WebMvcTypeExcludeFilter.class)
@AutoConfigureCache
@AutoConfigureWebMvc
@AutoConfigureMockMvc
@ImportAutoConfiguration
public @interface WebMvcTest {
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ImportAutoConfiguration이라는 애노테이션이 기본 SecurityFilterChain을 스캔해주는 것이었습니다!&lt;/p&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;추가적으로&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;@WebMvcTest에서 @Configuration으로 설정한 SecurityFilterChain 빈을 스캔하는 방법을 알아봤습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 방법도 훌륭한 방법이라 생각합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 모든 @WebMvcTest에 @Import를 붙이는 것은 쉬운 일이 아닙니다. 게다가 @Configuration에서 새로운 컴포넌트를 의존하게 된다면 모든 @WebMvcTest에 해당 컴포넌트를 @Import 하거나 @MockBean을 사용하여 모킹해야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 생각해봐야 할 것이 또 한 가지 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Spring의 Test Context 캐싱입니다. Spring은 테스트를 위해 만든 Context를 캐싱해두고 사용합니다. 하지만 Context가 오염된 경우 Context를 재구성합니다. 예를 들어 @MockBean 애노테이션이 있으면 빈을 새로 정의하는 것과 같기 때문에 Context를 다시 구성합니다. 이 점은 @WebMvcTest에서 크게 다가옵니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 @Controller는 @Service 컴포넌트를 의존합니다. 하지만 @WebMvcTest는 이를 스캔하지 않아 일반적으로 @MockBean으로 @Service 컴포넌트를 모킹합니다. 그래서 테스트 클래스가 늘어날 수록 테스트 Context를 구성하는데 오랜 시간이 걸리게 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;단일 테스트 실행의 경우 @WebMvcTest로 필요한 빈만 스캔하는 것은 빠를 수 있지만 CI 환경 같이 전체 테스트케이스 실행의 경우 위와 같은 점은 치명적일 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;@WebMvcTest는 @Configuration에서 등록한 SecurityFilterChain 빈을 스캔하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 @Import로 SecurityFilterChain을 설정한 @Configuration 클래스를 임포트하자.&lt;/p&gt;
&lt;pre id=&quot;code_1711531619565&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@WebMvcTest
@Import(컨피그.class)
class Test {
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Test Context 캐싱을 고려한다면 @SpringBootTest를 사용하는 것도 고려해보자.&lt;/p&gt;</description>
      <category>Spring</category>
      <category>Spring</category>
      <category>spring boot</category>
      <category>Spring Security</category>
      <category>WebMvcTest</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/83</guid>
      <comments>https://acisliver.tistory.com/entry/WebMvcTest-Spring-Security-%EC%A0%81%EC%9A%A9-%ED%9B%84-403-%EC%97%90%EB%9F%AC#entry83comment</comments>
      <pubDate>Wed, 27 Mar 2024 16:28:00 +0900</pubDate>
    </item>
    <item>
      <title>Branch &amp;quot;한국어&amp;quot; is not allowed to deploy to github-pages due to environment protection rules.</title>
      <link>https://acisliver.tistory.com/entry/Branch-%ED%95%9C%EA%B5%AD%EC%96%B4-is-not-allowed-to-deploy-to-github-pages-due-to-environment-protection-rules</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;❓ 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swagger UI를 github page로 배포하려 하였으나 배포가 되지 않았습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚙️ 상황&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희 팀은 이슈를 만들고 이슈에 대한 브랜치를 자동으로 생성해주는 GitHub의 기능을 사용하고 있었습니다.&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;Swagger UI는 다음 레포지토리의 방법을 참고하여 사용했습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1694510877450&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - peter-evans/swagger-github-pages: How to host Swagger API documentation with GitHub Pages&quot; data-og-description=&quot;How to host Swagger API documentation with GitHub Pages - GitHub - peter-evans/swagger-github-pages: How to host Swagger API documentation with GitHub Pages&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/peter-evans/swagger-github-pages&quot; data-og-url=&quot;https://github.com/peter-evans/swagger-github-pages&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PxLfc/hyTVPWC83O/HD9eF17vvkyqE42ww0GYCK/img.png?width=1200&amp;amp;height=600&amp;amp;face=1003_133_1051_185&quot;&gt;&lt;a href=&quot;https://github.com/peter-evans/swagger-github-pages&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/peter-evans/swagger-github-pages&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PxLfc/hyTVPWC83O/HD9eF17vvkyqE42ww0GYCK/img.png?width=1200&amp;amp;height=600&amp;amp;face=1003_133_1051_185');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - peter-evans/swagger-github-pages: How to host Swagger API documentation with GitHub Pages&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;How to host Swagger API documentation with GitHub Pages - GitHub - peter-evans/swagger-github-pages: How to host Swagger API documentation with GitHub Pages&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  원인&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;한국어 브랜치 이름&lt;/b&gt;&lt;/span&gt;이었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;github action의 실패 로그는 다음과 같았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsRiOd/btstCZl51a5/lRkG2y4U5uvDAGxo6zsIM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsRiOd/btstCZl51a5/lRkG2y4U5uvDAGxo6zsIM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsRiOd/btstCZl51a5/lRkG2y4U5uvDAGxo6zsIM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsRiOd%2FbtstCZl51a5%2FlRkG2y4U5uvDAGxo6zsIM0%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;700&quot; height=&quot;103&quot; data-origin-width=&quot;1560&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해석해보면 해당 브랜치로 배포를 할 수 있는 protection rule이 없다는 뜻입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 저는 다음과 같이 설정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Settings &amp;gt; Code and automation &amp;gt; Pages&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCzm7w/btstRTK4IXx/yMRzxSuTsIPgEl3yAr8Fd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCzm7w/btstRTK4IXx/yMRzxSuTsIPgEl3yAr8Fd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCzm7w/btstRTK4IXx/yMRzxSuTsIPgEl3yAr8Fd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCzm7w%2FbtstRTK4IXx%2FyMRzxSuTsIPgEl3yAr8Fd0%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;162&quot; data-origin-width=&quot;606&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Settings &amp;gt; Code and automation &amp;gt;&lt;span&gt; Environments &amp;gt; github-pages &amp;gt; Deployment branches&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt2E9I/btstSyGHDqu/c7FRrk3w0XKpPeXCIMjyvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt2E9I/btstSyGHDqu/c7FRrk3w0XKpPeXCIMjyvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt2E9I/btstSyGHDqu/c7FRrk3w0XKpPeXCIMjyvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt2E9I%2FbtstSyGHDqu%2Fc7FRrk3w0XKpPeXCIMjyvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;142&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 위의 이미지를 잘 보시면 다음과 같은 문장이 있다는 것을 눈치채실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #1f2328; text-align: start;&quot;&gt;&lt;b&gt;Currently applies to 0 branches&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199; color: #1f2328; text-align: start;&quot;&gt;&lt;/span&gt;즉, 해당 설정이 적용되지 않았다는 의미입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;정확한 원인은 모르겠지만 GitHub에서 한국어 패턴으로 브랜치를 찾지 못하는 것 같아 브랜치 이름을 영어로 바꾸어 해결했습니다.&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Project</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/81</guid>
      <comments>https://acisliver.tistory.com/entry/Branch-%ED%95%9C%EA%B5%AD%EC%96%B4-is-not-allowed-to-deploy-to-github-pages-due-to-environment-protection-rules#entry81comment</comments>
      <pubDate>Tue, 12 Sep 2023 18:44:47 +0900</pubDate>
    </item>
    <item>
      <title>생성자에서 @Value로 외부 변수 주입</title>
      <link>https://acisliver.tistory.com/entry/%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90%EC%84%9C-Value%EB%A1%9C-%EC%99%B8%EB%B6%80-%EB%B3%80%EC%88%98-%EC%A3%BC%EC%9E%85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발을 하다보면 시스템에 필요한 상수가 존재합니다. ex)비밀키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 속성 파일(application.yml)이나 환경 변수로 빼서 관리할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 필요한 상수를 관리하면 Java 소스코드를 재컴파일 하지 않아도 값을 변경할 수 있고 실행 환경에 따라 다른 값을 설정할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 위와 같은 경우 보통 다음과 같이 사용했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693274970721&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Value(&quot;${prefix.value}&quot;)
private String value;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위 방식은 문제가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;@Value 어노테이션 동작 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 문제가 있는지 알아보기 전에 잠시 @Value 어노테이션의 동작 방식을 알아봅시다.&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;@Value 어노테이션은 Spring IoC 컨테이너의 DI 과정과 비슷한 규칙으로 동작합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필드에 작성한 어노테이션은 DI의 필드 인젝션처럼 Java Reflecation API를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필드 인젝션은 다음과 같은 과정을 거칩니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Bean을 생성합니다.&lt;/li&gt;
&lt;li&gt;Bean 초기화 과정에서 @Value가 붙은 필드를 찾습니다. - Java Reflecation API 사용&lt;/li&gt;
&lt;li&gt;해당 필드를 지정된 표현식 또는 값으로 설정합니다.&lt;/li&gt;
&lt;/ol&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;저희가 원하는 것은 상수를 설정하는 것이기 때문에 필드에 final을 붙이고 싶습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 코드를 다음과 같이 변경해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693284323808&quot; class=&quot;kotlin&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Value(&quot;${prefix.value}&quot;)
private final String value;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같은 컴파일 에러를 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Variable 'value' might not have been initialized&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;어찌보면 당연한 결과입니다. 컴파일러 입장에서는 final 변수는 초기화되지 않았기 때문입니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;테스트 용이성이 떨어짐&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;두 번째는 테스트 용이성 떨어지는 것입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 필드 인젝션은 Java Reflection API을 사용해 설정한다고 설명했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이는 접근 제한자가 제약을 우회하여 직접 필드에 값을 설정하는 것을 의미합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 필드에 @Value 어노테이션이 붙은 클래스를 테스트하려면 테스트 코드에서도 리플렉션을 사용하여 값을 설정해야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이는 테스트 코드를 작성하기 힘들게 만듭니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필드 주입 대신 생성자 주입을 사용하여 해결할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성자 주입은 다음과 같은 장점이 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;final 필드를 생성자에서 초기화할 수 있다.&lt;/li&gt;
&lt;li&gt;IoC 컨테이너가 없어도 테스트 코드에서 원하는 값을 생성자로 전달할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 문제점이 모두 해결됐습니다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 코드를 다음과 같이 수정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1693285711523&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Hello {
    private final String value;
    
    public Hello(@Value(&quot;${prefix.value}&quot;) String value) {
    	this.value = value;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;필드 주입 대신 생성자 주입을 사용하자!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/70144160/how-to-get-spring-value-annotated-values-injected-even-before-calling-the-const&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@Value의 동작은 Spring DI와 비슷하게 동작한다.&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #404040; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gustavopeiretti.com/spring-boot-value-annotation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Understanding Spring Boot @Value Annotation&lt;/a&gt;&lt;/p&gt;</description>
      <category>Spring</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/80</guid>
      <comments>https://acisliver.tistory.com/entry/%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90%EC%84%9C-Value%EB%A1%9C-%EC%99%B8%EB%B6%80-%EB%B3%80%EC%88%98-%EC%A3%BC%EC%9E%85#entry80comment</comments>
      <pubDate>Tue, 29 Aug 2023 14:12:44 +0900</pubDate>
    </item>
    <item>
      <title>테스트 네이밍</title>
      <link>https://acisliver.tistory.com/entry/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%84%A4%EC%9D%B4%EB%B0%8D</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;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;단위 테스트라면 테스트 클래스의 이름은 테스트하고자 하는 클래스 이름 뒤에 Test를 붙이는게 일반적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드의 경우 테스트하고자 하는 클래스의 public 메소드의 이름을 그대로 사용할 수 있다.&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;예시로 인자로 주어진 언어(Language)에 따라 다른 인사말을 반환하는 클래스가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1693036186136&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Hello {

    public String hello(Language language) {
        if (language == Language.KOREAN) {
            return &quot;안녕하세요&quot;;
        }
        return &quot;Hello&quot;;
    }

    enum Language {
        KOREAN, ENGLISH;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ의 Create Test단축키(Cmd + Shift + T)를 사용하면 클래스명 + Test라는 테스트 클래스가 자동으로 생성된다. 또한 테스트할 public 메서드도 선택할 수 있다.&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;예제 클래스에서 Create Test 단축키를 사용했을 때의 모습이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKjBcc/btssc9J3H5o/ONeOPUnsru15SE2KD3W5r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKjBcc/btssc9J3H5o/ONeOPUnsru15SE2KD3W5r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKjBcc/btssc9J3H5o/ONeOPUnsru15SE2KD3W5r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKjBcc%2Fbtssc9J3H5o%2FONeOPUnsru15SE2KD3W5r1%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;593&quot; height=&quot;489&quot; data-origin-width=&quot;1406&quot; data-origin-height=&quot;1160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 네이밍으로 알 수 있는 정보는 &lt;b&gt;'테스트 대상'&lt;/b&gt;일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것만으로 내가 하고자하는 테스트의 의미를 충분히 전달할 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트는 프로그래밍 관점에서 볼 것이 아니라 비즈니스 관점에서 봐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 네이밍으로&amp;nbsp;&lt;b&gt;'Hello.class의 hello 메서드를 테스트 한다.'&lt;/b&gt;는 의미는 전달됐다.   프로그래밍 관점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 &lt;b&gt;'언어에 따라 다른 인사말을 반환해야 한다.'&lt;/b&gt;는 의미는 전달되지 않았다.   비즈니스 관점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 어떤 내용을 더 담아야 비즈니스적인 내용을 테스트에 담을 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 내용이 추가로 필요한다.&lt;/p&gt;
&lt;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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;Hello.class의 hello 메서드는 한국어가 주어졌다면, '안녕하세요'를 반환해야 한다.&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 네이밍할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 테스트를 작성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1693046779098&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import static org.assertj.core.api.Assertions.assertThat;

@DisplayName(&quot;Hello 클래스&quot;)
class HelloTest {

    @DisplayName(&quot;한국어가 주어졌다면, '안녕하세요'를 반환해야 한다.&quot;)
    @Test
    void givenKorean_whenHello_thenKoreanHello() {
        // given
        Hello.Language language = Hello.Language.KOREAN;
        Hello hello = new Hello();

        // when
        String koreanHello = hello.hello(language);

        // then
        assertThat(koreanHello).isEqualTo(&quot;안녕하세요&quot;);
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@Display의 장점  &lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;@Display의 장점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한국어로 이름을 지으면 문제가 되지 않을까라는 걱정이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 @Display를 사용하면 주석처럼 한국어를 사용하고 그 결과를 테스트 화면에서 볼수 있다!&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;@Display는 클래스와 메소드 레벨에 붙일 수 있다. 아래 @Target에 TYPE, METHOD라고 선언되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1693047563127&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@API(status = STABLE, since = &quot;5.0&quot;)
public @interface DisplayName {

	String value();

}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 작성하면 다음과 같은 장점이 생긴다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가독성 향상
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 메서드 바디를 읽지 않아도 어떤 내용을 검증하는지 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;문서화 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비즈니스 요구사항이 코드에 드러나므로 이를 기준으로 개발을 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유지보수 용이
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 실패 시 어떠한 비즈니스 요구사항을 만족시키지 못하는지 바로 알 수 있다.&lt;/li&gt;
&lt;li&gt;요구사항이 변경되면 어떤 테스트를 변경해야할지 바로 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://osherove.com/blog/2005/4/3/naming-standards-for-unit-tests.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Naming standards for unit tests - Roy Osherove&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://martinfowler.com/bliki/GivenWhenThen.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GivenWhenThen - Martin Fowler&lt;/a&gt;&lt;/p&gt;</description>
      <category>Spring</category>
      <category>Spring</category>
      <category>test</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/79</guid>
      <comments>https://acisliver.tistory.com/entry/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%84%A4%EC%9D%B4%EB%B0%8D#entry79comment</comments>
      <pubDate>Sat, 26 Aug 2023 20:00:47 +0900</pubDate>
    </item>
    <item>
      <title>추상 메서드가 2개인 함수형 인터페이스</title>
      <link>https://acisliver.tistory.com/entry/%EC%B6%94%EC%83%81-%EB%A9%94%EC%84%9C%EB%93%9C%EA%B0%80-2%EA%B0%9C%EC%9D%B8-%ED%95%A8%EC%88%98%ED%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이펙티브 자바를 읽다가 Comparator&amp;lt;T&amp;gt; 인터페이스 코드를 봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;근데 @FunctionalInterface 어노테이션이 붙어있음에도 불구하고 두 개의 추상 메서드를 가지고 있는 겁니다!!&lt;/p&gt;
&lt;pre id=&quot;code_1689815259593&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package java.util;

@FunctionalInterface
public interface Comparator&amp;lt;T&amp;gt; {

  // abstract method
  int compare(T o1, T o2);

  // abstract method
  boolean equals(Object obj);

  // few default and static methods
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헉 진짜 두 개네..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 Java를 조금 만져보신 분들은 눈치를 채셨을 텐데요. 두 번째 추상 메서드가 equals 메서드라는 점이 눈에 띄었을 겁니다. 이점을 생각하면서 Comparator 인터페이스를 구현하는 과정을 살펴보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;구현할 클래스를 만든다.&lt;/li&gt;
&lt;li&gt;Comparator 인터페이스를 implements 한다.&lt;/li&gt;
&lt;li&gt;인터페이스의 추상 메서드를 구현한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 다음과 같은 코드가 작성됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1689816132608&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CustomComparator implements Comparator&amp;lt;Object&amp;gt; {
		
    @Override
    public int compare(Objects o1, Objects o2) {
        return 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 까지만 작성해도 컴파일러는 아무 에러를 발생시키지 않습니다. 오잉 그럼 equals 메서드는?&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;사실 위 코드에는 숨겨진 부분이 있습니다. 바로 java.lang.Object를 상속받는 코드가 생략되어 있습니다. 그리고 Object 클래스에 equals 메서드가 이미 정의되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689816299233&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class CustomComparator extends Object implements Comparator&amp;lt;Objects&amp;gt; {

    @Override
    public int compare(Objects o1, Objects o2) {
        return 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 컴파일러가 equals 메서드를 추상 메서드로 판단하지 않아 Comparator에 추상 메서드는 하나가 됩니다. (어차피 클래스로 구현하면 Object 클래스가 무조건 구현하니까!)&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;그렇다면 왜 Comparator 인터페이스에 equals 메서드를 선언해두었을까요? 이 이유는 &lt;a href=&quot;https://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#equals%28java.lang.Object%29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;javadoc&lt;/a&gt;에 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 요약하면,&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;Object.equals(Object)&amp;nbsp;를&amp;nbsp;재정의&amp;nbsp;하지&amp;nbsp;않는&amp;nbsp;것이&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;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;두&amp;nbsp;개의&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;비교기가&amp;nbsp;동일한&amp;nbsp;순서를&amp;nbsp;부과하도록&amp;nbsp;결정함으로써&amp;nbsp;성능이&amp;nbsp;향상&lt;/b&gt;&lt;/span&gt;될&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;comp1.equals(comp2)&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))&lt;/b&gt;&lt;/span&gt;를 암시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우가 어떤 경우일지는 잘 상상이 되지 않지만 언젠간 도움이 될거라 생각합니다!&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;+ 추가)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Comparator 인터페이스에는 @FunctionalInterface 라는 애노테이션이 붙어있는데 이 애노테이션은 인터페이스가 함수형 인터페이스임을 나타냅니다. 함수형 인터페이스는 하나의 추상 메서드만 가지는 인터페이스로 Comparator 인터페이스는 두 개의 추상 메서드를 가지기 때문에 컴파일 오류가 날 것으로 보이지만 그렇지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Refernce&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://mkyong.com/java8/is-comparator-a-function-interface-but-it-has-two-abstract-methods/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mkyong.com/java8/is-comparator-a-function-interface-but-it-has-two-abstract-methods/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#equals%28java.lang.Object%29&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html#equals%28java.lang.Object%29&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>Java</category>
      <category>Comparator</category>
      <category>FuntionalInterface</category>
      <category>Java</category>
      <category>함수형인터페이스</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/78</guid>
      <comments>https://acisliver.tistory.com/entry/%EC%B6%94%EC%83%81-%EB%A9%94%EC%84%9C%EB%93%9C%EA%B0%80-2%EA%B0%9C%EC%9D%B8-%ED%95%A8%EC%88%98%ED%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4#entry78comment</comments>
      <pubDate>Thu, 20 Jul 2023 11:51:04 +0900</pubDate>
    </item>
    <item>
      <title>[구름톤 트레이닝 풀스택] 8주차 회고</title>
      <link>https://acisliver.tistory.com/entry/%EA%B5%AC%EB%A6%84%ED%86%A4-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%8B%9D-%ED%92%80%EC%8A%A4%ED%83%9D-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;6주차랑 7주차를 어디 두고 8주차가 되었는가 하면...&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;지난 회고에서 언급한 국방 데이터 공모전이 바빠지면서 앞만 보고 달렸기 때문이랍니다 &lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 팀장님의 &lt;s&gt;쪼기&lt;/s&gt; 리더쉽 덕분에 배포까지 마쳤습니다!&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&lt;s&gt;API 요청 제한 있으니까 너무 많이 놀러 오지는 마세요&lt;/s&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1689521821433&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MILROUTE&quot; data-og-description=&quot;공유기능 | 군인들을 위한 최소 시간 경로 찾아주기&quot; data-og-host=&quot;milroute.s3-website.us-east-2.amazonaws.com&quot; data-og-source-url=&quot;http://milroute.s3-website.us-east-2.amazonaws.com/&quot; data-og-url=&quot;http://milroute.s3-website.us-east-2.amazonaws.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/77fur/hyTk9B0CVN/RfB56XTzCssY91rvedWRek/img.png?width=241&amp;amp;height=241&amp;amp;face=0_0_241_241&quot;&gt;&lt;a href=&quot;http://milroute.s3-website.us-east-2.amazonaws.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://milroute.s3-website.us-east-2.amazonaws.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/77fur/hyTk9B0CVN/RfB56XTzCssY91rvedWRek/img.png?width=241&amp;amp;height=241&amp;amp;face=0_0_241_241');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MILROUTE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;공유기능 | 군인들을 위한 최소 시간 경로 찾아주기&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;milroute.s3-website.us-east-2.amazonaws.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;s&gt;근데 솔직히 혼자 너무 많은거 한 거 아냐???&lt;/s&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;어쨌든 이번 회고는 3주치 회고입니다!&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  Keep&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TIL&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3주간 나름 기록을 잘 남겼습니다! 공모전에 집중하는 기간에도 고민이 생기면 바로 기록하고 래퍼런스를 기록했습니다. 물론 제대로 언젠간 정리해야겠지만 기록하는 습관을 계속 이어가고 있습니다!&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공모전이 끝나고 학습에 집중한 주는 TIL을 어마어마하게 작성해버렸습니다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2822&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPRNoK/btsnOslCMnC/y7ALstkVlqrbgBzA1o2zE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPRNoK/btsnOslCMnC/y7ALstkVlqrbgBzA1o2zE1/img.png&quot; data-alt=&quot;8주차 TIL&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPRNoK/btsnOslCMnC/y7ALstkVlqrbgBzA1o2zE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPRNoK%2FbtsnOslCMnC%2Fy7ALstkVlqrbgBzA1o2zE1%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;2822&quot; height=&quot;1652&quot; data-origin-width=&quot;2822&quot; data-origin-height=&quot;1652&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;8주차 TIL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; ️ Problem&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매주 회고를 적고 싶었지만 공모전 하나에 무너져버렸네요... 그래도 다시 쌓아 올려야죠! 이것과 관련된 영상을 아래 추가하려합니다..!&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  Try&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;블로그 포스팅&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공모전을 마쳤으니 어서 공모전 관련 글들을 쏟아내야겠습니다... 그래서 &lt;s&gt;매일 글을 하나 이상 포스팅해보렵니다!&lt;/s&gt; 실패!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;새로운 스터디 - 알고리즘&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;7월이 시작되면서 구름톤도 새로운 스터디를 시작했습니다. 이번 스터디를 실습 시작 전까지 쭉 이어갈 예정입니다! 실습도 같이 할지도!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLpYuD/btsnFeWKmxd/HJ8plRfZwhKe4Pr9B1FUk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLpYuD/btsnFeWKmxd/HJ8plRfZwhKe4Pr9B1FUk1/img.png&quot; data-alt=&quot;팀명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLpYuD/btsnFeWKmxd/HJ8plRfZwhKe4Pr9B1FUk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLpYuD%2FbtsnFeWKmxd%2FHJ8plRfZwhKe4Pr9B1FUk1%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;400&quot; height=&quot;60&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;팀명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;저희 조 이름은 네카라구(름)배입니다! 처음 스터디를 모집할 때 &quot;대기업 코테를 풀 수 있는 자신감을 가지도록 알고리즘을 준비하자.&quot;는 문구에 영감을 받았습니다. 네카라구배조 화이팅!&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;해주고 싶은 말&lt;/h2&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=VOk0_wfaDcU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cpCG9d/hyTlfCeQPv/uSXz2S4PCHvwAXOJIVz7Q1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=578_104_706_244&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-original-url=&quot;&quot; data-video-title=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/VOk0_wfaDcU&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하루 빼먹었다고 안하지 말고 그냥 하자!!!&lt;/p&gt;</description>
      <category>회고</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/76</guid>
      <comments>https://acisliver.tistory.com/entry/%EA%B5%AC%EB%A6%84%ED%86%A4-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%8B%9D-%ED%92%80%EC%8A%A4%ED%83%9D-8%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry76comment</comments>
      <pubDate>Mon, 17 Jul 2023 01:10:54 +0900</pubDate>
    </item>
    <item>
      <title>[구름톤 트레이닝 풀스택] 5주차 회고</title>
      <link>https://acisliver.tistory.com/entry/%EA%B5%AC%EB%A6%84%ED%86%A4-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%8B%9D-%ED%92%80%EC%8A%A4%ED%83%9D-5%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&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;h2 data-ke-size=&quot;size26&quot;&gt;  Keep&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Learning with Doing을 실천 중입니다! 국방부 공공데이터 공모전 출품 준비를 하면서 백엔드 개발을 하고 있습니다. 혼자 백엔드를 맡은 적은 처음이라 많이 고생하지만 그만큼 배우는 게 있어서 나름 재미있게 코딩하고 있습니다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ Problem&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공모전 개발 기간이 짧기 때문에 구름톤 트레이닝 시간에도 개발을 하고 있습니다. 그러다 보니 수업을 못 따라가 과정에 참여하는 의미가 많이 흐려지는 것 같습니다... 그래서 조금 바쁘더라도 오전 시간에는 최대한 수업을 듣기로 결정했습니다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Try&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;오전 시간 활용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구름톤 트레이닝 과정의 오전 수업 시간은 10시부터 13시입니다. 그래서 3시간 동안 2 : 1로 수업과 알고리즘 문제 풀이를 하려 합니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Known Unknown 보드  최신화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TIL은 잘 작성하지만 Known Unknown은 잘 최신화가 되지 않는 것 같아서 조금 더 신경 써 보도록 하겠습니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;고민들&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 중, 학습 중 생긴 고민들을 간단히 정리하려 합니다. 경험을 통해 얻은 지식은 오래가니까요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TIL 아카이빙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TIL를 저 혼자만 보면 아까워서 블로그 글로 정리해보려 합니다! 우선은 이펙티브 자바를 파트별로 정리해보려 합니다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;내게 해주고 싶은 말&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;급할수록 돌아가라&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>회고</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/75</guid>
      <comments>https://acisliver.tistory.com/entry/%EA%B5%AC%EB%A6%84%ED%86%A4-%ED%8A%B8%EB%A0%88%EC%9D%B4%EB%8B%9D-%ED%92%80%EC%8A%A4%ED%83%9D-5%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry75comment</comments>
      <pubDate>Sun, 25 Jun 2023 17:15:40 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] LCS - 9251</title>
      <link>https://acisliver.tistory.com/entry/BOJ-LCS-9251</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;  문제&lt;/h3&gt;
&lt;figure id=&quot;og_1687238879915&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;9251번: LCS&quot; data-og-description=&quot;LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9251&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9251&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/v65RP/hyS2zIMfte/827YenpY21muA4QzoceCF0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9251&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9251&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/v65RP/hyS2zIMfte/827YenpY21muA4QzoceCF0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;9251번: LCS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;DP&lt;/b&gt;&lt;/span&gt;로 풀 수 있습니다. 우선 LCS(Longest Common Subsequence)를 예시로 이해해봅시다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 두 문자열이 주어집니다. (더 많을 수도 있지만 문제에서는 2개가 주어집니다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACAYKP&lt;/li&gt;
&lt;li&gt;CAPCAK&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서브 시퀀스는 주어진 문자열에서 순서를 바꾸지 않고 몇 개의 글자를 뺀 것을 말합니다. 첫 번째 문자열의 경우 ACA, AKP, C 등이 서브 시퀀스가 됩니다.&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;LCS는 구할 수 있는 모든 서브 시퀀스 중 서로 같은 가장 긴 서브 시퀀스를 의미합니다. 예시의 경우 ACAK가 LCS가 됩니다.&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;LCS를 구하기 위해 모든 서브 시퀀스를 구하고 비교한다면 한 문자열의 서브 시퀀스를 구하는데 오랜 시간이 걸립니다. 하지만 DP를 사용하면 두 문자열의 길이의 곱의 시간으로 LCS를 구할 수 있습니다.&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;길이가 A, B인 문자열이 있을 때 이 두 문자열의 LCS의 길이를 LCS(A, B)라 합시다. 이때 LCS(A, B)는 다음을 만족합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;str1[A] == str2[B] 라면 str1[A]로 끝나는 LCS가 존재한다. 즉, LCS(A, B) = LCS(A -1, B - 1) + 1 을 만족합니다.&lt;/li&gt;
&lt;li&gt;만약 그렇지 않다면, LCS(A, B) = max(LCS(A - 1, B), LCS(A, B - 1))이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 메모리제이션을 적용해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687243207727&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static int LCS(int x, int y) {

    if (x &amp;lt; 0 || y &amp;lt; 0) return 0;

    if (DP[x][y] != -1) return DP[x][y];

    if (str1[x] == str2[y]) {
        return DP[x][y] = LCS(x - 1, y - 1) + 1;
    }

    return DP[x][y] = Math.max(LCS(x - 1, y), LCS(x, y -1));
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  코드&lt;/h3&gt;
&lt;pre id=&quot;code_1687243243680&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

import static java.lang.System.in;

public class Main {

    static int[][] DP;
    static char[] str1, str2;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        str1 = br.readLine().toCharArray();
        str2 = br.readLine().toCharArray();
        DP = new int[1004][1004];
        for (int i = 0; i &amp;lt; 1004; i++) {
            Arrays.fill(DP[i], -1);
        }
        System.out.println(LCS(str1.length - 1, str2.length - 1));
    }

    private static int LCS(int x, int y) {

        if (x &amp;lt; 0 || y &amp;lt; 0) return 0;

        if (DP[x][y] != -1) return DP[x][y];

        if (str1[x] == str2[y]) {
            return DP[x][y] = LCS(x - 1, y - 1) + 1;
        }

        return DP[x][y] = Math.max(LCS(x - 1, y), LCS(x, y -1));
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/73</guid>
      <comments>https://acisliver.tistory.com/entry/BOJ-LCS-9251#entry73comment</comments>
      <pubDate>Tue, 20 Jun 2023 15:40:58 +0900</pubDate>
    </item>
    <item>
      <title>[구름톤 트레이닝 풀스택] 4주차 회고</title>
      <link>https://acisliver.tistory.com/entry/%EA%B5%AC%EB%A6%84%ED%86%A4-%ED%92%80%EC%8A%A4%ED%83%9D-4%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0</link>
      <description>&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;그래서 TIL이 처참합니다ㅠㅠ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 월, 금은 알고리즘 문제도 풀고 공모전 준비도 했습니다! &lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;예비군&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 공병 출신이라 73사단 공병대대에 다녀왔습니다. 4년 차라 동원훈련이었지만 3년 차동안 코로나 버프와 학생예비군으로 꿀을 빨았기 때문에 처음이자 마지막 동원훈련이였습니다ㅎ(&lt;s&gt;하지만 4년 차는 피해 갈 수 없었다.&lt;/s&gt;)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공모전&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2주차 회고부터 Learning with Doing이라고 배운 것을 실전에 적용해 보는 방식으로 학습하길 원했습니다. 그래서 국방 공공데이터 활용 경진대회에 서비스를 출품하기로 했습니다. 현재 기획자 1, FE 2, BE 1로 구성된 팀으로 국방 공공데이터를 활용하여 서비스를 개발하고 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 아이디어까지만 정해진 상태고 정확한 기획은 이번주 중에 완료될 것 같습니다! 추후에 어떤 식으로 공모전을 준비했는지 정리하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR5J8U/btskgfE65iO/v3Weh98tzb5T9KEAZddmS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR5J8U/btskgfE65iO/v3Weh98tzb5T9KEAZddmS0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR5J8U/btskgfE65iO/v3Weh98tzb5T9KEAZddmS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR5J8U%2FbtskgfE65iO%2Fv3Weh98tzb5T9KEAZddmS0%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;400&quot; height=&quot;566&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이번주는 이틀밖에 공부를 못해서 Keep-Problem-Try는 생략하겠습니다.&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;내게 해주고 싶은 말&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;거 좀 힘들다고 울어 버릇하지마&lt;br /&gt;어차피 내일도 힘들어&lt;br /&gt;-스물-&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>회고</category>
      <author>acisliver</author>
      <guid isPermaLink="true">https://acisliver.tistory.com/72</guid>
      <comments>https://acisliver.tistory.com/entry/%EA%B5%AC%EB%A6%84%ED%86%A4-%ED%92%80%EC%8A%A4%ED%83%9D-4%EC%A3%BC%EC%B0%A8-%ED%9A%8C%EA%B3%A0#entry72comment</comments>
      <pubDate>Mon, 19 Jun 2023 11:23:30 +0900</pubDate>
    </item>
  </channel>
</rss>