<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>내가보려고만든 메자노트</title>
    <link>https://technote-mezza.tistory.com/</link>
    <description>정리 안되는 본인 정리 좀 해보려고 만든 블로그</description>
    <language>ko</language>
    <pubDate>Tue, 14 Apr 2026 23:11:20 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>메자곰</managingEditor>
    <image>
      <title>내가보려고만든 메자노트</title>
      <url>https://tistory1.daumcdn.net/tistory/3901049/attach/4dee25ad043e452aabfca0f4afa59b52</url>
      <link>https://technote-mezza.tistory.com</link>
    </image>
    <item>
      <title>[Git] commit 메시지, 시간 수정하기</title>
      <link>https://technote-mezza.tistory.com/117</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Commit 하기&lt;/h3&gt;
&lt;pre id=&quot;code_1651569222205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit -m &quot;커밋 메세지&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;이 명령어로 수정 파일들을 커밋할 수 있다.&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;Commit 수정하기&lt;/h3&gt;
&lt;pre id=&quot;code_1651569375368&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit --amend 
// 수정 창이 뜨면 i키로 입력모드로 변환
// 수정할 부분 수정 후
// esc 키 
// :wq 입력해서 저장하고 나오기&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어로 가장 최신 커밋 메시지를 수정할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더불어 이 명령어는 가장 최신 커밋 이후에 수정된 파일 중 stage에 존재하는 즉, add를 수행한 파일도 함께 커밋에 추가할 수 있다.&lt;/p&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;하지만 git commit --amend 명령어는 최신 커밋 메시지에서 수정의 개념이기 때문에 가장 최초에 commit을 수행한 날짜, 시간으로 기록된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Commit 날짜 마지막 수정일로 변경하기&lt;/h3&gt;
&lt;pre id=&quot;code_1651569583046&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git commit --amend --date=&quot;now&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;commit 메시지 수정하며 해당 날짜, 시각도 함께 업데이트해야 할 경우가 있다. 이때 사용되는 게 아래의 명령어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸로 commit을 수정할 때처럼 수정하고 저장하면 마지막 수정한 날짜와 시간으로 기록된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git</category>
      <category>amend</category>
      <category>commit 수정</category>
      <category>date 수정</category>
      <category>git</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/117</guid>
      <comments>https://technote-mezza.tistory.com/117#entry117comment</comments>
      <pubDate>Tue, 3 May 2022 18:21:12 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 삼항 연산자 tip ( '??' 사용)</title>
      <link>https://technote-mezza.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기본 적으로 삼항 연산자는 이렇게 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1648188650260&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const val = val ? '참일 경우 값' : '거짓일 경우 값'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 js는 축약으로 이렇게도 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1648188704141&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const val = a?.b?.c ? '참일 경우 값' : '거짓일 경우 값'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a.b.c 의 값을 체크하기 전에 a와 b에 값이 존재하는지를 먼저 확인하는 코드이다. a.b가 없는데 a.b.c를 하면 당연히 에러가 나게 된다.&lt;/p&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;추가로 undefined와 null을 체크하기 위해 중복으로 나열하지 않고 이렇게 사용할 수도 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1648188828434&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//undefined || null이면 ''값으로 치환
const val = val ?? '';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 Java&amp;nbsp; 개발을 하다가 javascript로 개발을 하면 이렇게 축약해서 편리하긴 하다. 물론 헷갈리고 어려운 점도 당연히 존재...&lt;/p&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;그 외 여러 javascript 축약 코딩 기법들이 있으니 여기서 확인!&amp;nbsp;&lt;a href=&quot;https://www.sitepoint.com/shorthand-javascript-techniques/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;25+ JavaScript Shorthand Coding Techniques&lt;/a&gt;&lt;/p&gt;</description>
      <category>언어/javascript</category>
      <category>JavaScript</category>
      <category>js</category>
      <category>삼항 연산자</category>
      <category>줄여쓰기</category>
      <category>축약코딩</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/116</guid>
      <comments>https://technote-mezza.tistory.com/116#entry116comment</comments>
      <pubDate>Fri, 25 Mar 2022 15:21:59 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 특정 파일을 local에서만 ignore 시키고 싶다면? (commit 시 제외)</title>
      <link>https://technote-mezza.tistory.com/115</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;잘 알다시피 git은. ignore를 통해 변경사항을 추적하지 않고 무시하고 싶은 파일들을 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 .ignore파일이 원격 저장소로 올라가게 되면 여기에 설정된 무시하고 싶은 파일들은 프로젝트원 모두에게 해당되어 변경된 파일에 잡히지 않게 된다.&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;하지만, 혼자 local에서 테스트할 때 필요한 코드, 설정이 있는 경우가 종종 있다. 물론 .ignore를 push하지 않고 사용할 수 있지만,&amp;nbsp; &quot; git status &quot; 로 작업내용을 확인할 때 계속 남아있게 된다. 이경우 다른 방법으로 해결할 수 있다!&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;방법 1&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. terminal에서 해당 git 파일로 이동&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 명령어 입력&lt;/h4&gt;
