<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Efficient, Rapid, Accurate</title>
    <link>https://keichee.tistory.com/</link>
    <description>꼼꼼한 개발자의 블로그입니다. 영화를 좋아하고 개발을 좋아하고 땀흘리며 운동하는 것을 좋아합니다. 여행을 좋아하고 디지털 노마드를 꿈꾸며 지구의 깨끗한 환경을 수호하고 싶어요. 개발 관련 지식 공유 및 잡다한 내용들을 기록하기 위해 만든 블로그입니다. 많이 방문해주세요 ^-^</description>
    <language>ko</language>
    <pubDate>Fri, 21 Aug 2026 02:48:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>케이치</managingEditor>
    <image>
      <title>Efficient, Rapid, Accurate</title>
      <url>https://tistory1.daumcdn.net/tistory/1852466/attach/3e8a993219a94fe2bfb36149bc2bcfa9</url>
      <link>https://keichee.tistory.com</link>
    </image>
    <item>
      <title>무료 슈팅게임 feat. AI</title>
      <link>https://keichee.tistory.com/484</link>
      <description>&lt;div id=&quot;game-wrapper&quot; style=&quot;text-align: center; font-family: 'Malgun Gothic', sans-serif; background: #f4f4f4; padding: 20px; border-radius: 10px;&quot;&gt;
