<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발_log</title>
    <link>https://study-ce.tistory.com/</link>
    <description>백엔드 개발자의 개발 로그  </description>
    <language>ko</language>
    <pubDate>Tue, 16 Jun 2026 02:39:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>HBean_</managingEditor>
    <item>
      <title>[백준] 15683 : 감시 &amp;lt;JAVA&amp;gt;</title>
      <link>https://study-ce.tistory.com/107</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;a title=&quot;백준 문제 링크&quot; href=&quot;https://www.acmicpc.net/problem/15683&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;백준 문제 링크&lt;/a&gt;&lt;/span&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;간단 문제 설명&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;총 5가지 종류의 회전 가능한 CCTV 방향을 설정하여 CCTV 사각지대의 최솟값 구하기&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;2324&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bskq6Q/btsOFOCkTfY/C5fwBthBHWRoWxUre0iQJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bskq6Q/btsOFOCkTfY/C5fwBthBHWRoWxUre0iQJ1/img.png&quot; data-alt=&quot;CCTV 종류별 감시 방향, 90도씩 회전 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bskq6Q/btsOFOCkTfY/C5fwBthBHWRoWxUre0iQJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbskq6Q%2FbtsOFOCkTfY%2FC5fwBthBHWRoWxUre0iQJ1%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;2324&quot; height=&quot;450&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CCTV 종류별 감시 방향, 90도씩 회전 가능&lt;/figcaption&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;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;고민 내용&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1. 그리디 알고리즘으로 문제를 해결하고 싶었지만, 풀 수 없었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;각 단계의 최적의 방향이 최솟값을 만들 수 못할 수 있다&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DgAOU/btsOECb6TiX/UPcvplg4qPPvK3Y7pX6Hn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DgAOU/btsOECb6TiX/UPcvplg4qPPvK3Y7pX6Hn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DgAOU/btsOECb6TiX/UPcvplg4qPPvK3Y7pX6Hn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDgAOU%2FbtsOECb6TiX%2FUPcvplg4qPPvK3Y7pX6Hn1%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;603&quot; height=&quot;281&quot; data-origin-width=&quot;1342&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;방향 별 감시할 수 있는 영역의 수가 동일할 때 방향을 설정하는 기준을 찾지 못했다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ec6vF9/btsOE64WkaN/oj9zRWreVkixr0icjhVGZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ec6vF9/btsOE64WkaN/oj9zRWreVkixr0icjhVGZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ec6vF9/btsOE64WkaN/oj9zRWreVkixr0icjhVGZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fec6vF9%2FbtsOE64WkaN%2Foj9zRWreVkixr0icjhVGZk%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;261&quot; height=&quot;172&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;  완전탐색 알고리즘이 제한된 시간을 초과할 수 있을 것 같아 그리디 알고리즘을 사용했지만 실패했다. 해당 문제를 구글링한 결과 CCTV의 최대 개수가 8개로 작아 완전탐색으로 풀 수 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;완전탐색 알고리즘&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;코딩 테스트에서 완전탐색 알고리즘은 시간제한 문제가 발생할 수 있기 때문에 피하려고 노력했다. 하지만 문제에서 CCTV의 개수를 8개로 제한하여 N 값이 작아 완전탐색 알고리즘을 사용해도 시간제한 안에 해결할 수 있었다.&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;N이 작다고 판단할 수 있는 기준을 찾아봤다. 코딩테스트 환경에서 보통 1초에 약 1억 번 (10⁸) 연산이 가능하다. 하지만, 자바는 C/C++ 보다 실행속도가 느린 경우가 많고 자료구조 사용, 조건문 검사 등 시간이 오래 걸릴 수 있어서 &lt;span style=&quot;color: #ee2323;&quot;&gt;10⁶&lt;/span&gt;을 기준으로 잡고 문제를 풀면 좋을 것 같다:)&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제에서 CCTV의 최대 개수는 8개이고 CCTV 방향은 상하좌우 4개이다   총경우의 수 = 4^N&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;(4^8 = 65,536)&amp;nbsp; &amp;lt;&amp;nbsp; 10⁶ 이므로 사용해도 시간제한 안에 풀 수 있었다&lt;/span&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 풀이&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제 풀이는 아래의 글을 참고했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750142426847&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[백준 - Java] 15683번 : 감시 (삼성 SW 역량 테스트 기출 문제)&quot; data-og-description=&quot;문제 www.acmicpc.net/problem/15683 15683번: 감시 스타트링크의 사무실은 1&amp;times;1크기의 정사각형으로 나누어져 있는 N&amp;times;M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데&quot; data-og-host=&quot;minhamina.tistory.com&quot; data-og-source-url=&quot;https://minhamina.tistory.com/134&quot; data-og-url=&quot;https://minhamina.tistory.com/134&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjTa6v/hyY72Lktge/2QMslrMYq808mhN1KhNxnK/img.png?width=800&amp;amp;height=616&amp;amp;face=0_0_800_616,https://scrap.kakaocdn.net/dn/cXlSog/hyY8bnZQa0/UDA8hwlzW186Jkt5sMTax0/img.png?width=800&amp;amp;height=616&amp;amp;face=0_0_800_616,https://scrap.kakaocdn.net/dn/cGzJzx/hyY8UsIPeZ/3VvmiIXYo1a83xZDDSjpr1/img.png?width=2524&amp;amp;height=1946&amp;amp;face=0_0_2524_1946&quot;&gt;&lt;a href=&quot;https://minhamina.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://minhamina.tistory.com/134&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjTa6v/hyY72Lktge/2QMslrMYq808mhN1KhNxnK/img.png?width=800&amp;amp;height=616&amp;amp;face=0_0_800_616,https://scrap.kakaocdn.net/dn/cXlSog/hyY8bnZQa0/UDA8hwlzW186Jkt5sMTax0/img.png?width=800&amp;amp;height=616&amp;amp;face=0_0_800_616,https://scrap.kakaocdn.net/dn/cGzJzx/hyY8UsIPeZ/3VvmiIXYo1a83xZDDSjpr1/img.png?width=2524&amp;amp;height=1946&amp;amp;face=0_0_2524_1946');&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;[백준 - Java] 15683번 : 감시 (삼성 SW 역량 테스트 기출 문제)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제 www.acmicpc.net/problem/15683 15683번: 감시 스타트링크의 사무실은 1&amp;times;1크기의 정사각형으로 나누어져 있는 N&amp;times;M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;minhamina.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;1단계 : CCTV 방향 설정&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CCTV 방향은 상(0), 우(1), 하(2), 좌(3) 총 4가지이다.(시계방향 순)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750143418040&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static int[][] move = new int[][]{{-1,0}, {0,1}, {1,0}, {0,-1}};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;전체 CCTV의 설치 방향을 정하여 나올 수 있는 모든 경우의 수를 구하기 위해 순열을 이용했다. &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;순열은 N개의 서로 다른 값 중에 r개를 순서대로 뽑는 경우의 수이다.&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;문제에서는 0~3 (4가지 방향) 중에서 cctv 총 개수 r만큼 숫자를 순서대로 뽑아 나올 수 있는 모든 경우의 수를 구해야 했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;이에 DFS를 활용해서 순열을 구해 cctv의 방향을 별도의 배열(&lt;span style=&quot;color: #ee2323;&quot;&gt;cctv_direction&lt;/span&gt;)에 저장했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750142960568&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void permutation(int depth) {

        if(cctv_list.size() == depth) {
            // 1. board 새로 만들기
            copy_board = new int[board.length][board[0].length];
            for(int y=0; y&amp;lt;copy_board.length; y++) {
                System.arraycopy(board[y], 0, copy_board[y], 0 , board[y].length);
            }

            // 2. 표시하기
            for(int i=0; i&amp;lt;cctv_list.size(); i++) {
                check_cctv(cctv_list.get(i), cctv_direction[i]);
            }

            // 3. 갯수 체크
            count_section();
            return;
        }

        for(int i=0; i&amp;lt;4; i++) {
            cctv_direction[depth] = i;
            permutation(depth+1);
        }
    }&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;2단계 : 사각지대의 수 계산&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;우선 설정한 CCTV의 방향을 참고하여 &lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;기존 배열을 복사한 새로운 배열에&amp;nbsp;&lt;/span&gt;&lt;/b&gt;감시 가능한 구역을 표시했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750143253923&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 자바 배열 복사 메소드