&lt;pre id=&quot;code_1647937249230&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vim .git/info/exclude&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 제외시킬 파일 경로를 입력&amp;nbsp; (i 키를 눌러서 편집 가능한 모드로 변경 후 입력)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXFgKw/btrwVrLEo4G/vFbcK1BclUbqy8gudKmII0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXFgKw/btrwVrLEo4G/vFbcK1BclUbqy8gudKmII0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXFgKw/btrwVrLEo4G/vFbcK1BclUbqy8gudKmII0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXFgKw%2FbtrwVrLEo4G%2FvFbcK1BclUbqy8gudKmII0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;235&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;235&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;h4 data-ke-size=&quot;size20&quot;&gt;4. esc 키 누르고 :wq 입력해서 저장 후 종료&lt;/h4&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;h2 data-ke-size=&quot;size26&quot;&gt;방법 2&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. terminal에서 명령어 입력&lt;/h4&gt;
&lt;pre id=&quot;code_1647938624159&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git update-index --assume-unchanged 파일경로&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 제외시킨 파일을 다시 되돌리고 싶다면, 아래 명령어로 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1647938692338&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git update-index --no-assume-unchanged 파일경로&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Git</category>
      <category>.ignore</category>
      <category>git</category>
      <category>local ignore</category>
      <category>커밋 제외</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/115</guid>
      <comments>https://technote-mezza.tistory.com/115#entry115comment</comments>
      <pubDate>Tue, 22 Mar 2022 17:47:02 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] forEach 안에서 return/break 처리?</title>
      <link>https://technote-mezza.tistory.com/114</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&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;js를 익숙하게 사용하시는 분들이라면 알겠지만, js가 처음이거나 익숙하지 않다면 놓칠 수 있는 부분이다. 나 역시 Vue.js를 다룰일이 생겨서 개발 중에 원하는 값이 나오지 않아 디버깅하다가 발견 ㅎ..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;잘못된 사용 예시&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1647308443522&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; const arr = [1,2,3,4,5];
 
 arr.forEach((value) =&amp;gt; {
 	if(value == 3) return;
    console.log(value);
    });
  // 기대 실제
  // 1    1
  // 2    2
  // 3    4
  //      5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 예시에서 return후 forEach문을 빠져나오지 않고 마치 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;'continue'처럼&lt;/b&gt;&lt;/span&gt; 동작한다. (forEach에서 continue는 쓸 수 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forEach를 단순히 for문으로 생각하고 사용했기 때문이다. &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;forEach는 예외를 던지지 않고는 멈추지 못한다.&lt;/span&gt;&amp;nbsp;&lt;/b&gt;그러므로 중간에 멈추는 등 기대하는 결과를 얻기 위해서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그&lt;/b&gt;&lt;b&gt;냥 for문을 사용하자.&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;추가로 다른 배열 메서드인 some() 등도 사용 가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>개발/에러,이슈</category>
      <category>foreach</category>
      <category>forEach종료</category>
      <category>JavaScript</category>
      <category>Vue.js</category>
      <category>반복문</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/114</guid>
      <comments>https://technote-mezza.tistory.com/114#entry114comment</comments>
      <pubDate>Tue, 15 Mar 2022 11:29:04 +0900</pubDate>
    </item>
    <item>
      <title>[JUnit] mock 테스트시 호출 method 내부 local variable 값 확인하기</title>
      <link>https://technote-mezza.tistory.com/113</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;mock 테스트 코드를 작성 중에 method호출 시 passed parameter인 local variable에 대한 로직 처리 후 결과 값을 알고 싶었다. method에서 return 되는 값에 대한 테스트는 간단했지만 method에서 return 되는 값에는 포함되지 않는 'local variable'이어서 어떻게 확인할지 고민하던 중 찾은 방법을 기록하려고 한다!&lt;/p&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;h4 data-ke-size=&quot;size20&quot;&gt;코드 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 테스트하려는 method의 예시가 있다. search는 method의 parameter로 전달이 되고, if절의 로직에 따라 값이 바뀐다. return값은 mapper로 DB에서 가져온 데이터 list가 되고 search는 따로 return 되지 않는다.&lt;/p&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;테스트할 method&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645013562482&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Override