&lt;h3 style=&quot;margin-top: 0;&quot; data-ke-size=&quot;size23&quot;&gt;  우주 방어대&lt;/h3&gt;
&lt;canvas id=&quot;gameCanvas&quot; style=&quot;background-color: #111; box-shadow: 0 4px 8px rgba(0,0,0,0.2); border-radius: 5px;&quot; width=&quot;400&quot; height=&quot;500&quot;&gt;&lt;/canvas&gt;
&lt;div style=&quot;margin-top: 15px;&quot;&gt;
&lt;p style=&quot;font-size: 14px; color: #555;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조작방법:&lt;/b&gt; ⬅️ ➡️ (방향키 이동) / [Spacebar] (발사)&lt;/p&gt;
&lt;button id=&quot;startBtn&quot; style=&quot;padding: 10px 30px; font-size: 16px; font-weight: bold; cursor: pointer; background-color: #007bff; color: white; border: none; border-radius: 5px;&quot;&gt;게임 시작&lt;/button&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
    const canvas = document.getElementById('gameCanvas');
    const ctx = canvas.getContext('2d');
    const startBtn = document.getElementById('startBtn');

    // 게임 상태
    let animationId;
    let isPlaying = false;
    let score = 0;
    let frames = 0;

    // 객체 설정
    const player = { x: 180, y: 440, width: 40, height: 40, speed: 5, dx: 0, icon: ' ' };
    let bullets = [];
    let enemies = [];

    // 키보드 이벤트 리스너
    document.addEventListener('keydown', (e) =&gt; {
        if (!isPlaying) return;
        if (e.code === 'ArrowLeft') player.dx = -player.speed;
        if (e.code === 'ArrowRight') player.dx = player.speed;
        if (e.code === 'Space') shoot();
        
        // 방향키와 스페이스바 입력 시 스크롤 방지
        if(['Space', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].indexOf(e.code) &gt; -1) {
            e.preventDefault();
        }
    });

    document.addEventListener('keyup', (e) =&gt; {
        if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') player.dx = 0;
    });

    function shoot() {
        // 탄창 제한 (화면에 5개까지만)
        if (bullets.length &lt; 5) {
            bullets.push({ x: player.x + 18, y: player.y, width: 4, height: 15, speed: 7 });
        }
    }

    function spawnEnemy() {
        const x = Math.random() * (canvas.width - 40);
        const speed = 2 + (score * 0.05); // 점수가 오를수록 적이 빨라짐
        enemies.push({ x: x, y: -40, width: 40, height: 40, speed: speed, icon: ' ' });
    }

    function update() {
        if (!isPlaying) return;
        frames++;

        // 플레이어 이동
        player.x += player.dx;
        if (player.x &lt; 0) player.x = 0;
        if (player.x + player.width &gt; canvas.width) player.x = canvas.width - player.width;

        // 총알 이동
        for (let i = bullets.length - 1; i &gt;= 0; i--) {
            bullets[i].y -= bullets[i].speed;
            if (bullets[i].y &lt; 0) bullets.splice(i, 1);
        }

        // 적 스폰 (약 1초마다)
        if (frames % 60 === 0) spawnEnemy();

        // 적 이동 및 충돌 판정
        for (let i = enemies.length - 1; i &gt;= 0; i--) {
            let e = enemies[i];
            e.y += e.speed;

            // 바닥에 닿으면 게임 오버
            if (e.y + e.height &gt; canvas.height) {
                gameOver();
                return;
            }

            // 플레이어와 충돌
            if (e.x &lt; player.x + player.width - 10 &amp;&amp; e.x + e.width - 10 &gt; player.x &amp;&amp;
                e.y &lt; player.y + player.height - 10 &amp;&amp; e.y + e.height - 10 &gt; player.y) {
                gameOver();
                return;
            }

            // 총알과 적 충돌
            for (let j = bullets.length - 1; j &gt;= 0; j--) {
                let b = bullets[j];
                if (b.x &lt; e.x + e.width &amp;&amp; b.x + b.width &gt; e.x &amp;&amp;
                    b.y &lt; e.y + e.height &amp;&amp; b.y + b.height &gt; e.y) {
                    enemies.splice(i, 1);
                    bullets.splice(j, 1);
                    score += 10;
                    break;
                }
            }
        }
    }

    function draw() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);

        // 플레이어 그리기
        ctx.font = '30px Arial';
        ctx.fillText(player.icon, player.x, player.y + 30);

        // 적 그리기
        enemies.forEach(e =&gt; {
            ctx.fillText(e.icon, e.x, e.y + 30);
        });

        // 총알 그리기
        ctx.fillStyle = '#00ffcc';
        bullets.forEach(b =&gt; {
            ctx.fillRect(b.x, b.y, b.width, b.height);
        });

        // 점수 그리기
        ctx.fillStyle = '#ffffff';
        ctx.font = '20px Arial';
        ctx.fillText(`Score: ${score}`, 15, 30);
    }

    function loop() {
        update();
        draw();
        if (isPlaying) {
            animationId = requestAnimationFrame(loop);
        }
    }

    function gameOver() {
        isPlaying = false;
        cancelAnimationFrame(animationId);
        
        ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        
        ctx.fillStyle = '#ff4444';
        ctx.font = 'bold 40px Arial';
        ctx.textAlign = 'center';
        ctx.fillText('GAME OVER', canvas.width / 2, canvas.height / 2);
        
        ctx.fillStyle = '#ffffff';
        ctx.font = '20px Arial';
        ctx.fillText(`최종 점수: ${score}`, canvas.width / 2, canvas.height / 2 + 40);
        
        ctx.textAlign = 'left'; // 초기화
        startBtn.style.display = 'inline-block';
        startBtn.innerText = '다시 하기';
    }

    startBtn.addEventListener('click', () =&gt; {
        // 변수 초기화
        score = 0;
        frames = 0;
        bullets = [];
        enemies = [];
        player.x = 180;
        
        isPlaying = true;
        startBtn.style.display = 'none';
        loop();
    });
    
    // 초기화면 그리기
    draw();
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1분만에 만든 인공지능표 슈팅게임입니다 ㅎㅎ&lt;/p&gt;</description>
      <category>  Programming/인공지능</category>
      <category>무료게임</category>
      <category>슈팅게임</category>
      <category>웹게임</category>
      <author>케이치</author>
      <guid isPermaLink="true">https://keichee.tistory.com/484</guid>
      <comments>https://keichee.tistory.com/484#entry484comment</comments>
      <pubDate>Wed, 5 Aug 2026 10:10:09 +0900</pubDate>
    </item>
    <item>
      <title>brew update 오류 (couldn't find remote ref)</title>
      <link>https://keichee.tistory.com/483</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;토이프로젝트 진행하면서 MongoDB를 로컬환경에 설치하는 와중에 brew update 명령어를 실행했더니 아래와 같이 에러가 발생했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;% brew update&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;==&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;b&gt;Updating Homebrew...&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;fatal: couldn't find remote ref refs/heads/master&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;: Fetching /opt/homebrew/Library/Taps/dart-lang/homebrew-dart failed!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Error:&lt;/span&gt;&lt;span&gt; Some taps failed to update!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;The following taps can not read their remote branches:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;dart-lang/dart&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;This is happening because the remote branch was renamed or deleted.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Reset taps to point to the correct remote branches by running `brew tap --repair`&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&gt;에러메시지를 읽어보니 dart-lang/dart 의 원격 브랜치를 읽을 수 없다고하면서 이름이 변경됐거나 삭제되었을테니 brew tap --repair 를 실행하라고 하네요. 그래서 dart-lang/dart 를 타겟으로 주어 실행하니..&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;%&lt;/span&gt; brew tap --repair dart-lang/dart&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;remote: Enumerating objects: 1226, done.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;remote: Counting objects: 100% (1226/1226), done.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;remote: Compressing objects: 100% (199/199), done.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;remote: Total 1226 (delta 1086), reused 1133 (delta 1006), pack-reused 0&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Receiving objects: 100% (1226/1226), 193.80 KiB | 1.15 MiB/s, done.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Resolving deltas: 100% (1086/1086), completed with 12 local objects.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;From &lt;a href=&quot;https://github.com/dart-lang/homebrew-dart&quot;&gt;https://github.com/dart-lang/homebrew-dart&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;* [new branch]&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dependabot/github_actions/github-actions-9c54b75f35 -&amp;gt; origin/dependabot/github_actions/github-actions-9c54b75f35&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;* [new branch]&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dependabot/pub/googleapis-13.2.0 -&amp;gt; origin/dependabot/pub/googleapis-13.2.0&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;* [new branch]&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;dependabot/pub/test-1.25.7 &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;-&amp;gt; origin/dependabot/pub/test-1.25.7&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;* [new branch]&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;main &lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;-&amp;gt; origin/main&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;==&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;b&gt;dart-lang/dart: changed default branch name from master to main!&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&gt;이렇게 default 브랜치가 master 에서 main 으로 변경됐다고 친절히 알려줍니다.&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;</description>
      <category>  Programming</category>
      <category>brew update 에러</category>
      <category>fatal: couldn't find remote ref</category>
      <category>some taps failed to update</category>
      <author>케이치</author>
      <guid isPermaLink="true">https://keichee.tistory.com/483</guid>
      <comments>https://keichee.tistory.com/483#entry483comment</comments>
      <pubDate>Wed, 3 Jul 2024 08:08:02 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 개인프로젝트 처음 시작시 github 관련 오류 해결방법</title>
      <link>https://keichee.tistory.com/482</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 개인 프로젝트를 시작했는데 쉬는 텀이&amp;nbsp; 길다보니 매번 시작할때마다 git 관련 오류때문에 구글링하는 시간이 아까워 기록용으로 남깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스 코드 작성하고 이런저런 테스트 해보고 github repo 생성후에 push 하려고 했는데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;% git init&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;% git remote add origin {github url}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;% git push --set-upstream origin main&lt;br /&gt;Password&amp;nbsp;for&amp;nbsp;'&lt;a href=&quot;https://aaaaaa@github.com':&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://aaaaaa@github.com':&lt;/a&gt;&amp;nbsp;&lt;br /&gt;remote:&amp;nbsp;&lt;b&gt;Support&amp;nbsp;for&amp;nbsp;password&amp;nbsp;authentication&amp;nbsp;was&amp;nbsp;removed&amp;nbsp;on&amp;nbsp;August&amp;nbsp;13,&amp;nbsp;2021.&lt;/b&gt;&lt;br /&gt;remote:&amp;nbsp;Please&amp;nbsp;see&amp;nbsp;&lt;a href=&quot;https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls&lt;/a&gt;&amp;nbsp;for&amp;nbsp;information&amp;nbsp;on&amp;nbsp;currently&amp;nbsp;recommended&amp;nbsp;modes&amp;nbsp;of&amp;nbsp;authentication.&lt;br /&gt;fatal:&amp;nbsp;Authentication&amp;nbsp;failed&amp;nbsp;for&amp;nbsp;'&lt;a href=&quot;https://github.com/aaaaaa/test.git/'&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/aaaaaa/test.git/'&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 에러가 난다면 Password 란에 Personal Access Token(PAT) 값을 넣어주면 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAT 는 &lt;b&gt;github계정설정 (repo 설정 아님) &amp;gt; Developer Settings &amp;gt; Personal access tokens (classic) 에서 발급&lt;/b&gt;받을 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 브랜치 이슈로 아래와 같은 에러가 발생한다면..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;%&amp;nbsp;git&amp;nbsp;checkout&amp;nbsp;main&lt;br /&gt;branch&amp;nbsp;'main'&amp;nbsp;set&amp;nbsp;up&amp;nbsp;to&amp;nbsp;track&amp;nbsp;'origin/main'.&lt;br /&gt;Switched&amp;nbsp;to&amp;nbsp;a&amp;nbsp;new&amp;nbsp;branch&amp;nbsp;'main'&lt;br /&gt;% git merge prod&lt;br /&gt;&lt;b&gt;fatal:&amp;nbsp;refusing&amp;nbsp;to&amp;nbsp;merge&amp;nbsp;unrelated&amp;nbsp;histories&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;%&amp;nbsp;git&amp;nbsp;merge&amp;nbsp;prod&amp;nbsp;--allow-unrelated-histories&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어로 해결할 수 있음&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>Error</category>
      <category>Git</category>
      <category>github</category>
      <category>password authentication</category>
      <category>pat</category>
      <category>personal access token</category>
      <author>케이치</author>
      <guid isPermaLink="true">https://keichee.tistory.com/482</guid>
      <comments>https://keichee.tistory.com/482#entry482comment</comments>
      <pubDate>Tue, 2 Jul 2024 17:35:47 +0900</pubDate>
    </item>
    <item>
      <title>Spock Test Framework 실행 오류 해결</title>
      <link>https://keichee.tistory.com/481</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;(SpringBoot3 + Correto 17 (java 17) 환경에서 spock test 시 발생한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;TestEngine with ID 'spock' failed to discover tests&lt;/span&gt; 오류 해결방안 공유합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ 에서 Spring Initializer를 이용하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링부트3 + 자바 17 기반의 신규 프로젝트를 생성,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 정상적으로 되는지 확인 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spock 테스트를 위한 라이브러리를 아래 3개 추가했습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;testImplementation 'org.spockframework:spock-core:2.4-M1-groovy-4.0'
testImplementation 'org.spockframework:spock-spring:2.4-M1-groovy-4.0'
testImplementation 'org.apache.groovy:groovy-all:4.0.13'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 샘플 테스트 클래스를 만들었습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;class SampleSpec extends Specification {

    def &quot;where with variables: #size&quot;() {
        when:
        def list = new ArrayList(size)

        then:
        list.size() == 0

        where:
        size &amp;lt;&amp;lt; [1, 2, 3, 4, 5]
    }

    def &quot;using data tables for calculating max, Max of #a and #b is #max&quot;() {
        expect:
        Math.max(a, b) == max

        where:
        a | b || max
        1 | 2 || 2
        7 | 4 || 7
        0 | 0 || 0
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행을 해보았더니 아래와 같은 에러가 발생했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1704248211588&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Internal Error occurred.
org.junit.platform.commons.JUnitException: TestEngine with ID 'spock' failed to discover tests
...중략...

Caused by: org.junit.platform.commons.JUnitException: ClassSelector [className = 'com.project.SampleSpec', classLoader = null] resolution failed
...중략...

Caused by: org.junit.platform.commons.PreconditionViolationException: Could not load class with name: com.project.SampleSpec
...중략...

Caused by: java.lang.ClassNotFoundException: com.project.SampleSpec&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;background-color: #ffc9af;&quot;&gt;build.gradle 파일의 plugins 에 id 'groovy' 를 추가&lt;/span&gt;해주면 되는 문제였습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'

    id 'groovy'  &amp;lt;-- 이게 있는지 확인
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>Groovy</category>
      <category>spock test framework</category>
      <category>spock test 실행오류</category>
      <category>springboot3</category>
      <author>케이치</author>
      <guid isPermaLink="true">https://keichee.tistory.com/481</guid>
      <comments>https://keichee.tistory.com/481#entry481comment</comments>
      <pubDate>Wed, 3 Jan 2024 11:25:32 +0900</pubDate>
    </item>
    <item>
      <title>[IntelliJ] 신규 생성 프로젝트의 빌드 오류 (Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.2.1)</title>
      <link>https://keichee.tistory.com/480</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;최근 2년정도 IntelliJ에서 Java 11 기반의 AWS Correto 11 을 사용해왔습니다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 현재 JAVA_HOME 은 AWS Correto 11 의 위치를 가리키고 있었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;신규 프로젝트 구성할 일이 생겼고&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;AWS Correto 17 을 미리 다운받아둔 상태에서&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;IntelliJ 에서 SpringBoot Initializer 를 이용해서&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같은 설정(Java 17 + gradle groovy)으로 프로젝트를 생성하고&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;빌드를 하니 오류가 발생했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SpringBoot프로젝트생성설정.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exOV1N/btsCVHI7nXp/TjTNks3erbzjeJ7k3TJq4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exOV1N/btsCVHI7nXp/TjTNks3erbzjeJ7k3TJq4K/img.png&quot; data-alt=&quot;스프링부트 신규 프로젝트 생성 설정화면 (Java 17 설정)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exOV1N/btsCVHI7nXp/TjTNks3erbzjeJ7k3TJq4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexOV1N%2FbtsCVHI7nXp%2FTjTNks3erbzjeJ7k3TJq4K%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;1824&quot; height=&quot;1564&quot; data-filename=&quot;SpringBoot프로젝트생성설정.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스프링부트 신규 프로젝트 생성 설정화면 (Java 17 설정)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 빌드시 발생했던 오류 메시지&lt;/p&gt;
&lt;pre id=&quot;code_1704242831643&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A problem occurred configuring root project 'my-new-springboot3-project'.
&amp;gt; Could not resolve all files for configuration ':classpath'.
   &amp;gt; Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.2.1.
     Required by:
         project : &amp;gt; org.springframework.boot:org.springframework.boot.gradle.plugin:3.2.1
      &amp;gt; No matching variant of org.springframework.boot:spring-boot-gradle-plugin:3.2.1 was found. The consumer was configured to find a library for use during runtime, compatible with Java 11, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.5' but:
          - Variant 'apiElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.2.1 declares a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component for use during compile-time, compatible with Java 17 and the consumer needed a component for use during runtime, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')
          - Variant 'javadocElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.2.1 declares a component for use during runtime, and its dependencies declared externally:
              - Incompatible because this component declares documentation and the consumer needed a library
              - Other compatible attributes:
                  - Doesn't say anything about its target Java version (required compatibility with Java 11)
                  - Doesn't say anything about its elements (required them packaged as a jar)
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')
          - Variant 'mavenOptionalApiElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.2.1 declares a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component for use during compile-time, compatible with Java 17 and the consumer needed a component for use during runtime, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')
          - Variant 'mavenOptionalRuntimeElements' capability org.springframework.boot:spring-boot-gradle-plugin-maven-optional:3.2.1 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component, compatible with Java 17 and the consumer needed a component, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')
          - Variant 'runtimeElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.2.1 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component, compatible with Java 17 and the consumer needed a component, compatible with Java 11
              - Other compatible attribute:
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')
          - Variant 'sourcesElements' capability org.springframework.boot:spring-boot-gradle-plugin:3.2.1 declares a component for use during runtime, and its dependencies declared externally:
              - Incompatible because this component declares documentation and the consumer needed a library
              - Other compatible attributes:
                  - Doesn't say anything about its target Java version (required compatibility with Java 11)
                  - Doesn't say anything about its elements (required them packaged as a jar)
                  - Doesn't say anything about org.gradle.plugin.api-version (required '8.5')

