<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>지글지글</title>
    <link>https://zglzgl.tistory.com/</link>
    <description>zglzgl 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 1 Jun 2026 20:46:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>이제부터100도씨</managingEditor>
    <image>
      <title>지글지글</title>
      <url>https://tistory1.daumcdn.net/tistory/8055115/attach/3a63c609889848e08f72efbbdef254fc</url>
      <link>https://zglzgl.tistory.com</link>
    </image>
    <item>
      <title>One More Second - 탄막 슈팅 게임 웹 서비스</title>
      <link>https://zglzgl.tistory.com/32</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://onemoresecond.site/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://onemoresecond.site/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1771089394367&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ONE MORE SECOND&quot; data-og-description=&quot;&quot; data-og-host=&quot;onemoresecond.site&quot; data-og-source-url=&quot;https://onemoresecond.site/&quot; data-og-url=&quot;https://onemoresecond.site/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://onemoresecond.site/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://onemoresecond.site/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&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;ONE MORE SECOND&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;onemoresecond.site&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;</description>
      <category>김보근</category>
      <author>kbk5675</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/32</guid>
      <comments>https://zglzgl.tistory.com/32#entry32comment</comments>
      <pubDate>Sun, 15 Feb 2026 02:17:10 +0900</pubDate>
    </item>
    <item>
      <title>돌연변이 테스팅</title>
      <link>https://zglzgl.tistory.com/31</link>
      <description>&lt;h2 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;돌연변이 테스팅&lt;/h2&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우선 돌연변이 테스팅은 명령문( &amp;lt;, &amp;lt;=, == 등) 에 대해 변경을 가하여 테스트하는 기법으로 보인다.&lt;/p&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.reddit.com/r/programming/comments/1fub9dw/what_is_mutation_testing_and_why_you_should_use/?tl=ko&quot;&gt;https://www.reddit.com/r/programming/comments/1fub9dw/what_is_mutation_testing_and_why_you_should_use/?tl=ko&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;최근 회사동료와 같이 프로젝트를 진행하며 작성한 테스트 코드에서 힌트를 얻었다.&lt;br /&gt;enum상수의 추상 메소드를 테스트하는 것이었는데, 반환타입을 인터페이스의 구현체 중 아무거나로 변경하여 테스트를 수행해도 깨지지 않았다는 것이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 sample code이다. 이렇게만 test case을 작성하진 않겠지만, 예시임을 이해하라.&lt;/p&gt;
&lt;div style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot;&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;background-color: #151b23; color: #f0f6fc;&quot;&gt;&lt;code&gt;class CarTest {

    @Test
    fun testCarName() {
        val kia = Car.KIA.make()
        val honda = Car.HONDA.make()

        kia.name shouldBeEqual Car.KIA.name
        honda.name shouldBeEqual  Car.HONDA.name
    }
}

enum class Car {
    KIA {
        override fun make() = Kia(this.name)
    },
    HONDA {
        override fun make() = Honda(this.name)
    },
    ;

    abstract fun make(): Cars
}

interface Cars {
    val name: String
    fun isDomestic(): Boolean
}

class Kia(override val name: String) : Cars {
    override fun isDomestic() = true
}

class Honda(override val name: String) : Cars {
    override fun isDomestic() = false
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;테스트에 대한 경험이 충분하다면 위 테스트 케이스가 잘못되었거나(부족) 하다는 것을 쉬이 알 수 있을 것이다.&lt;br /&gt;나는 이 테스트 코드를 보고, 돌연변이 테스팅 기법이 떠올랐다.&lt;/p&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 Car enum class의 HONDA 상수의 make() 반환 클래스를 Kia 로 변경하여도 위 테스트는 문제 없이 동작할 것 이다.&lt;/p&gt;
&lt;div style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot;&gt;
&lt;pre class=&quot;crystal&quot; style=&quot;background-color: #151b23; color: #f0f6fc;&quot;&gt;&lt;code&gt;enum class Car {
    KIA {
        override fun make() = Kia(this.name)
    },
    HONDA {
        override fun make() = Kia(this.name)
    },
    ;