public List&amp;lt;vo&amp;gt; getList(String search) {
       if (search.equals(&quot;&quot;)) {
           //....search관련 변경 로직
       }
       return mapper.selectBySearch(search);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 내부 로직을 통해 변경되는 search의 값을 알고 싶다면? &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Captor&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;라는 걸 이용해서 해결할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 먼저, 테스트 코드를 작성하는 클래스에 아래와 같이 선언해준다. &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;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Test code 클래스&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645014106214&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Captor
ArgumentCaptor&amp;lt;String&amp;gt; captor;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 선언한 captor를 이용하여 local variable인 search의 값을 테스트한다.&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;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Test code&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1645013906084&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@DisplayName(&quot;목록 조회&quot;)
@Test
public void test_getList_emptySearch(){
    service.getList(&quot;&quot;);

    verify(mapper).selectBySearch(captor.capture()); //전달되는 search값을 찍고
    String retSearch = captor.getValue(); //search값을 가져와서

    assertEquals(&quot;기대값&quot;,retSearch); //기대값과 맞는지 확인!
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 사실 테스트 코드도 깔끔하게 만들 수 있는 코드를 짜는 게 물론 중요하지만, 편리한 테스트 코드를 위해 기존 코드를 바꿀 수는 없고,, 사실 회사에서는 내가 짠 코드가 아닐 수도 있다.. 더 좋은 방법들은 계속 찾아봐야겠다!&lt;/p&gt;</description>
      <category>개발/에러,이슈</category>
      <category>Captor</category>
      <category>JUnit</category>
      <category>local variable</category>
      <category>method parameter test</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/113</guid>
      <comments>https://technote-mezza.tistory.com/113#entry113comment</comments>
      <pubDate>Wed, 16 Feb 2022 21:27:42 +0900</pubDate>
    </item>
    <item>
      <title>[Junit] @MybatisTest 에러 Invalid bound statement (not found) -feat. databaseId</title>
      <link>https://technote-mezza.tistory.com/112</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;rarr; &lt;/b&gt;mybatis 사용 시에 흔하게 만날 수 있는 에러로 인터넷에 검색하면 여러 해결방안들이 나온다. 나는 추가로 내가 겪은 특정 상황에서 뭐가 문제였는지 어떻게 해결했는지 남기려고 한다 ㅎ.. (스포 &quot;databaseId&quot;, @ContextConfiguration)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;먼저 일반적인 문제들 몇 개의 해결방안을 보자면,&lt;/p&gt;
&lt;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;에러 코드에서도 볼 수 있듯이 binding이 안된다는 의미는 mapper인터페이스와 xml에서 뭔가 일치하지 않게 잘 못 썼을 수 있다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들면, 인터페이스의 메소드 명과 xml 쿼리에 id값이 오타로 인해 불일치한다던지, id값에 공백이 존재한다던지 하는 문제. &amp;rarr; &lt;b&gt;인터페이스 메소드명 = xml id값 일치로 해결&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642056172153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//mapper interface
int insert(String s);

//mapper xml
&amp;lt;insert id=&quot;iinsert&quot;&amp;gt;&amp;lt;/insert&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;해결방안 2 :&amp;nbsp;&lt;/b&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;예를 들면, application.properties 에 아래와 같은 설정들을 제대로 해주지 않았다던가 빠트렸다던지 하는 문제. &amp;rarr; &lt;b&gt;아래와 같이 설정 파일에 프로젝트 구성에 맞게 설정하는 것으로 해결&lt;/b&gt;&lt;span style=&quot;background-color: #f9f2f4; color: #c7254e;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1642057695437&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#application.properties 
#자신의 프로젝트에서 사용되는 쿼리가 담긴 xml 파일 경로 써주기
mybatis.mapper-locations = classpath:mybatis/mapper/**/*.xml 

#자신의 프로젝트에서 사용되는 mybatis.config.xml 파일 경로 써주기
mybatis.config-location = classpath:mybatis/mybatis.config.xml&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;이 두 가지 문제 외에도 다른 패키지에 같은 이름의 mapper가 존재한다던지 등등 사용하려고 하는 mapper가 잘 연결이 안 될만한 문제가 있을 때 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;여기서부터 내가 겪은 문제...&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;@MybatisTest에서의 문제 해결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우.. Junit5 @MybatisTest를 통해 mapper 테스트를 하던 중이었고, 다른 mapper 쿼리들을 잘 테스트를 하다가 &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 과정 1 : 공통점 찾기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발생하는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;특정 쿼리의 공통점은 &quot;databaseId&quot;를 설정&lt;span style=&quot;color: #000000;&quot;&gt;해주었다는 점.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;databaseId는 아래처럼 같은 id, 다른 databaseId 속성으로 테스트, 상용 등 사용되는 DB마다 다른 쿼리를 실행할 수 있도록 한다&lt;br /&gt;
&lt;pre id=&quot;code_1642058601584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//인터페이스 mapper
int insert();

//mapper.xml
&amp;lt;insert id=&quot;insert&quot; databaseId=&quot;mysql&quot;&amp;gt;...&amp;lt;/insert&amp;gt; //mysql DB사용할 때
&amp;lt;insert id=&quot;insert&quot; databaseId=&quot;postgresql&quot;&amp;gt;...&amp;lt;/insert&amp;gt; //postgresql DB사용할 때&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&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;해결 과정 2 : 공통점 다루기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;databaseId 속성이 문제였고, 두 개 중 하나를 못 찾아서 그런가? 싶었다. databseId를 사용하기 위해선 config파일에 &quot;DatabaseIdProvider&quot;설정이 필요한데 아무리 봐도 제대로 설정되어 있다.&lt;/p&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;해결 과정 3 : 다른 상황에서 다뤄보기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@MybatisTest가 아니라 @SpringbootTest로 통합 테스트를 해봤다. 잘 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 application을 run 시켜서&amp;nbsp; 수행해봤다. 잘 수행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 과정 4 : 상황 종합하고 결론&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@MybatisTest환경과 스프링 부트 통합 테스트와 실제 application 실행 환경에서 다른 점이 존재하는데, 그게 databaseId설정 파일을 찾지 못하는 것이라고 생각. &amp;rarr; 그렇다면 설정 파일을 따로 지정해줘야 하나? &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 말했던 것과 같이 databaseId를 사용하기 위해 DatabaseConfig.java파일에 따로 &quot;DatabaseProvider&quot;에 관한 내용을 설정해 놓은 상태였고 클래스단에 &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;@ContextConfiguration을&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;해결&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1642060589893&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@ContextConfiguration(classes = {config 파일.class})

//혹은

@ContextConfiguration(locations = {경로/config 파일.xml})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 SpringBoot 테스트에서 설정 파일이 지정되는 과정. @ContextConfiguration 얘가 생략되면 어떻게 수행되는지, auto configuration은 왜 안되는지, 되면 어디까지 되는 건지, 비슷한 기능을 하는 다른 어노테이션이 있는지,&amp;nbsp;통합 테스트와 다른 configuration 부분, Junit5,4에서의 차이점 등등을 시간 나면 봐 두면 좋을 것 같다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(따로 지정된 mybatis 설정 파일이 존재하고, 이를 테스트에 사용해야 할 경우 따로 지정해놓아야 한다라... 내부 동작을 정확히 모르니 해결은 했지만,, 다시 봐야 할 듯)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면서, 이 게시글은 제공되지 않는 기술이라 안될 수도 있지만 대부분은 어떤 상황 하나가 맞춰지지 않아서 원하는 결과를 못 내는 경우가 많고 계속 해결방법을 찾는 과정을 수행해야겠다고 생각하며 작성하게 되었다 ㅎ&lt;/p&gt;</description>
      <category>개발/에러,이슈</category>
      <category>@ContextConfiguration</category>
      <category>BindingException</category>
      <category>databaseId</category>
      <category>JUnit</category>
      <category>mybatis</category>
      <category>test</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/112</guid>
      <comments>https://technote-mezza.tistory.com/112#entry112comment</comments>
      <pubDate>Thu, 13 Jan 2022 17:07:51 +0900</pubDate>
    </item>
    <item>
      <title>[lombok] IntelliJ @lombok 적용 안될때</title>
      <link>https://technote-mezza.tistory.com/109</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 import 하여 사용할 때 lombok적용이 안되어 @setter @getter 등이 먹지 않고 이 때문에 에러가 발생하게 되는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예 &amp;gt; ~.set~(); ~.get~(); 에 에러 표시가 나는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. lombok 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 프로젝트를 import 하게 되면 놓치는 부분이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 상단 메뉴바 file &amp;gt; Settings &amp;gt; Plugins &amp;gt; lombok을 검색해서 install을 해준다. 설치가 완료되면 아래 사진과 같이 installed라고 표시가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;855&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW1gMO/btrduVkYhtE/pWsU4JtQfLTWLFKXPqYdZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW1gMO/btrduVkYhtE/pWsU4JtQfLTWLFKXPqYdZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW1gMO/btrduVkYhtE/pWsU4JtQfLTWLFKXPqYdZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW1gMO%2FbtrduVkYhtE%2FpWsU4JtQfLTWLFKXPqYdZ1%2Fimg.png&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;855&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. rebuild&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lombok을 설치까지 했는데 안될 경우 상단 메뉴바 Build &amp;gt; Rebuild&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. restart&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 메뉴바 File &amp;gt; invalid &amp;gt; cache &amp;gt; restart&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. update&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 방법도 다 되지 않는다면 intellij IDEA자체를 최신 version으로 update 하는 방법으로 해결할 수도 있다.&lt;/p&gt;</description>
      <category>개발/에러,이슈</category>
      <category>@lombok</category>
      <category>IntelliJ</category>
      <category>lombok 에러</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/109</guid>
      <comments>https://technote-mezza.tistory.com/109#entry109comment</comments>
      <pubDate>Sun, 29 Aug 2021 16:50:09 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] git clone 후 intellij에서 spring project 정상 표현 안될때</title>
      <link>https://technote-mezza.tistory.com/108</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;git 원격 저장소에 있는 spring boot maven 프로젝트를 clone 하고 나서 intellij에서 저장소를 import 했는데 관련 파일들이 제대로 import 되지 않고 spring 프로젝트로 인식하지 못하는 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 인식하지 못하면 project structure에서 관련 setting 내용들을 확인할 수 없고 왼쪽 project 구조에서도 icon이 표시가 되지 않는 등 import가 잘못되었다고 티를 낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우 pom.xml 우클릭 &amp;gt; reimport 혹은 import를 통해 maven을 재설정을 하여 해결하였다&lt;/p&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;+ 추가로 intellij 자체에서 git clone하는 방법을 쓰면 이런 이슈가 생기지 않는 듯하다.&lt;/p&gt;</description>
      <category>개발/에러,이슈</category>
      <category>git clone</category>
      <category>IntelliJ</category>
      <category>maven</category>
      <category>Spring</category>
      <category>프로젝트 import오류</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/108</guid>
      <comments>https://technote-mezza.tistory.com/108#entry108comment</comments>
      <pubDate>Sun, 29 Aug 2021 15:20:19 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] 최단경로 알고리즘 종류 (BFS,다익스트라,플로이드와샬,벨만-포드)</title>
      <link>https://technote-mezza.tistory.com/107</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;(정점=노드 같은 뜻! 혼용해서 사용할 시 혼동 방지!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래프에서 각 정점끼리 사이의 최단 거리를 구하는 알고리즘 방법은 여러 가지가 있다. 문제에 따라 효율적인 방법이 다르므로 잘 선택해서 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 정점에서 다른 하나의 정점까지 최단 경로를 구하는 문제&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;알고리즘 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;하나의 정점에서 다른 모든 정점까지 최단경로를 구하는 문제&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;BFS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-간선의 가중치가 각각 다른 그래프일 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;다익스트라&lt;/li&gt;