* Try:
&amp;gt; Run with --stacktrace option to get the stack trace.
&amp;gt; Run with --info or --debug option to get more log output.
&amp;gt; Run with --scan to get full insights.
&amp;gt; Get more help at https://help.gradle.org.
BUILD FAILED in 1s&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;에러 메시지의 내용을 읽어보니,&amp;nbsp;일단 Could not resolve xxx 의 경우 xxx 라이브러리가 없다라는 메시지인데&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;신규 생성한 프로젝트에서 필수라이브러리를 dependency에 안넣을 이유가 없다는 생각이 우선 들었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그런거라면 springboot initializer 의 버그일테니까요.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 더 읽어봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 &quot;requierd compatibility with Java 11&quot; 문구가 눈에 띄었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;난 자바17을 쓰려고 17버전으로 JDK와 Java 설정을 넣었는데 왜 Java 11 관련메시지가 뜨는건지 이상했습니다.  &lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;에러메시지 내용으로 구글링을 좀 해보니 아래 부분들을 확인해보라는 내용들이 있었습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;현재 시스템에서 사용하는 Java 버전 확인 (java -version)&lt;/li&gt;
&lt;li&gt;build.gradle 파일의&amp;nbsp; sourceCompatibility 확인&lt;/li&gt;
&lt;li&gt;IntelliJ 의 project SDK 설정 확인&lt;/li&gt;
&lt;li&gt;gradle JVM 설정 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;일단 빌드시에 발생했고, 빌드툴은 gradle 이라는 걸 이미 프로젝트 생성시 설정을 해주었고, IntelliJ에 gradle 이 사용할 자바버전을 설정하는 내용이 있다는 것을 알고있었기에 gradle JVM 설정을 먼저 확인해봤습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;gradle JVM 설정이 기존 설정 그대로 Java 11을 사용하도록&lt;/b&gt; 되어있었습니다.  &lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 생성시 correto 17, Java 17 버전을 설정해주었기에 sourceCompatibility 와 project SDK 는 17버전을 사용하도록 되어있었고, JAVA_HOME에 설정되어있는 현재 시스템에서 기본으로 사용중인 Java 버전과는 관계가 없었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;gradle JVM 설정 확인 방법&lt;/h4&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Preferences/Settings&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt; (&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;⌘ + , &lt;/span&gt;) &lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Build, Execution, Deployment&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Build Tools&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Gradle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gradle jvm configuration.png&quot; data-origin-width=&quot;2024&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KDiqA/btsCTXr25qC/7uqWyk1vWfTd2Gq8TrXHj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KDiqA/btsCTXr25qC/7uqWyk1vWfTd2Gq8TrXHj0/img.png&quot; data-alt=&quot;Gradle JVM 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KDiqA/btsCTXr25qC/7uqWyk1vWfTd2Gq8TrXHj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKDiqA%2FbtsCTXr25qC%2F7uqWyk1vWfTd2Gq8TrXHj0%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;2024&quot; height=&quot;1624&quot; data-filename=&quot;gradle jvm configuration.png&quot; data-origin-width=&quot;2024&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Gradle JVM 설정 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;project SDK 설정 확인 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Project Structure.. &lt;span style=&quot;color: #333333;&quot;&gt;(&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;⌘ + ; &lt;/span&gt;)&lt;/span&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;project sdk configuration.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zhyOy/btsCQrU0w2A/nPP49uSKeTIeidwXKw0iHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zhyOy/btsCQrU0w2A/nPP49uSKeTIeidwXKw0iHk/img.png&quot; data-alt=&quot;Project SDK 설정 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zhyOy/btsCQrU0w2A/nPP49uSKeTIeidwXKw0iHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzhyOy%2FbtsCQrU0w2A%2FnPP49uSKeTIeidwXKw0iHk%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;1906&quot; height=&quot;1124&quot; data-filename=&quot;project sdk configuration.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Project SDK 설정 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;build.gradle 파일의 sourceCompatibility 확인 방법&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sourceCompatibility.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLeqi/btsC00aeJUO/9kYPIsni0yy5HGf9KYBDek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLeqi/btsC00aeJUO/9kYPIsni0yy5HGf9KYBDek/img.png&quot; data-alt=&quot;build.gradle 파일에서 sourceCompatibility 설정 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLeqi/btsC00aeJUO/9kYPIsni0yy5HGf9KYBDek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLeqi%2FbtsC00aeJUO%2F9kYPIsni0yy5HGf9KYBDek%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;1136&quot; height=&quot;436&quot; data-filename=&quot;sourceCompatibility.png&quot; data-origin-width=&quot;1136&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;build.gradle 파일에서 sourceCompatibility 설정 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  Programming</category>
      <category>correto17</category>
      <category>gradle JVM 설정</category>
      <category>java17</category>
      <category>project sdk 설정</category>
      <category>sourceCompatibility 설정</category>
      <category>springboot3</category>
      <category>springboot3 신규프로젝트 빌드에러</category>
      <category>빌드에러</category>
      <author>케이치</author>
      <guid isPermaLink="true">https://keichee.tistory.com/480</guid>
      <comments>https://keichee.tistory.com/480#entry480comment</comments>
      <pubDate>Wed, 3 Jan 2024 10:35:42 +0900</pubDate>
    </item>
  </channel>
</rss>