System.arraycopy(원본 배열, 원본 배열의 복사 시작 시점, 복사할 배열, 복사할 배열의 시작 시점, 복사 값 개수)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;CCTV 종류에 따라 감시 영역을 표시했고 벽(6)을 만날 경우 감시 영역 체크를 중단했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750143064676&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void check_cctv(CCTV cctv, int direction) {
        if(cctv.value == 1) {
            check_board(cctv, direction);
        }else if(cctv.value == 2) {
            if(direction % 2 == 0 ) {
                check_board(cctv, 0);
                check_board(cctv, 2);
            }else {
                check_board(cctv, 1);
                check_board(cctv, 3);
            }
        }else if(cctv.value == 3) {
            check_board(cctv, direction);
            check_board(cctv, (direction+1) % 4);
        }else if(cctv.value == 4) {
            for(int i=0; i&amp;lt;3; i++) {
                int d = (direction + i) % 4;
                check_board(cctv, d);
            }
        }else if(cctv.value == 5) {
            check_board(cctv, 0);
            check_board(cctv, 1);
            check_board(cctv, 2);
            check_board(cctv, 3);
        }
    }
    
    private static void check_board(CCTV cctv, int direction) {
        int row = copy_board.length;
        int col = copy_board[0].length;

        int ny = cctv.y;
        int nx = cctv.x;
        while(true) {
            ny += move[direction][0];
            nx += move[direction][1];

            if(ny &amp;lt; 0 || ny &amp;gt;= row || nx &amp;lt; 0 || nx &amp;gt;= col || copy_board[ny][nx] == 6) {
                break;
            }
            
            if(copy_board[ny][nx] == 0) {
                copy_board[ny][nx] = -1;
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;마지막으로 감시가 불가능한 영역(0) 개수를 계산했다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750143900929&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void count_section() {
        int count = 0;
        for(int y=0; y&amp;lt;copy_board.length; y++) {
            for(int x=0; x&amp;lt;copy_board[0].length; x++) {
                if(copy_board[y][x] == 0) {
                    count += 1;
                }
            }
        }

        if(answer &amp;gt; count) {
            answer = count;
        }
    }&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://github.com/haerin7427/problem_solving_java/blob/main/Implementation/baekjoon/No_15683.java&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;전체코드&lt;/a&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;pre id=&quot;code_1750144056957&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package Implementation.baekjoon;

// 문제 : 감시
// 풀이 일자 : 2025.06.17
// 설명 : https://www.acmicpc.net/problem/15683

import java.util.*;
import java.io.*;

public class No_15683 {
    static int[][] move = new int[][]{{-1,0}, {0,1}, {1,0}, {0,-1}};
    static List&amp;lt;CCTV&amp;gt; cctv_list = new LinkedList&amp;lt;&amp;gt;();
    static int n, m, answer;
    static int[][] board;
    static int[][] copy_board;
    static int[] cctv_direction;

    private static class CCTV {
        int value;
        int y;
        int x;

        CCTV(int v, int y, int x) {
            this.value = v;
            this.y = y;
            this.x = x;
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        board = new int[n][m];
        for(int y=0; y&amp;lt;n; y++) {
            st = new StringTokenizer(br.readLine());
            for(int x=0; x&amp;lt;m; x++) {
                board[y][x] = Integer.parseInt(st.nextToken());

                if(board[y][x] &amp;gt; 0 &amp;amp;&amp;amp; board[y][x] &amp;lt; 6) {
                    cctv_list.add(new CCTV(board[y][x], y, x));
                }
            }
        }

        cctv_direction = new int[cctv_list.size()];
        answer = n*m;
        permutation(0);
        System.out.println(answer);
    }
    
    private static void permutation(int depth) {

        if(cctv_list.size() == depth) {
            // 1. board 새로 만들기
            copy_board = new int[board.length][board[0].length];
            for(int y=0; y&amp;lt;copy_board.length; y++) {
                System.arraycopy(board[y], 0, copy_board[y], 0 , board[y].length);
            }

            // 2. 표시하기
            for(int i=0; i&amp;lt;cctv_list.size(); i++) {
                check_cctv(cctv_list.get(i), cctv_direction[i]);
            }

            // 3. 갯수 체크
            count_section();
            return;
        }

        for(int i=0; i&amp;lt;4; i++) {
            cctv_direction[depth] = i;
            permutation(depth+1);
        }
    }

    private static void check_cctv(CCTV cctv, int direction) {
        if(cctv.value == 1) {
            check_board(cctv, direction);
        }else if(cctv.value == 2) {
            if(direction % 2 == 0 ) {
                check_board(cctv, 0);
                check_board(cctv, 2);
            }else {
                check_board(cctv, 1);
                check_board(cctv, 3);
            }
        }else if(cctv.value == 3) {
            check_board(cctv, direction);
            check_board(cctv, (direction+1) % 4);
        }else if(cctv.value == 4) {
            for(int i=0; i&amp;lt;3; i++) {
                int d = (direction + i) % 4;
                check_board(cctv, d);
            }
        }else if(cctv.value == 5) {
            check_board(cctv, 0);
            check_board(cctv, 1);
            check_board(cctv, 2);
            check_board(cctv, 3);
        }
    }

    private static void check_board(CCTV cctv, int direction) {
        int row = copy_board.length;
        int col = copy_board[0].length;

        int ny = cctv.y;
        int nx = cctv.x;
        while(true) {
            ny += move[direction][0];
            nx += move[direction][1];

            if(ny &amp;lt; 0 || ny &amp;gt;= row || nx &amp;lt; 0 || nx &amp;gt;= col || copy_board[ny][nx] == 6) {
                break;
            }
            
            if(copy_board[ny][nx] == 0) {
                copy_board[ny][nx] = -1;
            }
        }
    }

    private static void count_section() {
        int count = 0;
        for(int y=0; y&amp;lt;copy_board.length; y++) {
            for(int x=0; x&amp;lt;copy_board[0].length; x++) {
                if(copy_board[y][x] == 0) {
                    count += 1;
                }
            }
        }

        if(answer &amp;gt; count) {
            answer = count;
        }
    }
}&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;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://minhamina.tistory.com/134&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://minhamina.tistory.com/134&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@kai6666/Java-System.arraycopy-%EC%99%80Arrays.copyOf%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EB%B0%B0%EC%97%B4-%EB%B3%B5%EC%82%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@kai6666/Java-System.arraycopy-%EC%99%80Arrays.copyOf%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EB%B0%B0%EC%97%B4-%EB%B3%B5%EC%82%AC&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/107</guid>
      <comments>https://study-ce.tistory.com/107#entry107comment</comments>
      <pubDate>Tue, 17 Jun 2025 16:12:52 +0900</pubDate>
    </item>
    <item>
      <title>Jenkins로 CI/CD 구축하기</title>
      <link>https://study-ce.tistory.com/106</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcumoL/btsLgZbxTlU/Vjhqwfq9gIinbX06v0N6lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcumoL/btsLgZbxTlU/Vjhqwfq9gIinbX06v0N6lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcumoL/btsLgZbxTlU/Vjhqwfq9gIinbX06v0N6lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcumoL%2FbtsLgZbxTlU%2FVjhqwfq9gIinbX06v0N6lk%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;365&quot; height=&quot;222&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #6164c6;&quot;&gt;&lt;b&gt;배경&lt;/b&gt;&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;현재 참여 중인 프로젝트는 Github action을 통해 CI/CD를 구축했습니다. &lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;하지만 G&lt;b&gt;ithub action을 사용하는 것에 대해 2가지 단점이 있었습니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;첫 번째 단점은 빌드 시간이 오래 걸린다는 점입니다. &lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;로컬에서 React 프로젝트 빌드 시간이 약 30초였는데, action에서는 약 3분이 걸리며 &lt;span style=&quot;color: #ee2323;&quot;&gt;빌드 시간이 약 6배 증가&lt;/span&gt;했습니다. &lt;/b&gt;&lt;b&gt;깃허브 액션이 실행되는 서버가 매번 변경되어  workflow를 실행할 때마다 React 프로젝트 내 필요한 라이브러리를 설치하는데 시간이 소요됩니다.&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;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;두 번째 단점은  workflow가 실행되는 서버가 동적이라는 점입니다. 배포 서버는 인바운드 규칙이 있고 action이 실행되는 서버 IP는 매번 바뀝니다. 이에 &lt;span style=&quot;color: #ee2323;&quot;&gt;배포 서버에서 ssh 접근을 허용하는 데 어려움&lt;/span&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;위 2가지 단점을 해결하고자 고정 서버에서 배포를 진행하는 Jenkins를 이용하여 서비스 배포를 시도했습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;Jenkins 도입&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Jenkins를 설치하는 방법은 &lt;a href=&quot;https://study-ce.tistory.com/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[MAC]&amp;nbsp;젠킨스&amp;nbsp;설치하기&lt;/a&gt; 글을 참고해 주세요 &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Macbook local에 Jenkins를 설치하여 진행했습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사내 jenkins 가 설치된 서버에서 실행해 봤지만,, 낮은 스펙으로 인해 뻗어 버렸습니다.&amp;nbsp;&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;952&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJb0V/btsLiY9w5SB/EsN3026nieFlEmkJFmJvC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJb0V/btsLiY9w5SB/EsN3026nieFlEmkJFmJvC0/img.png&quot; data-alt=&quot;AWS EC2 t2.small&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJb0V/btsLiY9w5SB/EsN3026nieFlEmkJFmJvC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJb0V%2FbtsLiY9w5SB%2FEsN3026nieFlEmkJFmJvC0%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;362&quot; height=&quot;152&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS EC2 t2.small&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 젠킨스 접속 후 아이템 생성&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;684&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2MYZo/btsLfMVO1n2/G35nHWcZfw8i2paKstFEdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2MYZo/btsLfMVO1n2/G35nHWcZfw8i2paKstFEdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2MYZo/btsLfMVO1n2/G35nHWcZfw8i2paKstFEdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2MYZo%2FbtsLfMVO1n2%2FG35nHWcZfw8i2paKstFEdK%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;336&quot; height=&quot;425&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 아이템 이름을 작성하고 파이프라인 선택&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;1368&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KUVcw/btsLgfDnVVl/yNGZi1zvXINfCGG8Pjulbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KUVcw/btsLgfDnVVl/yNGZi1zvXINfCGG8Pjulbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KUVcw/btsLgfDnVVl/yNGZi1zvXINfCGG8Pjulbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKUVcw%2FbtsLgfDnVVl%2FyNGZi1zvXINfCGG8Pjulbk%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;511&quot; height=&quot;529&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 세부사항 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(저는 별도로 필요한 설정이 없어서 스크립트 파일만 작성했습니다.)&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;1682&quot; data-origin-height=&quot;1724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIwq6/btsLf8Em0RY/kIxWcbG5jVNevKJOyAlGc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIwq6/btsLf8Em0RY/kIxWcbG5jVNevKJOyAlGc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIwq6/btsLf8Em0RY/kIxWcbG5jVNevKJOyAlGc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIwq6%2FbtsLf8Em0RY%2FkIxWcbG5jVNevKJOyAlGc0%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;549&quot; height=&quot;563&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;1724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3-2. 스크립트 파일 작성&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 빌드에 필요한 세부사항 설정&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;agent : 파이프라인 또는 스테이지를 실행할 위치를 설정&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;tools : Jenkins에서 관리하는 특정 도구를 파이프라인에서 사용하도록 설정&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Jenkins 관리 &amp;gt; Tools에서 등록할 수 있고 등록 시 작성한 이름과 동일하게 사용 가능합니다.&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1002&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOwu5Y/btsLeKreoq6/5cIdPGfqk9kSyCT3bVpcE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOwu5Y/btsLeKreoq6/5cIdPGfqk9kSyCT3bVpcE0/img.png&quot; data-alt=&quot;Jenkins 관리 &amp;amp;gt; Tools&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOwu5Y/btsLeKreoq6/5cIdPGfqk9kSyCT3bVpcE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOwu5Y%2FbtsLeKreoq6%2F5cIdPGfqk9kSyCT3bVpcE0%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;365&quot; height=&quot;323&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;1002&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Jenkins 관리 &amp;gt; Tools&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;options : 파이프라인이나 특정 스테이지의 실행 동작을 제어하기 위한 다양한 옵션을 설정&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;timeout : 파이프라인의 최대 실행 시간을 설정합니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;environment : 파이프라인 실행 시 사용할 환경 변수를 설정&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1733909669514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pipeline {
    agent any
    tools {
        nodejs &quot;NodeJS-22&quot;
        jdk 'java-11'
    }
    options {
        timeout(time: 10, unit: 'MINUTES')
    }
    
    environment { 
        GIT_CREDENTIALS = 'Github-user'
        FRONT_END_BUILD_SHELL_SCRIPT = 'build-front-view.sh'
        DOCKER_IMAGE_NAME = 'project-docker-image'
        REPO_URL = '../kea-rems-web.git'
        BRANCH = 'develop'
        DOCKERHUB_CREDENTIALS = credentials('DOCKER_HUB_ADMIN')
        SSH_NAME = 'hz_sudo'
    }
}&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- Git repository에서 프로젝트 코드 클론&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Jenkins 관리 &amp;gt;  Cridentials 페이지에서 Git 인증 정보 등록 필요&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;1236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgzeZ6/btsLgC7Syed/mkg2009f5QubYhdZEot3E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgzeZ6/btsLgC7Syed/mkg2009f5QubYhdZEot3E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgzeZ6/btsLgC7Syed/mkg2009f5QubYhdZEot3E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgzeZ6%2FbtsLgC7Syed%2Fmkg2009f5QubYhdZEot3E0%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;381&quot; height=&quot;540&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;1236&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1733911049348&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stages {
        stage('GitHub Repository Clone') { 
            steps {
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: &quot;${BRANCH}&quot;]],
                    userRemoteConfigs: [[
                        credentialsId: &quot;${GIT_CREDENTIALS}&quot;,
                        url: &quot;${REPO_URL}&quot;
                    ]]
                ])
                script {
                    env.GIT_COMMIT = sh(
                        script: &quot;git rev-parse HEAD&quot;, 
                        returnStdout: true
                    ).trim()
                    
                    // Git 커밋 해시가 제대로 설정되었는지 확인
                    if (!env.GIT_COMMIT || env.GIT_COMMIT.isEmpty()) {
                        error &quot;Failed to retrieve GIT_COMMIT. Exiting build.&quot;
                    } else {
                        echo &quot;Successfully retrieved GIT_COMMIT: ${env.GIT_COMMIT}&quot;
                    }
                }
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- REACT 빌드 스크립트 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733911076027&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stage('Frontend Build') { 
            options {
                retry(1)
            }
            steps {
                sh 'chmod +x ${WORKSPACE}/${FRONT_END_BUILD_SHELL_SCRIPT}'
                sh &quot;${WORKSPACE}/${FRONT_END_BUILD_SHELL_SCRIPT}&quot;
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;-  Spring 프로젝트 빌드 실행&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733911089956&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stage('Backend Build') { 
            options {
                retry(2)
            }
            steps {
                sh 'java --version'
                sh 'chmod +x gradlew'
                sh './gradlew clean build -x test'
            }
        }&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Docker Hub 로그인 및 도커 이미지 생성&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Github와 동일하게 Docker hub 인증 정보도 Jenkins 관리 &amp;gt;  Cridentials에서 등록 필요&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1733911123587&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stage('Docker Hub Login'){
            steps{
                sh &quot;echo ${DOCKERHUB_CREDENTIALS_PSW} | docker login -u $DOCKERHUB_CREDENTIALS_USR --password-stdin&quot;
            }
        }
        
        stage('Docker Image Build and Push') {
            options {
                retry(1)
            }
            steps{
                sh &quot;docker build --platform linux/amd64 -t ${DOCKERHUB_CREDENTIALS_USR}/test-web:dev-${env.GIT_COMMIT} .&quot; // docker build
                sh &quot;docker push ${DOCKERHUB_CREDENTIALS_USR}/test-web:dev-${env.GIT_COMMIT}&quot;//docker push
            }
        }&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- 도커 이미지 배포&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;배포 서버에 SSH로 접근하고&amp;nbsp;&lt;/b&gt;도커 허브에 올린 이미지를 pull 받아서 컨테이너 실행&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1733911154407&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;stage('Docker Image Pull and Deploy') {
            options {
                retry(1)
            }
            steps {
                script {
                    def DOCKER_IMAGE_TAG = &quot;${DOCKERHUB_CREDENTIALS_USR}/test-web:dev-${env.GIT_COMMIT}&quot;

                    def EXEC_COMMAND = &quot;&quot;&quot;
                        OLD_IMAGE_ID=\$(sudo docker inspect --format='{{.Image}}' test-web); 
                        sudo docker stop kea-rems-web;
                        
                        sudo docker rm test-web;
                        sudo docker rmi \${OLD_IMAGE_ID};
                        
                        sudo docker pull ${DOCKER_IMAGE_TAG};
                        sudo docker run -d -p 9091:8080 --name test-web --net=test-network ${DOCKER_IMAGE_TAG}
                    &quot;&quot;&quot;
        
                    sshPublisher(
                        failOnError: true,
                        publishers: [
                            sshPublisherDesc(
                                configName: &quot;${SSH_NAME}&quot;,
                                verbose: true,
                                transfers: [
                                    sshTransfer(
                                        execCommand: &quot;${EXEC_COMMAND}&quot;
                                    )
                                ]
                            )
                        ]
                    )
                }
            }
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #6164c6;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;React 빌드 시간은 180s(3분) &amp;gt;&amp;nbsp; 30s로 &lt;span style=&quot;color: #ee2323;&quot;&gt;약 83% 감소&lt;/span&gt;했지만, Docker 이미지 생성 단계에서 약 3분 정도 소요되어 Github action과 비교하여 오랜 시간이 걸렸습니다.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그 결과, CI/CD 전체 실행 시간을 비교하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;약 30초 정도 &lt;span style=&quot;color: #000000;&quot;&gt;단축했습니다&lt;/span&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&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;table style=&quot;border-collapse: collapse; width: 100%; height: 53px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;React (FE) 빌드&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도커 이미지 생성&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 19px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;전체&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Github action 소요시간&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3분 7초&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;38초&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5분 57초&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Jenkins 소요시간&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;20초&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4분 10초&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5분 25초&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;도커 이미지를 생성하는 데 오래 걸린 이유 (예측)&lt;/span&gt;&lt;/b&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 이미지 플랫폼 문제&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: Github action은 우분투에서 --platform linux/amd64 타입의 이미지를 만들고 Jenkins는 macbook local 환경에서 실행했기 때문에 arm머신에서 x86 이미지를 빌드한다. 그 결과 이미지를 생성하는 데 오래 걸릴 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/span&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실제로 도커 이미지를 실행할 플랫폼을 별도로 지정하지 않고 실행했을 때 약 1분가량 시간을 단축할 수 있었다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDcRBl/btsLhKxWQdh/Lv9KFWMWMczk2jkI890l4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDcRBl/btsLhKxWQdh/Lv9KFWMWMczk2jkI890l4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDcRBl/btsLhKxWQdh/Lv9KFWMWMczk2jkI890l4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDcRBl%2FbtsLhKxWQdh%2FLv9KFWMWMczk2jkI890l4K%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;767&quot; height=&quot;141&quot; data-origin-width=&quot;2160&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 리소스 부족&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;: Github action은 워크플로우를 실행하는 전용 서버로 돌리지만, Jenkins는 로컬 환경에서 시스템 리소스를 공유해서 사용하기 때문에 속도가 느리지 않았을까 생각했습니다.&lt;/span&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;* github action의 &lt;a href=&quot;https://docs.github.com/en/actions/hosting-your-own-runners/managing-self-hosted-runners/about-self-hosted-runners&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;self-hosted runners라는&lt;/a&gt; 기능을 발견했습니다. 간단하게 자기 소유의 서버로 Github action을 실행하는 것입니다. 다음에 CI/CD를 설계하면 사용해 보겠습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Devops</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/106</guid>
      <comments>https://study-ce.tistory.com/106#entry106comment</comments>
      <pubDate>Fri, 13 Dec 2024 15:47:26 +0900</pubDate>
    </item>
    <item>
      <title>[MAC] 젠킨스 설치하기</title>
      <link>https://study-ce.tistory.com/105</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #000c1a; text-align: start;&quot;&gt;Jenkins 2.462.3 LTS 설치 (2024.10.15 기준)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MacBook : Apple M3 pro&lt;br /&gt;&lt;/span&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. 아래 사이트에서 설치 방법 확인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/download/lts/macos/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.jenkins.io/download/lts/macos/&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1729039319592&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;macOS Installers for Jenkins LTS&quot; data-og-description=&quot;Jenkins &amp;ndash; an open source automation server which enables developers around the world to reliably build, test, and deploy their software&quot; data-og-host=&quot;www.jenkins.io&quot; data-og-source-url=&quot;https://www.jenkins.io/download/lts/macos/&quot; data-og-url=&quot;https://www.jenkins.io/download/lts/macos/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eTz88/hyXhYDOIRi/3WHu2lRrKLR2RknQEQqbL1/img.png?width=1200&amp;amp;height=630&amp;amp;face=581_198_680_306&quot;&gt;&lt;a href=&quot;https://www.jenkins.io/download/lts/macos/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.jenkins.io/download/lts/macos/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eTz88/hyXhYDOIRi/3WHu2lRrKLR2RknQEQqbL1/img.png?width=1200&amp;amp;height=630&amp;amp;face=581_198_680_306');&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;macOS Installers for Jenkins LTS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jenkins &amp;ndash; an open source automation server which enables developers around the world to reliably build, test, and deploy their software&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jenkins.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 사이트에 나온 방법 대로 터미널에 설치, 시작 명령어를 순서대로 입력&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729039384602&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install jenkins-lts // 설치
brew services start jenkins-lts // 시작
brew services restart jenkins-lts // 재시작
brew upgrade jenkins-lts // 버전 업데이트&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. 젠킨스를 실행하고 웹 브라우저에 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;'&lt;span style=&quot;color: #ee2323;&quot;&gt;http://localhost:8080&lt;/span&gt;'를 입력하여 설치한 젠킨스 홈에 접속&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;아래와 같은 화면이 나오면 빨간 박스의 주소에 있는 비밀번호를 터미널로 확인하여 입력&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729039945230&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat /Users/.../.jenkins/secrets/initialAdminPassword&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2016&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIGQZ/btsJ6WlJnx8/MNk8SEIYEaGOtXHBl5E10K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIGQZ/btsJ6WlJnx8/MNk8SEIYEaGOtXHBl5E10K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIGQZ/btsJ6WlJnx8/MNk8SEIYEaGOtXHBl5E10K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIGQZ%2FbtsJ6WlJnx8%2FMNk8SEIYEaGOtXHBl5E10K%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;848&quot; height=&quot;431&quot; data-origin-width=&quot;2016&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. 플러그인을 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;초기에 어떤 것을 선택할 지 모르겠다면 왼쪽 박스를 추천:) 나중에 필요한 플러그인을 설치할 수 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C0biw/btsJ7Um8LtK/1OKRTlJLDEL54nfHumjlZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C0biw/btsJ7Um8LtK/1OKRTlJLDEL54nfHumjlZ0/img.png&quot; data-origin-width=&quot;2020&quot; data-origin-height=&quot;1034&quot; data-is-animation=&quot;false&quot; style=&quot;width: 58.0763%; margin-right: 10px;&quot; data-widthpercent=&quot;58.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C0biw/btsJ7Um8LtK/1OKRTlJLDEL54nfHumjlZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC0biw%2FbtsJ7Um8LtK%2F1OKRTlJLDEL54nfHumjlZ0%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;2020&quot; height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boifT9/btsJ786xf4Z/rSNv3toC0LCIXDTKFy2yW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boifT9/btsJ786xf4Z/rSNv3toC0LCIXDTKFy2yW0/img.png&quot; data-origin-width=&quot;2032&quot; data-origin-height=&quot;1482&quot; data-is-animation=&quot;false&quot; style=&quot;width: 40.7609%;&quot; data-widthpercent=&quot;41.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boifT9/btsJ786xf4Z/rSNv3toC0LCIXDTKFy2yW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboifT9%2FbtsJ786xf4Z%2FrSNv3toC0LCIXDTKFy2yW0%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;2032&quot; height=&quot;1482&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. 관리자 정보 입력&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;2019&quot; data-origin-height=&quot;1465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M3TXg/btsJ5BvXGTZ/30pe0PDRHNETp60P0x70ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M3TXg/btsJ5BvXGTZ/30pe0PDRHNETp60P0x70ik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M3TXg/btsJ5BvXGTZ/30pe0PDRHNETp60P0x70ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM3TXg%2FbtsJ5BvXGTZ%2F30pe0PDRHNETp60P0x70ik%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;466&quot; height=&quot;338&quot; data-origin-width=&quot;2019&quot; data-origin-height=&quot;1465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;6. jenkins 주소 설정, 기본 주소에서 변경 가능&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;2018&quot; data-origin-height=&quot;1474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdyj0o/btsJ7p8Wg4Q/fsdNZIg1R2ZG3vS7altKHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdyj0o/btsJ7p8Wg4Q/fsdNZIg1R2ZG3vS7altKHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdyj0o/btsJ7p8Wg4Q/fsdNZIg1R2ZG3vS7altKHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcdyj0o%2FbtsJ7p8Wg4Q%2FfsdNZIg1R2ZG3vS7altKHK%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;657&quot; height=&quot;480&quot; data-origin-width=&quot;2018&quot; data-origin-height=&quot;1474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;7. 설치 완료&lt;/span&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;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://joyfulhome.tistory.com/264&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://joyfulhome.tistory.com/264&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>Devops</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/105</guid>
      <comments>https://study-ce.tistory.com/105#entry105comment</comments>
      <pubDate>Wed, 16 Oct 2024 10:07:13 +0900</pubDate>
    </item>
    <item>
      <title>[MAC] Tomcat 설치하기</title>
      <link>https://study-ce.tistory.com/104</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Backgroud&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용하던 맥북을 교체하면서 톰캣 설치 방법을 작성합니다 &lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Tomcat 8 설치&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MacBook : Apple M3 pro&lt;/span&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. brew 통해 설치&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721570254774&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install tomcat@8 // @8은 설치하고 싶은 톰캣 버전
brew install tomcat   // 최신 톰캣 버전 설치&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;설치 후 Summary에서 설치한 위치를 알 수 있습니다&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjnVSG/btsIG04pAC8/jJpqF5IsGMX444LkGSGTAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjnVSG/btsIG04pAC8/jJpqF5IsGMX444LkGSGTAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjnVSG/btsIG04pAC8/jJpqF5IsGMX444LkGSGTAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjnVSG%2FbtsIG04pAC8%2FjJpqF5IsGMX444LkGSGTAk%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;589&quot; height=&quot;50&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 톰캣 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721570647056&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /opt/homebrew/Cellar/tomcat@8/8.5.100/bin     // catalina 파일이 있는 위치로 이동 (버전에 따라 디렉토리명이 다를 수 있습니다)
./catalina start                                 // tomcat 실행 명령어&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6xLOV/btsIJefMqgV/PsUI8ubvGnlZcAyKnuSOk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6xLOV/btsIJefMqgV/PsUI8ubvGnlZcAyKnuSOk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6xLOV/btsIJefMqgV/PsUI8ubvGnlZcAyKnuSOk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6xLOV%2FbtsIJefMqgV%2FPsUI8ubvGnlZcAyKnuSOk0%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;576&quot; height=&quot;140&quot; data-origin-width=&quot;1366&quot; data-origin-height=&quot;332&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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;http://localhost:8080/&quot; data-renderer-mark=&quot;true&quot; data-testid=&quot;link-with-safety&quot;&gt;http://localhost:8080/&lt;/a&gt; 로 접속해서 아래 화면이 나오면 성공&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;1096&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23Qva/btsIGtGf0nc/kL9qmpFtWteD97tsqMLcT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23Qva/btsIGtGf0nc/kL9qmpFtWteD97tsqMLcT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23Qva/btsIGtGf0nc/kL9qmpFtWteD97tsqMLcT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23Qva%2FbtsIGtGf0nc%2FkL9qmpFtWteD97tsqMLcT0%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;563&quot; height=&quot;352&quot; data-origin-width=&quot;1754&quot; data-origin-height=&quot;1096&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>개발툴</category>
      <category>tomcat</category>
      <category>톰캣</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/104</guid>
      <comments>https://study-ce.tistory.com/104#entry104comment</comments>
      <pubDate>Sun, 21 Jul 2024 23:10:42 +0900</pubDate>
    </item>
    <item>
      <title>Tomcat 로케일 이슈</title>
      <link>https://study-ce.tistory.com/103</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Backgroud&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;업무 중에 로컬 환경에서는 문제없이 API가 동작하지만, 개발 환경(NCP)에서는 프로시저 실행 중 Oracle 에러가 발생하는 이슈가 발생했습니다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;발새한 에러는 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;ORA-01861: literal does not match format string&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;였고,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;문자열 형태로 받은 날짜 데이터 (ex. '2024-07-01')를 &lt;/span&gt;&lt;b&gt;TO_DATE 메서드 없이 자동으로 날짜 타입으로 변경될 것을 예상하고 사용한 프로시저에서 에러가 발생하고 있었습니다.&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;두 환경은 같은 Oracle DB를 사용하고 있기 때문에, 왜 특정 환경에서만 에러가 발생하는지 찾아봤습니다.&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;해결 방법&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원인은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;i&gt;톰캣 로케일 이슈&lt;/i&gt;&lt;/span&gt;였습니다. 톰캣 언어 설정이 영어로 되어 있어 &lt;b&gt;&lt;b&gt;'2024-07-01' 이런 문자열 형태의 날짜 데이터를 자동으로 변환하지 못했습니다. 이에 톰캣 언어 설정을 추가했습니다.&lt;/b&gt;&lt;/b&gt;&lt;/span&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;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. tomcat.service 파일에 -Duser.language=ko -Duser.region=KR 추가하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721543887995&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nano /etc/systemd/system/tomcat.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2CiMK/btsIGjKoZmW/ppDDqqxMJPZmcpTk2rfzk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2CiMK/btsIGjKoZmW/ppDDqqxMJPZmcpTk2rfzk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2CiMK/btsIGjKoZmW/ppDDqqxMJPZmcpTk2rfzk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2CiMK%2FbtsIGjKoZmW%2FppDDqqxMJPZmcpTk2rfzk1%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;579&quot; height=&quot;33&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. 재시작&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721543924960&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl daemon-reload  // 시스템 데몬 다시 로드

sudo systemctl restart tomcat // tomcat 재시작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>이슈</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/103</guid>
      <comments>https://study-ce.tistory.com/103#entry103comment</comments>
      <pubDate>Sun, 21 Jul 2024 15:39:45 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ 예쁘게 만들기</title>
      <link>https://study-ce.tistory.com/102</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Backgroud&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요즘 개발을 재밌게 할 수 있는 방법을 고민하고 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그래서 매일 사용하는 개발 툴인 인텔리제이를 예쁘게 꾸미고 있어요:D&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적인 취향이지만, 제가 사용 중인 플러그인, 테마 소개합니다 &lt;/span&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IntelliJ 꾸미기&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IntelliJ IDEA 2024.1.4 (Ultimate Edition)&lt;/span&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. Atom Material Icons&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;1708&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euhMN2/btsIHKNgnqK/22PYz9HmBlWp2iesDhgqg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euhMN2/btsIHKNgnqK/22PYz9HmBlWp2iesDhgqg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euhMN2/btsIHKNgnqK/22PYz9HmBlWp2iesDhgqg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuhMN2%2FbtsIHKNgnqK%2F22PYz9HmBlWp2iesDhgqg0%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;570&quot; height=&quot;120&quot; data-origin-width=&quot;1708&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아이콘 플러그인&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;개인적인 취향으로 인텔리제이 기본 아이콘보다 이쁘다. 그리고 용도 별로 디렉토리도 구별해서 보여준다&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6oiV1/btsIGHcYq3f/9vCUzSOh28YMGwNctlWkf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6oiV1/btsIGHcYq3f/9vCUzSOh28YMGwNctlWkf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6oiV1/btsIGHcYq3f/9vCUzSOh28YMGwNctlWkf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6oiV1%2FbtsIGHcYq3f%2F9vCUzSOh28YMGwNctlWkf0%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;112&quot; height=&quot;314&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. One Dark Thema&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;1732&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ts71x/btsIIlGf0Wz/xZ8wFOWg3OChDyhZBUbnhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ts71x/btsIIlGf0Wz/xZ8wFOWg3OChDyhZBUbnhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ts71x/btsIIlGf0Wz/xZ8wFOWg3OChDyhZBUbnhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fts71x%2FbtsIIlGf0Wz%2FxZ8wFOWg3OChDyhZBUbnhk%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;564&quot; height=&quot;131&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요즘 사용중인 테마&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 중에 One Dark Vivid Italic을 사용하고 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-07-21 오전 1.28.21.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MZkUB/btsIGbZW12i/IXbJNFEvlmb8Lgqdz5qSD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MZkUB/btsIGbZW12i/IXbJNFEvlmb8Lgqdz5qSD0/img.png&quot; data-alt=&quot;Settings &amp;amp;gt; Appearance &amp;amp;amp; Behavior &amp;amp;gt; Appearance &amp;amp;gt; Theme 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MZkUB/btsIGbZW12i/IXbJNFEvlmb8Lgqdz5qSD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMZkUB%2FbtsIGbZW12i%2FIXbJNFEvlmb8Lgqdz5qSD0%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;576&quot; height=&quot;176&quot; data-filename=&quot;스크린샷 2024-07-21 오전 1.28.21.png&quot; data-origin-width=&quot;2204&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Settings &amp;gt; Appearance &amp;amp; Behavior &amp;gt; Appearance &amp;gt; Theme 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. Rainbow&amp;nbsp;Brackets&amp;nbsp;Lite&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;1736&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QPdUP/btsIGZ5hHpn/ukpk8HO3n22OAsmTcXRjQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QPdUP/btsIGZ5hHpn/ukpk8HO3n22OAsmTcXRjQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QPdUP/btsIGZ5hHpn/ukpk8HO3n22OAsmTcXRjQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQPdUP%2FbtsIGZ5hHpn%2Fukpk8HO3n22OAsmTcXRjQK%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;568&quot; height=&quot;119&quot; data-origin-width=&quot;1736&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;같은 괄호 별로 색상을 통일하는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEpD0U/btsIHYq2kWG/ETgNkT3M26IekkCa8BICtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEpD0U/btsIHYq2kWG/ETgNkT3M26IekkCa8BICtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEpD0U/btsIHYq2kWG/ETgNkT3M26IekkCa8BICtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEpD0U%2FbtsIHYq2kWG%2FETgNkT3M26IekkCa8BICtK%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;323&quot; height=&quot;119&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. Power Mode 2&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;1744&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpdbpb/btsIIKy0NYN/HhCxAQsx8qAukuvIka5Ym1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpdbpb/btsIIKy0NYN/HhCxAQsx8qAukuvIka5Ym1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpdbpb/btsIIKy0NYN/HhCxAQsx8qAukuvIka5Ym1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpdbpb%2FbtsIIKy0NYN%2FHhCxAQsx8qAukuvIka5Ym1%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;587&quot; height=&quot;118&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코드를 작성할 때 마다 이벤트를 만들어주는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SPARKS! 옵션을 선택해서 타이핑 할 때 마다 폭죽이 터지고 있습니다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zShjM/btsIGLTMiLr/nfcLkKS5rPSnvhT3jRFDa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zShjM/btsIGLTMiLr/nfcLkKS5rPSnvhT3jRFDa1/img.png&quot; data-alt=&quot;Settings &amp;amp;gt; Appearance &amp;amp;amp; Behavior &amp;amp;gt; Power Mode 2 &amp;amp;gt; 옵션 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zShjM/btsIGLTMiLr/nfcLkKS5rPSnvhT3jRFDa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzShjM%2FbtsIGLTMiLr%2FnfcLkKS5rPSnvhT3jRFDa1%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;606&quot; height=&quot;174&quot; data-origin-width=&quot;2196&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Settings &amp;gt; Appearance &amp;amp; Behavior &amp;gt; Power Mode 2 &amp;gt; 옵션 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clEu4T/btsIHLrQlCg/NzcUeYKSapWZ3dxL41eQmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clEu4T/btsIHLrQlCg/NzcUeYKSapWZ3dxL41eQmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clEu4T/btsIHLrQlCg/NzcUeYKSapWZ3dxL41eQmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclEu4T%2FbtsIHLrQlCg%2FNzcUeYKSapWZ3dxL41eQmk%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;456&quot; height=&quot;62&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;149&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;</description>
      <category>Intellij</category>
      <category>IntelliJ</category>
      <category>인텔리제이</category>
      <category>플러그인</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/102</guid>
      <comments>https://study-ce.tistory.com/102#entry102comment</comments>
      <pubDate>Sun, 21 Jul 2024 01:39:26 +0900</pubDate>
    </item>
    <item>
      <title>유용한 IntelliJ 플러그인 7가지</title>
      <link>https://study-ce.tistory.com/101</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Backgroud&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Intellij를 새로 세팅할 때마다 구글링 하는 게 귀찮아서 자주 사용하는 플러그인 리스트 기록합니다:D&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 플러그인 찾을 때마다 추가하겠습니다!!&lt;/span&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;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IntelliJ&amp;nbsp;플러그인&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IntelliJ IDEA 2024.1.4 (Ultimate Edition)&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;MAC 기준, IntelliJ IDEA &amp;gt; Settings &amp;gt; Plugins에서 설치 가능합니다.&lt;/span&gt;&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1. GitToolBox&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;1362&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sLHOa/btsIIgSs8C3/jQNUai4UxbRDi0YyIoXx10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sLHOa/btsIIgSs8C3/jQNUai4UxbRDi0YyIoXx10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sLHOa/btsIIgSs8C3/jQNUai4UxbRDi0YyIoXx10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsLHOa%2FbtsIIgSs8C3%2FjQNUai4UxbRDi0YyIoXx10%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;631&quot; height=&quot;182&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막 커밋 내역을 확인할 수 있는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBQArE/btsIIzdbVJM/2f0HF1MfPJpfzZZWD60NEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBQArE/btsIIzdbVJM/2f0HF1MfPJpfzZZWD60NEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBQArE/btsIIzdbVJM/2f0HF1MfPJpfzZZWD60NEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBQArE%2FbtsIIzdbVJM%2F2f0HF1MfPJpfzZZWD60NEK%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;716&quot; height=&quot;30&quot; data-origin-width=&quot;1688&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2. CheckStyle-IDEA&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;1492&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XP0Y5/btsIIyZE4MT/6EXkt29t96TUBdw9qxCFs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XP0Y5/btsIIyZE4MT/6EXkt29t96TUBdw9qxCFs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XP0Y5/btsIIyZE4MT/6EXkt29t96TUBdw9qxCFs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXP0Y5%2FbtsIIyZE4MT%2F6EXkt29t96TUBdw9qxCFs0%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;643&quot; height=&quot;151&quot; data-origin-width=&quot;1492&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코딩 컨벤션(= 코딩 스타일에 대한 규칙)을 설정하고 확인할 수 있는 플러그인&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본으로 Sun Checks, Google Checks 컨벤션이 추가되어 있고 별도의 컨벤션을 추가할 수도 있다.&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스타일 검사는 View &amp;gt; Tool Windows &amp;gt; &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;CheckStyle 탭에서 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px; color: #409d00;&quot;&gt;초록색 ▶️&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 아이콘을 클릭해서 할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1940&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wEvfd/btsIGFTKgZR/FO2oLVmDht0bBVF3nqsht0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wEvfd/btsIGFTKgZR/FO2oLVmDht0bBVF3nqsht0/img.png&quot; data-alt=&quot;IntelliJ IDEA &amp;amp;gt; Settings &amp;amp;gt; Tools &amp;amp;gt; Checkstyle에서 설정 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wEvfd/btsIGFTKgZR/FO2oLVmDht0bBVF3nqsht0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwEvfd%2FbtsIGFTKgZR%2FFO2oLVmDht0bBVF3nqsht0%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;715&quot; height=&quot;206&quot; data-origin-width=&quot;1940&quot; data-origin-height=&quot;560&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;IntelliJ IDEA &amp;gt; Settings &amp;gt; Tools &amp;gt; Checkstyle에서 설정 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3. CodeGlance Pro&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;1444&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qdpQ4/btsIGFMVJzF/lUxay4wXhSOMgS4gf3CfT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qdpQ4/btsIGFMVJzF/lUxay4wXhSOMgS4gf3CfT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qdpQ4/btsIGFMVJzF/lUxay4wXhSOMgS4gf3CfT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqdpQ4%2FbtsIGFMVJzF%2FlUxay4wXhSOMgS4gf3CfT0%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;706&quot; height=&quot;170&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스크롤바 옆에 전체 코드 맵을 보여주는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;커서를 올리면 해당 위치의 코드를 확인하고 원하는 위치로 빠르게 이동 가능하다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl6wu9/btsIGsAiB5B/gYGAmvdSqwUzpjsH64On01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl6wu9/btsIGsAiB5B/gYGAmvdSqwUzpjsH64On01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl6wu9/btsIGsAiB5B/gYGAmvdSqwUzpjsH64On01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl6wu9%2FbtsIGsAiB5B%2FgYGAmvdSqwUzpjsH64On01%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;154&quot; data-origin-width=&quot;1804&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4. Key Promoter X&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;1480&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kIdxS/btsIGYSXVWz/NANxWRDUw6leaRO9WEaLs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kIdxS/btsIGYSXVWz/NANxWRDUw6leaRO9WEaLs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kIdxS/btsIGYSXVWz/NANxWRDUw6leaRO9WEaLs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkIdxS%2FbtsIGYSXVWz%2FNANxWRDUw6leaRO9WEaLs1%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;766&quot; height=&quot;187&quot; data-origin-width=&quot;1480&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;단축키를 알려주는 플러그인&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;인텔리제이 화면 우측 하단에 마우스로 한 동작에 해당하는 단축키를 알려준다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c38k5m/btsIHLk1vGA/novG0I71qIrXwpCI7lSO7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c38k5m/btsIHLk1vGA/novG0I71qIrXwpCI7lSO7k/img.png&quot; data-alt=&quot;단축키 알려주는 팝업&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c38k5m/btsIHLk1vGA/novG0I71qIrXwpCI7lSO7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc38k5m%2FbtsIHLk1vGA%2FnovG0I71qIrXwpCI7lSO7k%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;323&quot; height=&quot;85&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;단축키 알려주는 팝업&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5. String Manipulation&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;1490&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CH8A3/btsIHJU3YZm/1twlLx5xdOSRrLbPWmEytk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CH8A3/btsIHJU3YZm/1twlLx5xdOSRrLbPWmEytk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CH8A3/btsIHJU3YZm/1twlLx5xdOSRrLbPWmEytk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCH8A3%2FbtsIHJU3YZm%2F1twlLx5xdOSRrLbPWmEytk%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;704&quot; height=&quot;171&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변수명 네이밍 규칙을 변경하는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다양한 표기법 또는 대소문자 변경이 가능하다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JxdWJ/btsIHKzGd6s/dMQCMAl4G02Pg2Z5J5TAeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JxdWJ/btsIHKzGd6s/dMQCMAl4G02Pg2Z5J5TAeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JxdWJ/btsIHKzGd6s/dMQCMAl4G02Pg2Z5J5TAeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJxdWJ%2FbtsIHKzGd6s%2FdMQCMAl4G02Pg2Z5J5TAeK%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;536&quot; height=&quot;547&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;6. Grep Console&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;1494&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qn06j/btsIGKtJobz/tCKNoDKt2xdJOSWEdMCIek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qn06j/btsIGKtJobz/tCKNoDKt2xdJOSWEdMCIek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qn06j/btsIGKtJobz/tCKNoDKt2xdJOSWEdMCIek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQn06j%2FbtsIGKtJobz%2FtCKNoDKt2xdJOSWEdMCIek%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;708&quot; height=&quot;168&quot; data-origin-width=&quot;1494&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;로그 레벨에 따라 텍스트의 색상을 변경할 수 있는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;중요한 로그&lt;/span&gt;를 구별하기 쉽다&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2192&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPnbWG/btsIH2fK78a/vTnpzgMCVph3gQpRXRDqv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPnbWG/btsIH2fK78a/vTnpzgMCVph3gQpRXRDqv0/img.png&quot; data-alt=&quot;Settings &amp;amp;gt; Other Settings &amp;amp;gt; Grep Console 에서 플러그인 설정 변경 가능&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPnbWG/btsIH2fK78a/vTnpzgMCVph3gQpRXRDqv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPnbWG%2FbtsIH2fK78a%2FvTnpzgMCVph3gQpRXRDqv0%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;616&quot; height=&quot;398&quot; data-origin-width=&quot;2192&quot; data-origin-height=&quot;1418&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Settings &amp;gt; Other Settings &amp;gt; Grep Console 에서 플러그인 설정 변경 가능&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0IfQv/btsIG1Wi5lC/riAIS7rR9oaBkHoW09PY7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0IfQv/btsIG1Wi5lC/riAIS7rR9oaBkHoW09PY7K/img.png&quot; data-alt=&quot;로그 레벨에 따라 색상 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0IfQv/btsIG1Wi5lC/riAIS7rR9oaBkHoW09PY7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0IfQv%2FbtsIG1Wi5lC%2FriAIS7rR9oaBkHoW09PY7K%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;494&quot; height=&quot;208&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그 레벨에 따라 색상 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;7. JPA Buddy&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;1732&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tP5eR/btsIH0h0LfZ/TW0GHjtDmLoCs6vt6rJwB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tP5eR/btsIH0h0LfZ/TW0GHjtDmLoCs6vt6rJwB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tP5eR/btsIH0h0LfZ/TW0GHjtDmLoCs6vt6rJwB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtP5eR%2FbtsIH0h0LfZ%2FTW0GHjtDmLoCs6vt6rJwB1%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;699&quot; height=&quot;148&quot; data-origin-width=&quot;1732&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Entity 클래스를 쉽게 관리할 수 있는 플러그인&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yLdC2/btsIIHbdc1u/jj8LHiX9hSL5C6iK3eKm1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yLdC2/btsIIHbdc1u/jj8LHiX9hSL5C6iK3eKm1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yLdC2/btsIIHbdc1u/jj8LHiX9hSL5C6iK3eKm1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyLdC2%2FbtsIIHbdc1u%2Fjj8LHiX9hSL5C6iK3eKm1K%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;209&quot; height=&quot;261&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;730&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;</description>
      <category>Intellij</category>
      <category>IntelliJ</category>
      <category>인텔리제이</category>
      <category>플러그인</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/101</guid>
      <comments>https://study-ce.tistory.com/101#entry101comment</comments>
      <pubDate>Sat, 20 Jul 2024 19:34:43 +0900</pubDate>
    </item>
    <item>
      <title>JAVA : Stream 개념</title>
      <link>https://study-ce.tistory.com/100</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;JAVA의 스트림 Stream&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;수많은 데이터의 흐름 속에서 각각의 원하는 값을 가공하여 최종 소비자에게 제공&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HYIgu/btrVSsVtgQS/BjZMVvGWROflP50znr5uh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HYIgu/btrVSsVtgQS/BjZMVvGWROflP50znr5uh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HYIgu/btrVSsVtgQS/BjZMVvGWROflP50znr5uh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHYIgu%2FbtrVSsVtgQS%2FBjZMVvGWROflP50znr5uh1%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;469&quot; height=&quot;470&quot; data-origin-width=&quot;1286&quot; data-origin-height=&quot;1288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 바다에서 그물로 물고기만 걸러서 잡기 &amp;rarr; filter : 중간 연산자&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 일정한 기준으로 상자에 물고기를 넣기 &amp;rarr; map : 중간 연산자&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 물고기가 담긴 상자를 운반하여 트럭에 전달 &amp;rarr; collect : 최종 연산자&lt;/span&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;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필요성&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;For문 또는 Iterator를 통해 컬렉션이나 배열 데이터를 처리하는 코드는 길고 알아보기 어렵다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;List, Set, Map 등 다양한 데이터 소스(컬렉션, 배열 등)의 사용 방식이 달라 재사용성이 떨어진다. &amp;rarr; 표준화된 방법 필요&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  이러한 문제점을 해결할 수 있는 Stream이 등장!! (Java8부터 지원)&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터 컬렉션 반복을 멋지게 처리 &amp;rarr; 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스트림은 데이터 소스를 변경❌&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스트림은 일회용 &amp;rarr; 사용 후 닫히기 때문에 필요하면 다시 생성&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내부 반복으로 작업 처리&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내부 반복 : 반복문을 메소드 내부에 숨기기&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;//forEach()는 스트림에 정의된 메서드 중 하나로 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용
void forEach(Consumer&amp;lt;? super T&amp;gt; action) {
    Objects.requireNonNull (action);        // 매개변수 null 체크
    for(T t : src) {                        // 내부 반복
        action.accept(T);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스트림 처리 순서&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스트림 만들기&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중간 연산 : 연산 결과가 스트림, 연속해서 중간 연산 가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;최종 연산 : 연산 결과가 스트림이 아닌 연산, 스트림의 요소를 소모하므로 단 한 번만 가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;list.stream() //스트림 만들기
    .filter() //중간연산
    .map()    //중간연산
    .forEach(System.out::println) //최종연산&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;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;스트림 종류&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;자바8부터 &lt;a href=&quot;http://java.util.stream&quot;&gt;java.util.stream&lt;/a&gt; 패키지에서 제공&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Stream : 기본 타입 T&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;IntStream&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;LongStream&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;DoubleStream&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt; &amp;nbsp;오토 박싱&amp;amp;언박싱으로 인한 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는 스트림 제공 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt; &amp;nbsp;&lt;/b&gt;Stream &amp;lt;Integer&amp;gt; 대신 IntStream이 더 효율적&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;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스트림 연산 특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지연 연산 Lazy Evaluatioin&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중간 연산을 바로 수행하지 않고 최종 연산까지 확인하고 수행함&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;불필요한 연산을 피할 수 있음&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;// list = [1,2,3,4]
list.stream()
        .filter(i -&amp;gt; i&amp;lt;10) // 연산1
        .filter(i -&amp;gt; i%2==0) // 연산2
        .map(i -&amp;gt; i*2) // 연산3
        .findFirst()
        .get();

// list의 모든 요소에 대해 작업1을 마치고 작업2로 넘어가는 것이 아님
// 요소마다 작업1 &amp;gt; 작업2 &amp;gt; 작업3을 순차적으로 진행 
// 두 번째 요소 2로 답을 구하면, 3번쩨 요소와 4번째 요소는 연산1,2,3을 진행하지 않음!&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병렬 처리가 쉬움&lt;/span&gt;&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병렬처리 : 한 작업에서 나눈 서브 작업들을 분리된 스레드에서 병렬적으로 처리 후, 서브 작업의 결과들을 최종 결합하는 방법&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;자바의 경우, fork&amp;amp;join프레임웍으로 병렬 처리&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;병렬 처리를 위한 메소드 : parallel()&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;parallel() 호출 후, 취소할 때 사용하는 메소드 : sequential()&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1673619686761&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int sum = strStream.parallel().mapToInt(s -&amp;gt; s.length()).sum();&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;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참조&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://steady-coding.tistory.com/309&quot;&gt;https://steady-coding.tistory.com/309&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://youtu.be/wsvhgrCGW78&quot;&gt;https://youtu.be/wsvhgrCGW78&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://velog.io/@gmtmoney2357/%EC%9E%90%EB%B0%94-%EC%8A%A4%ED%8A%B8%EB%A6%BCStream&quot;&gt;https://velog.io/@gmtmoney2357/자바-스트림Stream&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #9d9d9d;&quot;&gt;자바의 정석 Chapter 14 람다와 스트림&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #9d9d9d;&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://ict-nroo.tistory.com/43&quot;&gt;https://ict-nroo.tistory.com/43&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #9d9d9d;&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://dororongju.tistory.com/137&quot;&gt;https://dororongju.tistory.com/137&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #9d9d9d;&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://girawhale.tistory.com/131&quot;&gt;https://girawhale.tistory.com/131&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #9d9d9d;&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://sas-study.tistory.com/461&quot;&gt;https://sas-study.tistory.com/461&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>JAVA</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/100</guid>
      <comments>https://study-ce.tistory.com/100#entry100comment</comments>
      <pubDate>Wed, 11 Jan 2023 01:02:41 +0900</pubDate>
    </item>
    <item>
      <title>Array vs Arraylist</title>
      <link>https://study-ce.tistory.com/99</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공통점&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메모리상에 연달아 공간을 확보&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;index로 접근 가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요소를 추가하거나, 가져올 때 성능 비슷 &amp;rarr; &lt;span style=&quot;color: #f89009;&quot;&gt;ArrayList가 크키 조절이 필요할 때 성능 차이 발생!!&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중복되는 요소 저장 가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Null 값 저장 가능&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;차이점&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;u&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Array는 고정 길이이고 Arraylist는 가변 길이이다.&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;내부적으로 default size 10인 배열으로 구성 &amp;rarr; 최적화로 인해 막 생성하면 &lt;span style=&quot;color: #f89009;&quot;&gt;사이즈 0&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;편리함의 대가로 array보다 살짝 느림 &amp;rarr; 코딩테스트에서는 array를 사용하는 것이 낫다!&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ArrayList는 더 이상 저장할 공간이 없으면 보다 큰 &lt;span style=&quot;color: #f89009;&quot;&gt;새로운 배열을 생성&lt;/span&gt;해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 다음에 저장&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 배열의 크기는 기존 배열보다 &lt;span style=&quot;color: #f89009;&quot;&gt;1.5&lt;/span&gt;배 크다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Array는 &lt;span style=&quot;color: #009a87;&quot;&gt;primitive type, Object&lt;/span&gt; 타입의 데이터 모두 저장 가능하고, ArrayList는 &lt;span style=&quot;color: #006dd7;&quot;&gt;Object&lt;/span&gt; 타입만 가능하다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Array는 &lt;span style=&quot;color: #009a87;&quot;&gt;for 또는 for-each loop&lt;/span&gt;를 통해 array를 순회할 수 있고, ArrayList는 &lt;span style=&quot;color: #006dd7;&quot;&gt;iterator&lt;/span&gt;를 사용해 순회할 수 있다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Array는 &lt;span style=&quot;color: #009a87;&quot;&gt;정의된 타입의 데이터&lt;/span&gt;만 저장이 가능하고 ArrayList는 Generics(제네릭스)를 통해 &lt;span style=&quot;color: #006dd7;&quot;&gt;Type-Safety를 보장&lt;/span&gt;한다.&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Array는 &lt;span style=&quot;color: #009a87;&quot;&gt;다차원&lt;/span&gt;이 가능하고 ArrayList는 항상 단일 차원이다.&lt;/span&gt;&lt;/b&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;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참조&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://velog.io/@humblechoi/자료구조-Array-vs-ArrayList&quot;&gt;https://velog.io/@humblechoi/자료구조-Array-vs-ArrayList&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a style=&quot;color: #666666;&quot; href=&quot;https://prol0gue.tistory.com/9&quot;&gt;https://prol0gue.tistory.com/9&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>자료구조</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/99</guid>
      <comments>https://study-ce.tistory.com/99#entry99comment</comments>
      <pubDate>Tue, 10 Jan 2023 15:45:17 +0900</pubDate>
    </item>
    <item>
      <title>LinkedList : 링크드 리스트</title>
      <link>https://study-ce.tistory.com/98</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;링크드 리스트 : 노드로 구성된 자료구조&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-09 오전 10.38.13.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWqlWy/btrVBoL42jO/n7LyLlPeRUxti7BNBi6LR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWqlWy/btrVBoL42jO/n7LyLlPeRUxti7BNBi6LR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWqlWy/btrVBoL42jO/n7LyLlPeRUxti7BNBi6LR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWqlWy%2FbtrVBoL42jO%2Fn7LyLlPeRUxti7BNBi6LR0%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;372&quot; height=&quot;124&quot; data-filename=&quot;스크린샷 2023-01-09 오전 10.38.13.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;160&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;배열 또는 선형 리스트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;기본적인 자료구조 형태로 데이터를 빠른 시간 안에 조회할 수 있는 장점이 있습니다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  하지만, 데이터 추가/삭제 작업 후에 순서를 유지시키기 위해 데이터를 이동하는 추가적인 작업과 시간이 필요합니다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;b&gt;  &lt;/b&gt;또한, 크기를 변경할 수 없어 실행 속도 향상을 위해 충분히 큰 배열을 생성할 때 메모리가 낭비됩니다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  이러한 단점을 보완한 자료구조가 &lt;span style=&quot;color: #ee2323;&quot;&gt;링크드 리스트&lt;/span&gt; 입니다. &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;링크드 리스트는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt2c1N/btrVKZElBcJ/7HTHue2qNWEGk0M6lnyamK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt2c1N/btrVKZElBcJ/7HTHue2qNWEGk0M6lnyamK/img.png&quot; data-alt=&quot;Linkedlist [1,2,6,7] 형태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt2c1N/btrVKZElBcJ/7HTHue2qNWEGk0M6lnyamK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt2c1N%2FbtrVKZElBcJ%2F7HTHue2qNWEGk0M6lnyamK%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;493&quot; height=&quot;207&quot; data-origin-width=&quot;1358&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Linkedlist [1,2,6,7] 형태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특징&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 링크드 리스트의 원소는 &lt;span style=&quot;color: #f89009;&quot;&gt;원소값 필드&lt;/span&gt;와 &lt;span style=&quot;color: #f89009;&quot;&gt;다음 원소의 주소값 필드&lt;/span&gt;로 구성되어 있다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 물리적으로 데이터가 연결되어 있지 않지만, 다음 원소의 주소값을 통해 연결되어 &lt;span style=&quot;color: #f89009;&quot;&gt;논리적으로 연결되어 있는 구조&lt;/span&gt;이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 리스트에서&lt;span style=&quot;color: #f89009;&quot;&gt; 데이터 추가 또는 삭제 시&lt;/span&gt;, 주소값만 수정하면 되므로, &lt;span style=&quot;color: #f89009;&quot;&gt;처리속도가 빠르다&lt;/span&gt;. (배열 보다!)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 이전 노드의 주소값도 함께 저장하는 더블 링크드리스트 구조도 있다.&lt;/span&gt;&lt;/b&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LinkedList vs ArrayList&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 순차적으로 추가/삭제하는 경우, ArrayList가 더 빠르다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;- 중간에 데이터를 추가/삭제하는 경우, LinkedList가 더 빠르다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;  데이터의 개수가 고정이면, ArrayList가 최상의 선택이 될 수 있지만,&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;데이터의 개수가 변동이 자주 있다면, LinkedList를 사용하는 것이 더 나은 선택이 될 것이다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;</description>
      <category>자료구조</category>
      <author>HBean_</author>
      <guid isPermaLink="true">https://study-ce.tistory.com/98</guid>
      <comments>https://study-ce.tistory.com/98#entry98comment</comments>
      <pubDate>Mon, 9 Jan 2023 11:07:34 +0900</pubDate>
    </item>
  </channel>
</rss>