&lt;li&gt;벨만-포드 &amp;rarr; 음수 가중치의 간선이 존재할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;모든 정점에서 다른 모든 정점까지 최단경로를 구하는 문제&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;플로이드 와샬&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 다익스트라(Dijkstra) 알고리즘&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 예를 들어보면 A-&amp;gt;C로 갈 때 A-&amp;gt;B-&amp;gt;C 가는 경로의 가중치 합이 A-&amp;gt;C의 가중치 합보다 작다면 B를 거쳐가는 경로를 선택하는 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://technote-mezza.tistory.com/57&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제풀이를 통한 코드, 알고리즘 방법 정리&lt;/a&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;b&gt;2. 벨만-포드(Bellman-Ford) 알고리즘&lt;/b&gt;&lt;b&gt;&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 플로이드-와샬(Floyd-Warshall) 알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A, B, C의 정점이 있다면 A와 B, C 정점 간의 최단경로, 또 B와 A, C정점 간의 최단경로 C와 A, B 간의 최단경로를 구하는 즉, 모든 정점에서 다른 모든 정점 간의 최단경로를 구하는 알고리즘이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://technote-mezza.tistory.com/75&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제풀이를 통한 코드, 알고리즘 방법 정리&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;공부하다가 추가할 내용이나 문제가 있으면 추가&amp;amp;수정할 예정!&lt;/p&gt;</description>
      <category>CS공부/알고리즘&amp;amp;문제풀이</category>
      <category>BFS</category>
      <category>그래프 탐색</category>
      <category>다익스트라</category>
      <category>알고리즘</category>
      <category>최단경로</category>
      <category>플로이드와샬</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/107</guid>
      <comments>https://technote-mezza.tistory.com/107#entry107comment</comments>
      <pubDate>Mon, 9 Aug 2021 14:49:20 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 2021카카오 인턴십 : 표 편집 (java)</title>
      <link>https://technote-mezza.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/81303&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;문제 보러 가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제는 정확도와 효율성 2가지를 만족해야 하는 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행 개수 n &amp;lt;= 1,000,000이고 명령어 개수 200,000이므로 각 명령어당 전체 행 개수를 탐색하게 된다면 효율성을 만족하지 못한다. &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 가지로 풀이가 가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Linked List&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. Segment Tree&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;이 중에서 1번 Linked List로 풀이하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;링크드 리스트의 경우 삭제, 삽입은 O(1) 시간을 갖고, 탐색은 명령어로 &quot;D X&quot;가 주어질 경우 &lt;b&gt;현재 노드에서 X만큼 움직이므로 O(X) 시간&lt;/b&gt;을 갖는다. 모든 X의 값이 1,000,000 이하인 경우만 주어지므로 효율성에서 성공할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제된 노드는 Stack &amp;lt;Node&amp;gt;에 담아 최신 것부터 가져와서 업데이트시켜주면 된다. 삽입시에도 역시 이전 이후 노드 관계만 연결시켜주면 되므로 O(1) 시간을 갖게 되어 효율성에서 성공할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이과정&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 Node는 이전 노드의 정보를 담는 prev와 다음 노드의 정보를 담는 next 노드의 값을 담는 data로 구성된다.&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;size18&quot;&gt;&lt;b&gt;-이동(D X, U X)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;D의 경우 next노드를 X만큼 이동해 curNode업데이트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;U의 경우 prev노드를 X만큼 찾아 curNode업데이트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-삭제(C)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선택되어 있는 curNode의 prev노드의 next를 curNode의 next노드와 연결,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;curNode의 next노드의 prev노드를 curNode의 prev노드와 연결하면 curNode만 빠져나오게 된다. 이렇게 삭제된 노드는 Stack에 넣어 되돌리기 명령어 수행 시에 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* root, tail 노드가 삭제될 경우는 root, tail노드를 업데이트시켜줘야 함&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;b&gt;예시)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 2번이 선택되어있을 때&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;237&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6C5kS/btq9jFVJ28y/9kr9gABQkyOAklEYjn1zWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6C5kS/btq9jFVJ28y/9kr9gABQkyOAklEYjn1zWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6C5kS/btq9jFVJ28y/9kr9gABQkyOAklEYjn1zWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6C5kS%2Fbtq9jFVJ28y%2F9kr9gABQkyOAklEYjn1zWK%2Fimg.png&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;237&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;C&quot;수행된 후&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;265&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loakD/btq9rdpVmAT/iq8sanvSqRE13Sn5gVgtmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loakD/btq9rdpVmAT/iq8sanvSqRE13Sn5gVgtmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loakD/btq9rdpVmAT/iq8sanvSqRE13Sn5gVgtmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FloakD%2Fbtq9rdpVmAT%2Fiq8sanvSqRE13Sn5gVgtmK%2Fimg.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;265&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1번 노드의 다음 노드는 3번 노드가 되고 삭제된 후에 선택된 노드는 3번 노드가 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2번 노드의 경우 노드끼리 연결된 리스트에서는 빠지지만, stack에서 되돌리기 수행 시에 바로 연결할 수 있도록 prev, next 노드 정보를 유지한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;-되돌리기(Z)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;stack에서 최근 삭제된 노드를 가져오고 노드에 있는 prev, next노드의 정보로 삽입을 수행. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1-3 노드에서 2 노드를 되돌리기 수행할 경우 1 노드의 next를 2 노드로, 3 노드의 prev를 3 노드로 해준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*삭제와 마찬가지로 root, tail노드 확인하고 업데이트 필요함&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;답 출력 시에는 0~N-1인 덱스와 탐색 중인 현재 노드의 data값이 일치하면 &quot;O&quot; 틀리면 &quot;X&quot;를 답에 더한다. &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1626078227523&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Stack;