    abstract fun make(): Cars
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;name property로 this.name을 던지고 있기 때문에, 올바른 상수의 name이 전달된다. 뭐, 단순히 conflict resolve의 실수라고 해보면 테스트 코드가 이를 커버하지 못했다고 볼 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;돌연변이 테스팅이 필요한 기법이다, 아니다를 말하기에는 사용해본적이 없어서 아쉽지만 적어도 이러한 기법을 알았기 때문에 위 테스트 코드가 부족함을 아는데에 도움이 되었다고 본다.&lt;/p&gt;</description>
      <category>김동훈</category>
      <author>이제부터100도씨</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/31</guid>
      <comments>https://zglzgl.tistory.com/31#entry31comment</comments>
      <pubDate>Mon, 15 Sep 2025 20:13:44 +0900</pubDate>
    </item>
    <item>
      <title>[Line corp] Kotlin-jdsl commit 쪼개기-1</title>
      <link>https://zglzgl.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;init 커밋이 무려 1만줄이 넘는 변경사항있다.&lt;br /&gt;첫 커밋을 혼자 분석해보는 것도 재미있겠지만, 해보고 싶은 게 많은 나는 ai 의 도움을 받기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gemini-cli도 고려해보았지만, 사용중이던 windsurf을 우선 사용해보기로 했다. agent 기능을 쓸 일은 없을 것 같긴하지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 전체적인 구조 파악을 위해 프로젝트 분석을 시켜두었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-31 오후 5.25.41.png&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;1516&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wdjtf/btsQfbpMK4p/1yS4HBiAj7o3xvkUIOsZZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wdjtf/btsQfbpMK4p/1yS4HBiAj7o3xvkUIOsZZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wdjtf/btsQfbpMK4p/1yS4HBiAj7o3xvkUIOsZZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwdjtf%2FbtsQfbpMK4p%2F1yS4HBiAj7o3xvkUIOsZZk%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;1030&quot; height=&quot;1516&quot; data-filename=&quot;스크린샷 2025-08-31 오후 5.25.41.png&quot; data-origin-width=&quot;1030&quot; data-origin-height=&quot;1516&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 내용을 확인해보고, 이제 각 모듈을 분석해 볼 차례이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효율적으로 분석하기 위해, claude 에게 순서를 추천 받았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-08-31 오후 5.26.24.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GeBVU/btsQctZJlUM/KU7zGNn1rKIqVMbyHP7pX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GeBVU/btsQctZJlUM/KU7zGNn1rKIqVMbyHP7pX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GeBVU/btsQctZJlUM/KU7zGNn1rKIqVMbyHP7pX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGeBVU%2FbtsQctZJlUM%2FKU7zGNn1rKIqVMbyHP7pX0%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;1018&quot; height=&quot;1462&quot; data-filename=&quot;스크린샷 2025-08-31 오후 5.26.24.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;1462&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;이 순서대로 init commit을 쪼개보겠다&lt;/p&gt;</description>
      <category>김동훈</category>
      <author>이제부터100도씨</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/30</guid>
      <comments>https://zglzgl.tistory.com/30#entry30comment</comments>
      <pubDate>Sun, 31 Aug 2025 17:27:15 +0900</pubDate>
    </item>
    <item>
      <title>[Effective Software Testing] chapter_2</title>
      <link>https://zglzgl.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램(기능)의 요구사항(기획서?)을 바탕으로 정의된 명세를 기반으로 테스트를 진행한다.&lt;br /&gt;기능 구현 후, 요구사항에 맞게 잘 구현되었는지 확인하기 위해 먼저 시도해볼 수 있다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 요구사항과 입출력에 대해 이해하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로그램(method)을 3단계로 분석한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메서드가 무엇을 수행하는가? (비즈니스 로직)&lt;/li&gt;
&lt;li&gt;메서드가 무엇을 입력으로 받는가?&lt;/li&gt;
&lt;li&gt;메서드가 무엇을 출력하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 여러 입력값에 대해 프로그램이 수행하는 바를 탐색하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 메서드가 어떤 기능을 구현했는가를 탐색하는 단게이다. (비즈니스 로직 분석 단계)&lt;br /&gt;내가 작성한 코드라면 skip 해도 되지만, 남이 작성한 코드를 테스트할 때 거치는 단계이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예상할 수 있는 입력값들을 통해 해당 메서드를 파악하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;처음 구매한 기기를 탐색해보는 과정으로 느껴진다&lt;/p&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 테스트 가능한 입출력과 구획을 탐색하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;효율적인 입/출력 테스트를 위해 구획화 하는 단계이다. &lt;br /&gt;간단한 예시로, 장바구니 기능을 구현하였다고 해보자. 최대 10개까지만 담을 수 있는 장바구니라면, 3개를 담아보는 입력과 4개를 담아보는 입력은 동등한 입력이므로 작성할 필요가 사라진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;내가 전달하는 입력은 어떤 부류인가?&lt;/li&gt;
&lt;li&gt;각 입력들의 조합에 대해 무엇이 가능한가?&lt;/li&gt;
&lt;li&gt;어떠한 출력들이 가능한가?&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 경계 분석하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어의 버그는 경계에서 흔하게 발생한다.&lt;br /&gt;최대 10개 까지의 장바구니 였다면, 10이라는 값이 경계라고 볼 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접점: on point 경계 위에 있는 점&lt;/li&gt;
&lt;li&gt;거점: off point 다른 구획에 있으면서, 접점과 가장 가까운 점&lt;br /&gt;접점은 10 이다. 거점은 11 이라고 보는데 1 ~ 10은 정상동작, 11부터는 비정상동작으로 보이므로 다른 구획(?)에 존재하면서 10과 가장 가까운 점이다.&lt;/li&gt;
&lt;li&gt;내점: in point 항상 참인 점&lt;/li&gt;
&lt;li&gt;외점 out point 항상 거짓인 점&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 테스트 케이스 고안하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 입력을 조합하는 단계이다&lt;br /&gt;위는 간단한 구현이므로 조합이 많지 않지만, 해당 메서드가 복잡하다면 예를 들어 가격은&lt;span&gt;&amp;nbsp;&lt;/span&gt;30_000₩ 까지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;각 품목은 5개까지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;카테고리는 음식만&lt;span&gt;&amp;nbsp;&lt;/span&gt;등의 요구사항 또는 파라미터가 생기게 되면 조합은 더욱 많아진다. 따라서 필요없는 조합은 제거한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예외 케이스 구획화 (가격이 0원, 품목의 갯수가 0개, 존재하지 않는 카테고리 등)&lt;/li&gt;
&lt;li&gt;각 요구사항 구획화 ( 가격 유효성, 품목 유효성 등)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;카테고리가 음식이 아닌 경우&lt;/li&gt;
&lt;li&gt;가격이 30_000₩이 넘는 경우&lt;/li&gt;
&lt;li&gt;품목의 갯수가 5개 넘는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;총 갯수가 10개 초과 일 때 여러 품목의 합이 10개 초과&lt;/li&gt;
&lt;li&gt;총 갯수 10개 이하&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. 테스트 케이스 자동화하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자동화 라고 해서 거창해보이지만, JUnit 과 같은 테스트 프레임워크로 테스트를 작성함을 말한다.&lt;br /&gt;각 테스트 케이스에 맞는 입력을 만들어 테스트를 작성하면 된다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;7. 창의성과 경험을 발휘해서 테스트 스위트를 강화하기&lt;/h3&gt;
&lt;p style=&quot;background-color: #0d1117; color: #f0f6fc; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우리가 작성했던 테스트 케이스에 빠진 부분이 있는지 검사하는 단계이다&lt;br /&gt;위 장바구니 예제에서 빠진 부분을 찾으면 되는데, 아직 보이지는 않는다. 굳이 만들어보자면, 해외 상품을 장바구니에 담는 경우가 있을 것 같다.&lt;br /&gt;해외($)라면, 매일 환율에 영향을 받으므로 오늘 환율에서는 통과가 되었지만 환율 변동으로 인해&lt;span&gt;&amp;nbsp;&lt;/span&gt;30_000₩&lt;span&gt;&amp;nbsp;&lt;/span&gt;이라는 요구사항을 만족하지 못하는 테스트 케이스가 있을 것 같다.&lt;/p&gt;</description>
      <category>김동훈</category>
      <author>이제부터100도씨</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/29</guid>
      <comments>https://zglzgl.tistory.com/29#entry29comment</comments>
      <pubDate>Sat, 30 Aug 2025 16:21:07 +0900</pubDate>
    </item>
    <item>
      <title>스터디 4기 - In dark 웹 사이트 기반 게임 만들기 - 로그인 구현</title>
      <link>https://zglzgl.tistory.com/28</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;기획 단계에 이어 로그인 페이지 기획과 화면 구현을 진행하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;게임을 진행 및 저장을 위해서는 유저 정보가 가장 먼저 필요해서 첫번째 순서로 진행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;1. 로그인 기획&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;375&quot; data-start=&quot;361&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;b&gt;첫 방문 진입 흐름&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;472&quot; data-start=&quot;378&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;410&quot; data-start=&quot;378&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;첫 화면 = 로그인 화면(전용 라우트 or 모달)&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;444&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;구글 소셜 로그인 및 개인 이메일 로그인&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;444&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;계정 연동 시 커뮤니티/채팅/진행도 동기화&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;444&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;cloude firebase 에 유저 정보 저장&lt;/span&gt;&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;444&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;테마 연출: 커서 위치를 중심으로 횃불 스포트라이트(radial-gradient) 효과로 어두운 배경을 밝히는 컨셉&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;2. 기획에 따른 구현&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;1013&quot; data-origin-height=&quot;1039&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z7uPR/btsP9eGyMNn/zODklanpLOhHKB9jYxSE21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z7uPR/btsP9eGyMNn/zODklanpLOhHKB9jYxSE21/img.png&quot; data-alt=&quot;firebase 프로젝트 등록 진행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z7uPR/btsP9eGyMNn/zODklanpLOhHKB9jYxSE21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ7uPR%2FbtsP9eGyMNn%2FzODklanpLOhHKB9jYxSE21%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;1013&quot; height=&quot;1039&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;1039&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;firebase 프로젝트 등록 진행&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;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이후에 firebase에서 얻은 api key를 내 웹 프로젝트에 적용.&lt;/span&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;1581&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kDWCK/btsP7bjMJfc/Yh2KinwOHDlS85efKNPYa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kDWCK/btsP7bjMJfc/Yh2KinwOHDlS85efKNPYa0/img.png&quot; data-alt=&quot;인증 메뉴에서 이메일 및 구글 인증 허용 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kDWCK/btsP7bjMJfc/Yh2KinwOHDlS85efKNPYa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkDWCK%2FbtsP7bjMJfc%2FYh2KinwOHDlS85efKNPYa0%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;1581&quot; height=&quot;378&quot; data-origin-width=&quot;1581&quot; data-origin-height=&quot;378&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2541&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEl3GC/btsP78UqgF0/9pAJbZ1euZukL47Le0C0Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEl3GC/btsP78UqgF0/9pAJbZ1euZukL47Le0C0Nk/img.png&quot; data-alt=&quot;기획한 테마 및 UI 를 구현&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEl3GC/btsP78UqgF0/9pAJbZ1euZukL47Le0C0Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEl3GC%2FbtsP78UqgF0%2F9pAJbZ1euZukL47Le0C0Nk%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;2541&quot; height=&quot;984&quot; data-origin-width=&quot;2541&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기획한 테마 및 UI 를 구현&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;span style=&quot;color: #9d9d9d;&quot;&gt;이렇게 로그인 단계를 구현 완료했고, vercel을 통해 프론트 배포 진행도 완료했습니다.&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: #9d9d9d;&quot;&gt;문제점&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;은 firebase auth api-key가 vite의 .env.local로 관리되도록 했었는데, 이 부분 때문에 다른 컴퓨터에서 .env.local 파일이 없는 사용자는 페이지가 먹통이었던 문제가 있었습니다.&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: #9d9d9d;&quot;&gt;해결 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;vercel의 환경 변수 설정 페이지가 있는데, 그 곳에서 .env 파일을 생성해 첨부해주면 firebase의 인증키 값을 넣을 수 있고 배포 시 환경 변수 설정이 되어 다른 사용자도 접근이 가능해집니다. firebase 인증 키는 다른 사용자가에게 보여져도 되는 키 값이라 이렇게 환경 변수 설정 쪽에 넣었으나, 관리자 키 값같은 다른 사람에게 비밀이 되어야할 키 값은 넣으면 안됩니다.&amp;nbsp;&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;2738&quot; data-origin-height=&quot;1892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7gSt9/btsP6gztebp/EzP3LYlIy25IGyeq9JJmR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7gSt9/btsP6gztebp/EzP3LYlIy25IGyeq9JJmR0/img.png&quot; data-alt=&quot;vercel 프로젝트의 환경변수 설정 세팅 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7gSt9/btsP6gztebp/EzP3LYlIy25IGyeq9JJmR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7gSt9%2FbtsP6gztebp%2FEzP3LYlIy25IGyeq9JJmR0%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;2738&quot; height=&quot;1892&quot; data-origin-width=&quot;2738&quot; data-origin-height=&quot;1892&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vercel 프로젝트의 환경변수 설정 세팅 페이지&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;span style=&quot;color: #9d9d9d;&quot;&gt;로그인 시, 사용자의 로그인 정보는 cloude DB에 저장됩니다.&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;2209&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2gJ8V/btsP68AYQAw/Bw0hGiKwZRV8RKvncJwFt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2gJ8V/btsP68AYQAw/Bw0hGiKwZRV8RKvncJwFt1/img.png&quot; data-alt=&quot;cloude firebase에 생성된 로그인 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2gJ8V/btsP68AYQAw/Bw0hGiKwZRV8RKvncJwFt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2gJ8V%2FbtsP68AYQAw%2FBw0hGiKwZRV8RKvncJwFt1%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;2209&quot; height=&quot;693&quot; data-origin-width=&quot;2209&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cloude firebase에 생성된 로그인 정보&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;이후 게임의 메인 페이지에 접속됩니다. 다음 시간에는 게임의 생명주기를 구현하고, 게임을 플레이할 수 있도록 구현 예정입니다~&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>김보근</category>
      <category>in-dark</category>
      <author>kbk5675</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/28</guid>
      <comments>https://zglzgl.tistory.com/28#entry28comment</comments>
      <pubDate>Wed, 27 Aug 2025 01:14:12 +0900</pubDate>
    </item>
    <item>
      <title>스터디 4기 - In dark 웹 사이트 기반 게임 만들기 - 기획 단계</title>
      <link>https://zglzgl.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; &lt;/span&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;/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: #666666;&quot;&gt;게임 기획 &amp;amp; &lt;span style=&quot;text-align: start;&quot;&gt;아키텍처 설계 &lt;/span&gt;- GPT 이용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;에셋 생성 - GPT 이용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;코드 구현 및 생성 - Cursor, Codex&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: #666666;&quot;&gt;내가 만들고 싶던 게임의 모호한 계획과 방향성을 GPT 와 의논하면서 상세히 정리하는 것부터 시작.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;여러 프롬프트를 거친 결과, 아래와 같은 기획이 나왔습니다. &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; &lt;/span&gt; &amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-start=&quot;135&quot; data-end=&quot;157&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;게임 방향성과 목적 기획&lt;/span&gt;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-start=&quot;135&quot; data-end=&quot;157&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. 세계관 및 설정&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;175&quot; data-end=&quot;340&quot;&gt;
&lt;li data-start=&quot;175&quot; data-end=&quot;223&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;주인공&lt;/b&gt;: 알 수 없는 이유로 미궁에서 깨어난 존재. 기억도 배경도 없음.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;224&quot; data-end=&quot;340&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;미궁&lt;/b&gt;: 끝을 알 수 없는 어둡고 불길한 공간.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;260&quot; data-end=&quot;340&quot;&gt;
&lt;li data-start=&quot;260&quot; data-end=&quot;297&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;빛이 거의 없고, 플레이어는&amp;nbsp;&lt;b&gt;오직 횃불 하나&lt;/b&gt;에 의존.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;300&quot; data-end=&quot;340&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;어둠 속에서는 &amp;ldquo;볼 수 없다&amp;rdquo;라는 제약이 게임플레이의 본질이 됨.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-start=&quot;342&quot; data-end=&quot;355&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2. 플레이 목적&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;356&quot; data-end=&quot;616&quot;&gt;
&lt;li data-start=&quot;356&quot; data-end=&quot;391&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;단순히&amp;nbsp;&lt;b&gt;탈출&lt;/b&gt;이나&amp;nbsp;&lt;b&gt;보스 처치&lt;/b&gt;가 목표가 아님.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;392&quot; data-end=&quot;431&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;핵심은&amp;nbsp;&lt;b&gt;&amp;ldquo;탐험 과정에서의 경험을 기록하고 공유하는 것&amp;rdquo;&lt;/b&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;432&quot; data-end=&quot;616&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;플레이어는&amp;nbsp;&lt;b&gt;캡처 기능&lt;/b&gt;을 활용해:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;460&quot; data-end=&quot;616&quot;&gt;
&lt;li data-start=&quot;460&quot; data-end=&quot;491&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;특이현상 (이상한 벽, 빛의 틈새, 미지의 문양)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;494&quot; data-end=&quot;523&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;괴물 (공포스러운 존재, 스쳐 지나간 그림자)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;526&quot; data-end=&quot;555&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;보물 (의문스러운 아이템, 쓸모없는 잡동사니)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;558&quot; data-end=&quot;616&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이벤트 (다른 모험가의 흔적, 기묘한 장치)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;등을 발견하고&amp;nbsp;&lt;b&gt;기록 + 커뮤니티 업로드&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-start=&quot;618&quot; data-end=&quot;630&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3. 게임 목표&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;631&quot; data-end=&quot;827&quot;&gt;
&lt;li data-start=&quot;631&quot; data-end=&quot;665&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;개인적으로는 미궁을 &amp;ldquo;계속 헤매는 경험&amp;rdquo;을 즐기는 것.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;666&quot; data-end=&quot;827&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;메타적으로는&amp;nbsp;&lt;b&gt;커뮤니티 게시판&lt;/b&gt;을 채우는 것이 게임의 궁극적인 목표.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;713&quot; data-end=&quot;827&quot;&gt;
&lt;li data-start=&quot;713&quot; data-end=&quot;763&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;플레이어들이 남긴 게시글과 스크린샷이 쌓여서, 미궁의&amp;nbsp;&lt;b&gt;집단적 기록&lt;/b&gt;이 형성됨.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;766&quot; data-end=&quot;827&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;어떤 현상은 여러 사람이 같은 걸 보고 토론할 수도 있고, 누군가가 처음 발견하는 레어한 현상도 있음.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-start=&quot;829&quot; data-end=&quot;842&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;4. 차별 포인트&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;843&quot; data-end=&quot;991&quot;&gt;
&lt;li data-start=&quot;843&quot; data-end=&quot;901&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;보통의 던전 탐험은&amp;nbsp;&lt;b&gt;전투 &amp;rarr; 보상&lt;/b&gt;&amp;nbsp;구조인데, 여기서는&amp;nbsp;&lt;b&gt;발견 &amp;rarr; 기록 &amp;rarr; 공유&lt;/b&gt;&amp;nbsp;구조.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;902&quot; data-end=&quot;953&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이 게임은 커뮤니티가 곧 백과사전이 되고, 세계관 해석이 플레이어들 손에 달려 있음.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;954&quot; data-end=&quot;991&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;즉, &amp;ldquo;게임 + SNS + 집단적 탐험기록&amp;rdquo;이 결합된 형태.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; &lt;/span&gt; 그리고 게임 플레이 생명 주기에 대해서도 모호하게 생각되던 내용들도 GPT와 같이 정리해봤습니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;아래는 그 결과입니다. &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;114&quot; data-end=&quot;130&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;플레이어 행동 패턴 정리&lt;/span&gt;&lt;/h2&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;132&quot; data-end=&quot;153&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1.&amp;nbsp;&lt;b&gt;방 이동하려 할 때&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;154&quot; data-end=&quot;229&quot;&gt;
&lt;li data-start=&quot;154&quot; data-end=&quot;178&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;입장&lt;/b&gt;: 새로운 방으로 들어감.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;179&quot; data-end=&quot;229&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;머무르기&lt;/b&gt;: 현재 방에 남아서 다른 행동(탐색, 휴식, 준비)을 할 수 있음.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;236&quot; data-end=&quot;256&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2.&amp;nbsp;&lt;b&gt;방에 입장했을 때&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;257&quot; data-end=&quot;414&quot;&gt;
&lt;li data-start=&quot;257&quot; data-end=&quot;335&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;살펴보기&lt;/b&gt;: 방 안의 구조, 단서, 숨겨진 요소를 확인.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;298&quot; data-end=&quot;335&quot;&gt;
&lt;li data-start=&quot;298&quot; data-end=&quot;335&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(확률적으로 이벤트 발생: 특이현상, 숨겨진 길, 트랩 등)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-start=&quot;336&quot; data-end=&quot;414&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;줍기&lt;/b&gt;: 방 안의 아이템, 보물, 쓰레기(!)를 획득.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;376&quot; data-end=&quot;414&quot;&gt;
&lt;li data-start=&quot;376&quot; data-end=&quot;414&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;(획득 &amp;rarr; 인벤토리 저장 &amp;rarr; 나중에 커뮤니티 캡처 공유 가능)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;421&quot; data-end=&quot;442&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;3.&amp;nbsp;&lt;b&gt;몬스터를 만났을 때&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;443&quot; data-end=&quot;544&quot;&gt;
&lt;li data-start=&quot;443&quot; data-end=&quot;474&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;공격&lt;/b&gt;: 기본 행동, 무기 또는 도구 사용.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;475&quot; data-end=&quot;504&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;방어&lt;/b&gt;: 피해를 줄이고 반격 기회 노림.&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;505&quot; data-end=&quot;544&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;스킬&lt;/b&gt;: 캐릭터 고유 능력 활용 (쿨타임, 리소스 소비).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;551&quot; data-end=&quot;571&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;게임 UX 플로우 (간단 도식)&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot; data-start=&quot;573&quot; data-end=&quot;769&quot;&gt;
&lt;li data-start=&quot;573&quot; data-end=&quot;613&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;탐험 중&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;rarr; [이동 선택] &amp;rarr; 입장 / 머무르기&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;615&quot; data-end=&quot;689&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;새 방 입장 시&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;rarr; [행동 선택] &amp;rarr; 살펴보기 / 줍기&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;rarr; (특정 확률로 이벤트 or 몬스터 조우)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;691&quot; data-end=&quot;769&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;몬스터 조우 시&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;rarr; [전투 행동] &amp;rarr; 공격 / 방어 / 스킬&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;rarr; (결과에 따라 생존, 도주, 아이템 드랍)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;776&quot; data-end=&quot;789&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;UI 적용 아이디어&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;790&quot; data-end=&quot;965&quot;&gt;
&lt;li data-start=&quot;790&quot; data-end=&quot;844&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;중앙 이미지 영역: 상황에 맞게 교체 (예: 빈 방, 아이템 있는 방, 몬스터 있는 방).&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;845&quot; data-end=&quot;965&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;하단 버튼 UI는&amp;nbsp;&lt;b&gt;상황에 따라 버튼 세트가 바뀌도록&lt;/b&gt;&amp;nbsp;설계.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;888&quot; data-end=&quot;965&quot;&gt;
&lt;li data-start=&quot;888&quot; data-end=&quot;910&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이동 단계: [입장] [머무르기]&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;913&quot; data-end=&quot;937&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;방 탐색 단계: [살펴보기] [줍기]&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;940&quot; data-end=&quot;965&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;전투 단계: [공격] [방어] [스킬]&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666;&quot;&gt; 그리고 이런 플레이 생명주기를 만들면서 정리된 내용들을 통해 상세한 플레이어 상태머신 또한 구현할 수 있었습니다. &lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; text-align: start;&quot;&gt; &lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;140&quot; data-end=&quot;149&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;상태머신 개요&lt;/span&gt;&lt;/h1&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;151&quot; data-end=&quot;160&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;States&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;161&quot; data-end=&quot;469&quot;&gt;
&lt;li data-start=&quot;161&quot; data-end=&quot;180&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Idle 대기(방 선택 전)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;181&quot; data-end=&quot;204&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Move.Select 이동 의사결정&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;205&quot; data-end=&quot;230&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Move.Entering 입장 처리 중&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;231&quot; data-end=&quot;269&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Room.Explore 방 내부 행동(살펴보기/줍기/머무르기)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;270&quot; data-end=&quot;308&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Event.Resolve 특수 이벤트 처리(함정/NPC/기믹)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;309&quot; data-end=&quot;345&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Combat.Decide 전투 선택(공격/방어/스킬/도주)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;346&quot; data-end=&quot;377&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Combat.Resolve 데미지/드랍/사망 판정&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;378&quot; data-end=&quot;406&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Resting 휴식(자원 회복, 시간 경과)&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;407&quot; data-end=&quot;434&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Capture.Prompt 캡처/공유 팝업&lt;/span&gt;&lt;/li&gt;
&lt;li data-start=&quot;435&quot; data-end=&quot;469&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;GameOver 사망 또는 광원 소진 등으로 진행 불가&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;471&quot; data-end=&quot;487&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Resources(예시)&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;488&quot; data-end=&quot;541&quot;&gt;
&lt;li data-start=&quot;488&quot; data-end=&quot;541&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;HP, MP, STA, Torch(횃불 게이지), Bag(인벤토리), Keys 등&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;543&quot; data-end=&quot;559&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;주요 Guards(예시)&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-start=&quot;560&quot; data-end=&quot;644&quot;&gt;
&lt;li data-start=&quot;560&quot; data-end=&quot;644&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;hasTorch(), hasSpaceInBag(), isDoorLocked(), isMonsterHere(), torchLow()&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위와 같은 기획으로 명확한 프레임을 잡는데 큰 도움을 받을 수 있으며, 필요하면 유연하게 기획을 변경할 수도 있습니다.&lt;/p&gt;</description>
      <category>김보근</category>
      <category>in-dark</category>
      <author>kbk5675</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/27</guid>
      <comments>https://zglzgl.tistory.com/27#entry27comment</comments>
      <pubDate>Wed, 27 Aug 2025 01:01:37 +0900</pubDate>
    </item>
    <item>
      <title>지란스터디 4기 계획</title>
      <link>https://zglzgl.tistory.com/26</link>
      <description>&lt;h3 data-end=&quot;110&quot; data-start=&quot;99&quot; data-ke-size=&quot;size23&quot;&gt;목표&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;228&quot; data-start=&quot;111&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;144&quot; data-start=&quot;111&quot;&gt;&lt;b&gt;유튜브 쇼츠 영상 누적 조회수 1000회 달성&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;195&quot; data-start=&quot;145&quot;&gt;AI 도구(Midjourney, HAILUO AI)를 활용&lt;/li&gt;
&lt;li data-end=&quot;228&quot; data-start=&quot;196&quot;&gt;귀여운 동물(고양이 등)을 주제로 콘텐츠 실험&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-end=&quot;250&quot; data-start=&quot;235&quot; data-ke-size=&quot;size23&quot;&gt;사용 도구&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;423&quot; data-start=&quot;251&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;299&quot; data-start=&quot;251&quot;&gt;&lt;b&gt;Midjourney&lt;/b&gt;: 고양이, 강아지, 토끼 등 귀여운 동물 이미지 생성&lt;/li&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;300&quot;&gt;&lt;b&gt;HAILUO AI&lt;/b&gt;: AI 영상 제작&lt;/li&gt;
&lt;li data-end=&quot;384&quot; data-start=&quot;338&quot;&gt;&lt;b&gt;CapCut&lt;/b&gt;: 영상 편집 및 자막 삽입&lt;/li&gt;
&lt;li data-end=&quot;423&quot; data-start=&quot;385&quot;&gt;&lt;b&gt;YouTube Shorts&lt;/b&gt;: 쇼츠 업로드 및 통계 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-end=&quot;455&quot; data-start=&quot;430&quot; data-ke-size=&quot;size23&quot;&gt;활동 일정&lt;/h3&gt;
&lt;p data-end=&quot;465&quot; data-start=&quot;456&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1주차&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;564&quot; data-start=&quot;466&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;512&quot; data-start=&quot;466&quot;&gt;나비를 주제로 영상 제작 테스트 진행 (&lt;a href=&quot;https://lifehi.tistory.com/5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://lifehi.tistory.com/5&lt;/a&gt;)&lt;/li&gt;
&lt;li data-end=&quot;538&quot; data-start=&quot;513&quot;&gt;고양이를 주제로 Midjourney 이미지 -&amp;gt; HAILUO AI로 영상 제작&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;566&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2주차&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;648&quot; data-start=&quot;576&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;600&quot; data-start=&quot;576&quot;&gt;영상 1차 제작 (30~45초 분량)&lt;/li&gt;
&lt;li data-end=&quot;621&quot; data-start=&quot;601&quot;&gt;쇼츠 업로드 및 해시태그 실험&lt;/li&gt;
&lt;li data-end=&quot;648&quot; data-start=&quot;622&quot;&gt;성과 측정 (조회수, 좋아요, 댓글 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>오성찬</category>
      <author>lifehi</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/26</guid>
      <comments>https://zglzgl.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 3 Aug 2025 23:35:45 +0900</pubDate>
    </item>
    <item>
      <title>지란스터디 4기 계획</title>
      <link>https://zglzgl.tistory.com/25</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;데이터베이스 실무 능력 기르기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;목표&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실전 데이터베이스 강의 수강
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B9%80%EC%98%81%ED%95%9C-%EC%8B%A4%EC%A0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B8%B0%EB%B3%B8%ED%8E%B8#curriculum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;김영한의 실전 데이터베이스 - 기본편&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로그래머스 고득점 SQL Kit 문제 풀이
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;프로그래머스 SQL Kit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 1~6주간(6주) 강의 수강 : 매주 섹션 2개씩 수강&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 7~8주간(2주) 문제 풀이 : 매일 풀이하는 문제 개수 다시 정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기대효과&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 더 나은 효율의 데이터베이스 설계와 쿼리에 대한 실력을 쌓을 수 있다&lt;/p&gt;</description>
      <category>김동주</category>
      <author>rlaehdehd7</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/25</guid>
      <comments>https://zglzgl.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 3 Aug 2025 13:36:09 +0900</pubDate>
    </item>
    <item>
      <title>오픈소스에 내이름 박기</title>
      <link>https://zglzgl.tistory.com/24</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://github.com/vladmihalcea/hypersistence-utils&quot;&gt;hypersistence-utils&lt;/a&gt; 오픈소스에 &lt;a href=&quot;https://github.com/vladmihalcea/hypersistence-utils/pull/797&quot;&gt;내 PR&lt;/a&gt;이 merge되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmeOD6/btsPz0DU8lp/p0tIkJdoFs7o9CknNxxJvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmeOD6/btsPz0DU8lp/p0tIkJdoFs7o9CknNxxJvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmeOD6/btsPz0DU8lp/p0tIkJdoFs7o9CknNxxJvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmeOD6%2FbtsPz0DU8lp%2Fp0tIkJdoFs7o9CknNxxJvK%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;2644&quot; height=&quot;1440&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;hypersistenc-utils는 Vlad Mihalcea 가 관리하는 JPA(hibernate)을 사용하면서 겪는 불편함을 해소하기 위한 유틸리티 오픈소스이다. hibernate 6.x대와 7.x 대 모두 지원하고 있다. 그리고 &lt;a href=&quot;https://vladmihalcea.com/tutorials/hibernate/&quot;&gt;hypersistence-optimizer&lt;/a&gt;도 운영중인데, hibernate을 사용할 때 여러 성능 이슈를 감지해주는 도구이다. 간단하게는 EAGER 로딩 전략을 감지해주기도 한다. Vlad Mihalcea는 자바 챔피언이자, hibernate 고수인데 이 분이 발간한 &lt;a href=&quot;https://vladmihalcea.com/books/high-performance-java-persistence/&quot;&gt;high-performance-java-persistence&lt;/a&gt; 라는 책이 있다. 구글에 서치 해보면 많은사람들이 이 책을 좋게 평가하고 있고, hibernate에 깊은 이해를 경험할 수 있다고 한다. 이번에 &lt;a href=&quot;https://jojoldu.tistory.com/825&quot;&gt;향로님이 인프런에 Vlad Mihalcea의 강의도 한국어 더빙판으로 제공하게 협업을 진행하셔서&lt;/a&gt; 최근 공부중인 테스트 코드와 TDD을 어느정도 마무리하면 high-performance-java-persistence책과 함께 수강해볼 예정이다. 기회가 된다면, 다음 스터디에서 진행해볼 듯 싶다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;오픈소스에 기여하게 된 이유&lt;/h2&gt;
&lt;p&gt;우선 내가 기여한 이슈를 간략히 설명하자면, @Tisd 은 @Id기반 컬럼에만 매핑되는 어노테이션이었다. (Tsid는 아래에서 설명하겠다) PrimaryKey외에 일반 컬럼에서도 @Tsid 을 적용하고 싶었고, 이에 대한 &lt;a href=&quot;https://github.com/vladmihalcea/hypersistence-utils/issues/782&quot;&gt;이슈&lt;/a&gt;가 이미 올라와있었다. 몇가지 확인을 한 뒤, ValueGenerationType 을 통해 구현하였다.&lt;/p&gt;
&lt;h2&gt;Tsid 란?&lt;/h2&gt;
&lt;p&gt;Time-Sorted Unique Identifiers 의 약자로 ULID와 Snowflake의 개념이 섞인 id생성 전략이다.&lt;br&gt;총 64비트를 사용하여 첫 42비트는 timestamp 값을, 하위 10비트는 node를 그리고 마지막 12비트는 counter값으로 사용하여 22비트의 random 비트를 사용하여 고유한 값을 제공한다. 물론 64비트를 사용하는 만큼 ULID보다는 충돌 가능성이 높다. 1ms 내에서 약 420만개(2^22)의 유일성을 보장한다. 자세한 설명과 사용법은 &lt;a href=&quot;https://github.com/f4b6a3/tsid-creator?tab=readme-ov-file&quot;&gt;여기&lt;/a&gt;를 참고하거나, 구글 서치하면 많은 자료를 얻을 수 있다.&lt;/p&gt;
&lt;p&gt;SnowFlake Id 나 Tsid 이 방식 모두 시간 역행에 대한 취약점?이 존재한다. 즉, 과거의 시간으로 id을 생성하게 되면 충돌이 발생하게 된다.&lt;br&gt;00-01-01 01 01 01&lt;br&gt;25-01-01T01:01:01.111111&lt;/p&gt;
&lt;h2&gt;오픈소스에 기여하며&lt;/h2&gt;</description>
      <category>김동훈</category>
      <author>이제부터100도씨</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/24</guid>
      <comments>https://zglzgl.tistory.com/24#entry24comment</comments>
      <pubDate>Wed, 16 Jul 2025 21:53:23 +0900</pubDate>
    </item>
    <item>
      <title>지글지글 3기 공지사항</title>
      <link>https://zglzgl.tistory.com/notice/23</link>
      <description>&lt;h2&gt;✏️ 지란 스터디 3기 공지사항&lt;/h2&gt;
&lt;p&gt;​&lt;br&gt;&lt;strong&gt;  기간&lt;/strong&gt;&lt;br&gt;2025년 6월 11일(수) ~ 7월 16일(수) (총 6주)&lt;br&gt;​&lt;br&gt;&lt;strong&gt;  시간&lt;/strong&gt;&lt;br&gt;​&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;수요일 18:00 ~ 21:00&lt;br&gt;​&lt;/li&gt;
&lt;li&gt;&lt;em&gt;  스터디원*&lt;/em&gt;&lt;br&gt;[김동훈]([&lt;a href=&quot;https://github.com/hunknownn%5D&quot;&gt;https://github.com/hunknownn]&lt;/a&gt;, 임동윤, 오성찬, 김보근, 김동주&lt;br&gt;​&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h2&gt;운영 방식&lt;/h2&gt;
&lt;p&gt;​&lt;br&gt;스터디는 &lt;strong&gt;매주 수요일&lt;/strong&gt;에 진행됩니다.&lt;br&gt;​&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h2&gt;  주요 규칙&lt;/h2&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;개인 프로젝트 기반 활동&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6주 기간동안 2회 블로그 글 작성&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;양심에 맡겨 성실히 참여하기!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;참고&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://geultto.github.io/&quot;&gt;글또&lt;/a&gt;&lt;/p&gt;</description>
      <author>이제부터100도씨</author>
      <guid isPermaLink="true">https://zglzgl.tistory.com/notice/23</guid>
      <pubDate>Wed, 16 Jul 2025 21:14:06 +0900</pubDate>
    </item>
  </channel>
</rss>