class Solution {
    public String solution(int n, int k, String[] cmd) {
		Stack&amp;lt;Node&amp;gt; zNode = new Stack&amp;lt;&amp;gt;();
		Node root = new Node(0);
		Node curNode = root;
		for (int i = 1; i &amp;lt; n; i++) {
			Node node = new Node(i);
			curNode.next = node;
			node.prev = curNode;
			curNode = node;
		}
        //root tail 서로 연결 - 순환구조처럼
		Node tail = curNode;
		root.prev = tail;
		tail.next = root;
		curNode = root;
        
        //처음 선택된 노드로 curNode 업데이트 
		while (k-- &amp;gt; 0) {
			curNode = curNode.next;
		}
		
		for (int i = 0; i &amp;lt; cmd.length; i++) {
			String[] s = cmd[i].split(&quot; &quot;);
			if (s.length == 1) {
				if (s[0].equals(&quot;C&quot;)) {//삭제C
					curNode.prev.next = curNode.next;
					curNode.next.prev = curNode.prev;
					zNode.push(curNode);
                    //root가 삭제될경우 next노드가 root노드가됨
					if (curNode == root) {
						root = curNode.next;
						curNode = root;  
					}
                    //tail노드가 삭제될 경우 prev노드가 tail노드가됨 
                    else if (curNode == tail) {
						tail = curNode.prev;
						curNode = tail;
					}else {
						curNode = curNode.next;
					}
				} else {//되돌리기Z
					Node node = zNode.pop();
					Node tmp = node.prev.next;
					node.prev.next = node;
					tmp.prev = node;
                    //되돌리고 난 후 root,tial 확인해서 업데이트
					if(node.data &amp;lt; root.data)
						root = node;
					else if(node.data &amp;gt; tail.data)
						tail = node;
				}
			} else {
				int num = Integer.parseInt(s[1]);
				if (s[0].equals(&quot;U&quot;)) {//위로이동U
					while (num-- &amp;gt; 0) {
						curNode = curNode.prev;
					}
				} else {//아래로이동D
					while (num-- &amp;gt; 0) {
						curNode = curNode.next;
					}
				}
			}
		}
		StringBuilder ans = new StringBuilder();
		
		for (int i = 0; i &amp;lt; n; i++) {
			if(root.data == i) {
				ans.append(&quot;O&quot;);
				root=root.next;
			}
			else {
				ans.append(&quot;X&quot;);
			}
		}
        return ans.toString();

	} 

	static class Node {
		Node prev;
		Node next;
		int data;

		Node(int data) {
			this.data = data;
			prev = null;
			next = null;
		}
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>CS공부/알고리즘&amp;amp;문제풀이</category>
      <category>2021카카오인턴십</category>
      <category>java</category>
      <category>알고리즘</category>
      <category>표 편집</category>
      <category>프로그래머스</category>
      <author>메자곰</author>
      <guid isPermaLink="true">https://technote-mezza.tistory.com/106</guid>
      <comments>https://technote-mezza.tistory.com/106#entry106comment</comments>
      <pubDate>Mon, 12 Jul 2021 17:46:50 +0900</pubDate>
    </item>
  </channel>
</rss>