<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>coding journal</title>
    <link>https://sehuncodingjournal.tistory.com/</link>
    <description>개인이 공부한것들 (잊어버리면 다시 볼수있게) 작성하는 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 28 May 2026 17:13:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>sehunbang</managingEditor>
    <image>
      <title>coding journal</title>
      <url>https://tistory1.daumcdn.net/tistory/6793000/attach/75290380b5ad411baba076b5ea87d57f</url>
      <link>https://sehuncodingjournal.tistory.com</link>
    </image>
    <item>
      <title>Stable diffusion 용어 정리</title>
      <link>https://sehuncodingjournal.tistory.com/186</link>
      <description>&lt;h1 data-end=&quot;169&quot; data-start=&quot;159&quot; data-section-id=&quot;z3ebjz&quot;&gt;핵심 구조 먼저&lt;/h1&gt;
&lt;p data-end=&quot;189&quot; data-start=&quot;171&quot; data-ke-size=&quot;size16&quot;&gt;대략 흐름은 이렇게 생각하면 됨:&lt;/p&gt;
&lt;p data-end=&quot;283&quot; data-start=&quot;191&quot; data-ke-size=&quot;size16&quot;&gt;Prompt &amp;rarr; Text Encoder(CLIP) &amp;rarr; 모델(CheckPoint) &amp;rarr; Sampler &amp;rarr; Latent 이미지 &amp;rarr; VAE Decoder &amp;rarr; 최종 PNG&lt;/p&gt;
&lt;p data-end=&quot;283&quot; data-start=&quot;191&quot; data-ke-size=&quot;size16&quot;&gt;( LoRA는 중간에 모델을 보강하는 추가 학습 파일. )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGjQ60/dJMcadooBcU/KKabRBjZnFahrDO414L4fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGjQ60/dJMcadooBcU/KKabRBjZnFahrDO414L4fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGjQ60/dJMcadooBcU/KKabRBjZnFahrDO414L4fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGjQ60%2FdJMcadooBcU%2FKKabRBjZnFahrDO414L4fK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;461&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;283&quot; data-start=&quot;191&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;335&quot; data-start=&quot;320&quot; data-section-id=&quot;701nlf&quot;&gt;Checkpoint&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFvtJY/dJMcagS2Tlq/BoyMKEnjXMFr6mqG2UqKK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFvtJY/dJMcagS2Tlq/BoyMKEnjXMFr6mqG2UqKK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFvtJY/dJMcagS2Tlq/BoyMKEnjXMFr6mqG2UqKK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFvtJY%2FdJMcagS2Tlq%2FBoyMKEnjXMFr6mqG2UqKK1%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;188&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;346&quot; data-start=&quot;337&quot; data-ke-size=&quot;size16&quot;&gt;모델의 &amp;ldquo;본체&amp;rdquo;.&lt;/p&gt;
&lt;p data-end=&quot;350&quot; data-start=&quot;348&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;399&quot; data-start=&quot;351&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;358&quot; data-start=&quot;351&quot; data-section-id=&quot;17822dx&quot;&gt;SD1.5&lt;/li&gt;
&lt;li data-end=&quot;365&quot; data-start=&quot;359&quot; data-section-id=&quot;1j4cxcb&quot;&gt;SDXL&lt;/li&gt;
&lt;li data-end=&quot;371&quot; data-start=&quot;366&quot; data-section-id=&quot;1o4r7w&quot;&gt;SD3&lt;/li&gt;
&lt;li data-end=&quot;378&quot; data-start=&quot;372&quot; data-section-id=&quot;1j49qv4&quot;&gt;Pony&lt;/li&gt;
&lt;li data-end=&quot;392&quot; data-start=&quot;379&quot; data-section-id=&quot;1g2n2v5&quot;&gt;Illustrious&lt;/li&gt;
&lt;li data-end=&quot;399&quot; data-start=&quot;393&quot; data-section-id=&quot;1j44x7z&quot;&gt;Flux&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;412&quot; data-start=&quot;401&quot; data-ke-size=&quot;size16&quot;&gt;이 파일 하나 안에:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;449&quot; data-start=&quot;413&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;418&quot; data-start=&quot;413&quot; data-section-id=&quot;23rnq0&quot;&gt;그림체&lt;/li&gt;
&lt;li data-end=&quot;427&quot; data-start=&quot;419&quot; data-section-id=&quot;pwu3np&quot;&gt;캐릭터 이해&lt;/li&gt;
&lt;li data-end=&quot;432&quot; data-start=&quot;428&quot; data-section-id=&quot;yi3vk0&quot;&gt;구도&lt;/li&gt;
&lt;li data-end=&quot;437&quot; data-start=&quot;433&quot; data-section-id=&quot;yim1ld&quot;&gt;색감&lt;/li&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;438&quot; data-section-id=&quot;1de961w&quot;&gt;학습 데이터 성향&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;461&quot; data-start=&quot;451&quot; data-ke-size=&quot;size16&quot;&gt;같은 게 들어있음. 보통 확장자는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;498&quot; data-start=&quot;472&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;488&quot; data-start=&quot;472&quot; data-section-id=&quot;1f76hzp&quot;&gt;.safetensors&lt;/li&gt;
&lt;li data-end=&quot;498&quot; data-start=&quot;489&quot; data-section-id=&quot;d6j0oa&quot;&gt;.ckpt&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;546&quot; data-start=&quot;537&quot; data-section-id=&quot;l51lka&quot;&gt;LoRA&lt;/h1&gt;
&lt;p data-end=&quot;574&quot; data-start=&quot;548&quot; data-ke-size=&quot;size16&quot;&gt;기본 모델 위에 덧씌우는 &amp;ldquo;추가 학습 데이터&amp;rdquo;.&lt;/p&gt;
&lt;p data-end=&quot;578&quot; data-start=&quot;576&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;628&quot; data-start=&quot;579&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;579&quot; data-section-id=&quot;1p7rd9l&quot;&gt;특정 캐릭터&lt;/li&gt;
&lt;li data-end=&quot;596&quot; data-start=&quot;588&quot; data-section-id=&quot;1p3j8fo&quot;&gt;특정 그림체&lt;/li&gt;
&lt;li data-end=&quot;604&quot; data-start=&quot;597&quot; data-section-id=&quot;gx6bmo&quot;&gt;특정 포즈&lt;/li&gt;
&lt;li data-end=&quot;612&quot; data-start=&quot;605&quot; data-section-id=&quot;gx8qmk&quot;&gt;특정 얼굴&lt;/li&gt;
&lt;li data-end=&quot;617&quot; data-start=&quot;613&quot; data-section-id=&quot;yilf75&quot;&gt;의상&lt;/li&gt;
&lt;li data-end=&quot;628&quot; data-start=&quot;618&quot; data-section-id=&quot;1ogl2zg&quot;&gt;NSFW 스타일&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;644&quot; data-start=&quot;630&quot; data-ke-size=&quot;size16&quot;&gt;등을 작게 학습시킨 파일.&lt;/p&gt;
&lt;h3 data-end=&quot;652&quot; data-start=&quot;646&quot; data-section-id=&quot;1hrlj9m&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;699&quot; data-start=&quot;653&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;660&quot; data-start=&quot;653&quot; data-section-id=&quot;lgi7p&quot;&gt;용량 작음&lt;/li&gt;
&lt;li data-end=&quot;674&quot; data-start=&quot;661&quot; data-section-id=&quot;1gwk2v8&quot;&gt;여러 개 동시에 가능&lt;/li&gt;
&lt;li data-end=&quot;699&quot; data-start=&quot;675&quot; data-section-id=&quot;slw08d&quot;&gt;체크포인트를 안 바꾸고 스타일 추가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;711&quot; data-start=&quot;701&quot; data-section-id=&quot;1cas823&quot; data-ke-size=&quot;size23&quot;&gt;쉽게 말하면&lt;/h3&gt;
&lt;p data-end=&quot;755&quot; data-start=&quot;712&quot; data-ke-size=&quot;size16&quot;&gt;Checkpoint = 기본 화가&lt;br /&gt;LoRA = 특정 화풍/캐릭터 특화 기억&lt;/p&gt;
&lt;p data-end=&quot;755&quot; data-start=&quot;712&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;755&quot; data-start=&quot;712&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;770&quot; data-start=&quot;762&quot; data-section-id=&quot;npj5b3&quot;&gt;SD3&lt;/h1&gt;
&lt;p data-end=&quot;836&quot; data-start=&quot;772&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;Stability AI&lt;/span&gt;&lt;/span&gt; 의&lt;br /&gt;Stable Diffusion 3 모델.&lt;/p&gt;
&lt;p data-end=&quot;852&quot; data-start=&quot;838&quot; data-ke-size=&quot;size16&quot;&gt;SD 계열 세대 중 하나.&lt;/p&gt;
&lt;p data-end=&quot;857&quot; data-start=&quot;854&quot; data-ke-size=&quot;size16&quot;&gt;흐름:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;909&quot; data-start=&quot;858&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;879&quot; data-start=&quot;858&quot; data-section-id=&quot;phj8c6&quot;&gt;SD1.5 &amp;rarr; 오래됨, 가볍고 빠름&lt;/li&gt;
&lt;li data-end=&quot;892&quot; data-start=&quot;880&quot; data-section-id=&quot;1l7ni61&quot;&gt;SDXL &amp;rarr; 고품질&lt;/li&gt;
&lt;li data-end=&quot;909&quot; data-start=&quot;893&quot; data-section-id=&quot;t4dh02&quot;&gt;SD3 &amp;rarr; 더 발전된 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;917&quot; data-start=&quot;911&quot; data-section-id=&quot;1hrlj9m&quot; data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;966&quot; data-start=&quot;918&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;931&quot; data-start=&quot;918&quot; data-section-id=&quot;6pp8l9&quot;&gt;프롬프트 이해력 향상&lt;/li&gt;
&lt;li data-end=&quot;941&quot; data-start=&quot;932&quot; data-section-id=&quot;pcjji3&quot;&gt;손/글자 개선&lt;/li&gt;
&lt;li data-end=&quot;953&quot; data-start=&quot;942&quot; data-section-id=&quot;ehk8a3&quot;&gt;구조 이해 좋아짐&lt;/li&gt;
&lt;li data-end=&quot;966&quot; data-start=&quot;954&quot; data-section-id=&quot;13wks3h&quot;&gt;하드웨어 요구량 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;974&quot; data-start=&quot;968&quot; data-section-id=&quot;1hrgjzy&quot; data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1021&quot; data-start=&quot;975&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;980&quot; data-start=&quot;975&quot; data-section-id=&quot;1z2m24&quot;&gt;무거움&lt;/li&gt;
&lt;li data-end=&quot;1004&quot; data-start=&quot;981&quot; data-section-id=&quot;1k2fxj&quot;&gt;생태계가 SDXL보다 작았던 시기 있음&lt;/li&gt;
&lt;li data-end=&quot;1021&quot; data-start=&quot;1005&quot; data-section-id=&quot;1uh4o34&quot;&gt;일부 워크플로우 호환 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 data-end=&quot;1039&quot; data-start=&quot;1028&quot; data-section-id=&quot;17s3mhk&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-end=&quot;1039&quot; data-start=&quot;1028&quot; data-section-id=&quot;17s3mhk&quot;&gt;Prompt ( CLIP Text Encoder )&lt;/h1&gt;
&lt;p data-end=&quot;1053&quot; data-start=&quot;1041&quot; data-ke-size=&quot;size16&quot;&gt;AI에게 주는 지시문.&lt;/p&gt;
&lt;p data-end=&quot;1057&quot; data-start=&quot;1055&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1girl, elf knight, silver armor, fantasy forest&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-end=&quot;1559&quot; data-start=&quot;1540&quot; data-section-id=&quot;r2uoc2&quot;&gt;Model Sampling&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQlMEf/dJMcaffy3c5/GamDTDX36bUKgbLq6j45hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQlMEf/dJMcaffy3c5/GamDTDX36bUKgbLq6j45hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQlMEf/dJMcaffy3c5/GamDTDX36bUKgbLq6j45hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQlMEf%2FdJMcaffy3c5%2FGamDTDX36bUKgbLq6j45hk%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;214&quot; height=&quot;57&quot; data-origin-width=&quot;214&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;1580&quot; data-start=&quot;1561&quot; data-ke-size=&quot;size16&quot;&gt;이미지를 &amp;ldquo;점점 만들어가는 과정&amp;rdquo;.&lt;/p&gt;
&lt;p data-end=&quot;1620&quot; data-start=&quot;1582&quot; data-ke-size=&quot;size16&quot;&gt;처음엔 랜덤 노이즈 상태인데,&lt;br /&gt;Sampler가 조금씩 그림으로 바꿈.&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;h1 data-end=&quot;1838&quot; data-start=&quot;1825&quot; data-section-id=&quot;1johmg0&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-end=&quot;1838&quot; data-start=&quot;1825&quot; data-section-id=&quot;1johmg0&quot;&gt;KSampler&lt;/h1&gt;
&lt;p data-end=&quot;1890&quot; data-start=&quot;1840&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;ComfyUI&lt;/span&gt;&lt;/span&gt; 에서 핵심 생성 노드.&lt;/p&gt;
&lt;p data-end=&quot;1906&quot; data-start=&quot;1892&quot; data-ke-size=&quot;size16&quot;&gt;실제로 그림 만드는 역할.&lt;/p&gt;
&lt;p data-end=&quot;1911&quot; data-start=&quot;1908&quot; data-ke-size=&quot;size16&quot;&gt;입력:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1948&quot; data-start=&quot;1912&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1916&quot; data-start=&quot;1912&quot; data-section-id=&quot;yhyjy0&quot;&gt;모델&lt;/li&gt;
&lt;li data-end=&quot;1923&quot; data-start=&quot;1917&quot; data-section-id=&quot;az3v5o&quot;&gt;프롬프트&lt;/li&gt;
&lt;li data-end=&quot;1934&quot; data-start=&quot;1924&quot; data-section-id=&quot;5g5s66&quot;&gt;시드(seed)&lt;/li&gt;
&lt;li data-end=&quot;1942&quot; data-start=&quot;1935&quot; data-section-id=&quot;16n84zt&quot;&gt;steps&lt;/li&gt;
&lt;li data-end=&quot;1948&quot; data-start=&quot;1943&quot; data-section-id=&quot;1o3p8q&quot;&gt;cfg&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1973&quot; data-start=&quot;1950&quot; data-ke-size=&quot;size16&quot;&gt;등을 받아서 latent 이미지를 생성함.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaOvY/dJMcacXodoG/UdQLXcfPi9UQOpDkAnkvrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaOvY/dJMcacXodoG/UdQLXcfPi9UQOpDkAnkvrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaOvY/dJMcacXodoG/UdQLXcfPi9UQOpDkAnkvrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxaOvY%2FdJMcacXodoG%2FUdQLXcfPi9UQOpDkAnkvrk%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;320&quot; height=&quot;294&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;294&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;h1 data-end=&quot;2364&quot; data-start=&quot;2348&quot; data-section-id=&quot;9oiwt9&quot;&gt;VAE Decoder&lt;/h1&gt;
&lt;p data-end=&quot;2397&quot; data-start=&quot;2366&quot; data-ke-size=&quot;size16&quot;&gt;Latent &amp;rarr; 실제 이미지(PNG) 로 변환하는 장치.&lt;/p&gt;
&lt;p data-end=&quot;2401&quot; data-start=&quot;2399&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2431&quot; data-start=&quot;2402&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2431&quot; data-start=&quot;2402&quot; data-section-id=&quot;1ha82hs&quot;&gt;AI 내부 압축 그림&lt;br /&gt;&amp;rarr; 사람이 볼 수 있는 그림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2440&quot; data-start=&quot;2433&quot; data-ke-size=&quot;size16&quot;&gt;으로 바꿔줌.&lt;/p&gt;
&lt;hr data-end=&quot;2445&quot; data-start=&quot;2442&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2456&quot; data-start=&quot;2447&quot; data-section-id=&quot;1kpwwa3&quot; data-ke-size=&quot;size26&quot;&gt;왜 중요함?&lt;/h2&gt;
&lt;p data-end=&quot;2466&quot; data-start=&quot;2458&quot; data-ke-size=&quot;size16&quot;&gt;VAE에 따라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2487&quot; data-start=&quot;2467&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2471&quot; data-start=&quot;2467&quot; data-section-id=&quot;yim1ld&quot;&gt;색감&lt;/li&gt;
&lt;li data-end=&quot;2476&quot; data-start=&quot;2472&quot; data-section-id=&quot;yhyzyx&quot;&gt;명암&lt;/li&gt;
&lt;li data-end=&quot;2482&quot; data-start=&quot;2477&quot; data-section-id=&quot;229m30&quot;&gt;디테일&lt;/li&gt;
&lt;li data-end=&quot;2487&quot; data-start=&quot;2483&quot; data-section-id=&quot;yijwrs&quot;&gt;채도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2494&quot; data-start=&quot;2489&quot; data-ke-size=&quot;size16&quot;&gt;차이 남.&lt;/p&gt;
&lt;p data-end=&quot;2529&quot; data-start=&quot;2496&quot; data-ke-size=&quot;size16&quot;&gt;그래서 같은 모델이어도&lt;br /&gt;VAE 바꾸면 느낌 달라질 수 있음.&lt;/p&gt;</description>
      <category>AI</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/186</guid>
      <comments>https://sehuncodingjournal.tistory.com/186#entry186comment</comments>
      <pubDate>Wed, 13 May 2026 17:05:46 +0900</pubDate>
    </item>
    <item>
      <title>필요한 패키지</title>
      <link>https://sehuncodingjournal.tistory.com/185</link>
      <description>&lt;h2 data-end=&quot;139&quot; data-start=&quot;103&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ Netcode for GameObjects (NGO)&lt;/h2&gt;
&lt;p data-end=&quot;162&quot; data-start=&quot;140&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;게임 안에서 &amp;ldquo;동기화&amp;rdquo; 담당&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;255&quot; data-start=&quot;164&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;184&quot; data-start=&quot;164&quot;&gt;플레이어 위치, 회전, 애니메이션&lt;/li&gt;
&lt;li data-end=&quot;207&quot; data-start=&quot;185&quot;&gt;RPC, NetworkVariable&lt;/li&gt;
&lt;li data-end=&quot;223&quot; data-start=&quot;208&quot;&gt;서버 권한 / 클라 권한&lt;/li&gt;
&lt;li data-end=&quot;255&quot; data-start=&quot;224&quot;&gt;Host / Dedicated Server 모두 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;257&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;293&quot; data-start=&quot;260&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;293&quot; data-start=&quot;262&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;이미 연결된 플레이어들끼리 게임을 굴리는 엔진&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;366&quot; data-start=&quot;295&quot; data-ke-size=&quot;size16&quot;&gt;❗중요&lt;br /&gt;NGO는 &lt;b&gt;서버를 어디서 돌릴지&lt;/b&gt;, &lt;b&gt;누구랑 매칭할지&lt;/b&gt;는 신경 안 씀&lt;br /&gt;&amp;rarr; 그냥 &amp;ldquo;연결만 되면 동기화&amp;rdquo;만 함&lt;/p&gt;
&lt;hr data-end=&quot;371&quot; data-start=&quot;368&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;417&quot; data-start=&quot;373&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ Multiplay (Unity Game Server Hosting)&lt;/h2&gt;
&lt;p data-end=&quot;449&quot; data-start=&quot;418&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;서버를 자동으로 띄워주는 놈 (인프라 담당)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;542&quot; data-start=&quot;451&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;476&quot; data-start=&quot;451&quot;&gt;Dedicated Server 빌드 업로드&lt;/li&gt;
&lt;li data-end=&quot;504&quot; data-start=&quot;477&quot;&gt;AWS/GCP 같은 클라우드에 서버 자동 실행&lt;/li&gt;
&lt;li data-end=&quot;526&quot; data-start=&quot;505&quot;&gt;플레이어 수에 따라 서버 증설/종료&lt;/li&gt;
&lt;li data-end=&quot;542&quot; data-start=&quot;527&quot;&gt;DDoS 보호, 헬스체크&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;544&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;575&quot; data-start=&quot;547&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;575&quot; data-start=&quot;549&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;서버 컴퓨터를 대신 관리해주는 서비스&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;588&quot; data-start=&quot;577&quot; data-ke-size=&quot;size16&quot;&gt;❗ NGO랑 관계&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;662&quot; data-start=&quot;589&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;626&quot; data-start=&quot;589&quot;&gt;Multiplay 서버 안에서 &lt;b&gt;NGO 서버 모드&lt;/b&gt;가 실행됨&lt;/li&gt;
&lt;li data-end=&quot;642&quot; data-start=&quot;627&quot;&gt;NGO = 게임 로직&lt;/li&gt;
&lt;li data-end=&quot;662&quot; data-start=&quot;643&quot;&gt;Multiplay = 서버 공장&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;667&quot; data-start=&quot;664&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;686&quot; data-start=&quot;669&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ Matchmaker&lt;/h2&gt;
&lt;p data-end=&quot;709&quot; data-start=&quot;687&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;누구랑 게임할지 정해주는 놈&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;752&quot; data-start=&quot;711&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;730&quot; data-start=&quot;711&quot;&gt;큐 시스템 (랭크, 핑, 지역)&lt;/li&gt;
&lt;li data-end=&quot;738&quot; data-start=&quot;731&quot;&gt;파티 매칭&lt;/li&gt;
&lt;li data-end=&quot;745&quot; data-start=&quot;739&quot;&gt;방 찾기&lt;/li&gt;
&lt;li data-end=&quot;752&quot; data-start=&quot;746&quot;&gt;팀 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;756&quot; data-start=&quot;754&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;791&quot; data-start=&quot;757&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;791&quot; data-start=&quot;759&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;너랑 비슷한 사람들 찾아서 서버에 넣어주는 역할&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;855&quot; data-start=&quot;793&quot; data-ke-size=&quot;size16&quot;&gt;❗ Matchmaker는 &lt;b&gt;게임 동기화 안 함&lt;/b&gt;&lt;br /&gt;❗ 서버도 안 돌림&lt;br /&gt;&amp;rarr; 그냥 &lt;b&gt;연결 경로를 만들어줌&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;860&quot; data-start=&quot;857&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;886&quot; data-start=&quot;862&quot; data-ke-size=&quot;size26&quot;&gt;  전체 흐름 (실전에서 이렇게 씀)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;[플레이어] &amp;darr; Matchmaker &amp;darr; (매칭 성공) Multiplay &amp;darr; (서버 할당) Netcode for GameObjects &amp;darr; 실제 게임 플레이 &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1010&quot; data-start=&quot;1001&quot; data-ke-size=&quot;size23&quot;&gt;순서 요약&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1179&quot; data-start=&quot;1011&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1048&quot; data-start=&quot;1011&quot;&gt;플레이어 &amp;rarr; &lt;b&gt;Matchmaker&lt;/b&gt;에 &amp;ldquo;게임 하고 싶어요&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;1078&quot; data-start=&quot;1049&quot;&gt;Matchmaker &amp;rarr; 조건 맞는 플레이어 묶음&lt;/li&gt;
&lt;li data-end=&quot;1115&quot; data-start=&quot;1079&quot;&gt;Matchmaker &amp;rarr; &lt;b&gt;Multiplay&lt;/b&gt;에 서버 요청&lt;/li&gt;
&lt;li data-end=&quot;1136&quot; data-start=&quot;1116&quot;&gt;Multiplay &amp;rarr; 서버 띄움&lt;/li&gt;
&lt;li data-end=&quot;1153&quot; data-start=&quot;1137&quot;&gt;플레이어들 &amp;rarr; 서버 접속&lt;/li&gt;
&lt;li data-end=&quot;1179&quot; data-start=&quot;1154&quot;&gt;서버 안에서 &lt;b&gt;NGO&lt;/b&gt;가 동기화 처리&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Unity/Multiplayer</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/185</guid>
      <comments>https://sehuncodingjournal.tistory.com/185#entry185comment</comments>
      <pubDate>Sun, 8 Feb 2026 19:25:50 +0900</pubDate>
    </item>
    <item>
      <title>Behavior tree</title>
      <link>https://sehuncodingjournal.tistory.com/184</link>
      <description>&lt;h3 data-end=&quot;164&quot; data-start=&quot;152&quot; data-ke-size=&quot;size23&quot;&gt;  기본 개념&lt;/h3&gt;
&lt;p data-end=&quot;271&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;Behavior Tree는 이름 그대로 &amp;ldquo;트리(Tree)&amp;rdquo; 구조예요.&lt;br /&gt;&lt;b&gt;루트 노드 &amp;rarr; 하위 노드(Sequence, Selector 등) &amp;rarr; 리프 노드(실제 행동)&lt;/b&gt; 으로 구성됩니다.&lt;/p&gt;
&lt;h3 data-end=&quot;490&quot; data-start=&quot;475&quot; data-ke-size=&quot;size23&quot;&gt;⚙️ 주요 노드 타입&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;노드 타입설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;837&quot; data-start=&quot;492&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;837&quot; data-start=&quot;529&quot;&gt;
&lt;tr data-end=&quot;551&quot; data-start=&quot;529&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;540&quot; data-start=&quot;529&quot;&gt;&lt;b&gt;Root&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;551&quot; data-start=&quot;540&quot; data-col-size=&quot;md&quot;&gt;트리의 시작점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;611&quot; data-start=&quot;552&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;567&quot; data-start=&quot;552&quot;&gt;&lt;b&gt;Selector&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;611&quot; data-start=&quot;567&quot; data-col-size=&quot;md&quot;&gt;자식 노드를 순서대로 검사 &amp;rarr; 하나라도 성공하면 멈춤 (&amp;ldquo;A 또는 B&amp;rdquo;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;672&quot; data-start=&quot;612&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;627&quot; data-start=&quot;612&quot;&gt;&lt;b&gt;Sequence&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;672&quot; data-start=&quot;627&quot; data-col-size=&quot;md&quot;&gt;자식 노드를 순서대로 실행 &amp;rarr; 하나라도 실패하면 멈춤 (&amp;ldquo;A 그리고 B&amp;rdquo;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;741&quot; data-start=&quot;673&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;689&quot; data-start=&quot;673&quot;&gt;&lt;b&gt;Decorator&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;741&quot; data-start=&quot;689&quot; data-col-size=&quot;md&quot;&gt;특정 조건을 감싸거나, 반복 수행을 제어 (&amp;ldquo;조건이 참일 때만 실행&amp;rdquo;, &amp;ldquo;매초 반복&amp;rdquo;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;788&quot; data-start=&quot;742&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;755&quot; data-start=&quot;742&quot;&gt;&lt;b&gt;Action&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;788&quot; data-start=&quot;755&quot; data-col-size=&quot;md&quot;&gt;실제로 캐릭터가 하는 행동 (공격, 이동, 대기 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;837&quot; data-start=&quot;789&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;805&quot; data-start=&quot;789&quot;&gt;&lt;b&gt;Condition&lt;/b&gt;&lt;/td&gt;
&lt;td data-end=&quot;837&quot; data-start=&quot;805&quot; data-col-size=&quot;md&quot;&gt;상태 검사 (플레이어가 보이는가? 체력이 낮은가?)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;842&quot; data-start=&quot;839&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;865&quot; data-start=&quot;844&quot; data-ke-size=&quot;size23&quot;&gt;  Unity에서의 사용 방법&lt;/h3&gt;
&lt;p data-end=&quot;938&quot; data-start=&quot;867&quot; data-ke-size=&quot;size16&quot;&gt;Unity는 기본적으로 Behavior Tree 시스템이 내장되어 있진 않아요.&lt;br /&gt;그래서 보통 아래 중 하나를 사용합니다  &lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1257&quot; data-start=&quot;940&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1066&quot; data-start=&quot;940&quot;&gt;&lt;b&gt;직접 구현 (C#으로 커스텀 Behavior Tree 만들기)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1066&quot; data-start=&quot;987&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1005&quot; data-start=&quot;987&quot;&gt;자유도가 높지만 코드량 많음.&lt;/li&gt;
&lt;li data-end=&quot;1066&quot; data-start=&quot;1009&quot;&gt;예: Node, CompositeNode, ActionNode 클래스 구조로 직접 제작.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1068&quot;&gt;&lt;b&gt;플러그인 / 툴 사용&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1257&quot; data-start=&quot;1090&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1158&quot; data-start=&quot;1090&quot;&gt;&lt;b&gt;Behavior Designer (by Opsive)&lt;/b&gt; &amp;rarr; 시각적으로 Behavior Tree 구성 가능 (유료)&lt;/li&gt;
&lt;li data-end=&quot;1215&quot; data-start=&quot;1162&quot;&gt;&lt;b&gt;NodeCanvas&lt;/b&gt;, &lt;b&gt;Bolt/FlowCanvas&lt;/b&gt;, &lt;b&gt;Panda BT&lt;/b&gt; 등&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1219&quot;&gt;노드 기반 비주얼 스크립팅처럼 드래그 앤 드롭으로 트리 구성 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1262&quot; data-start=&quot;1259&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1289&quot; data-start=&quot;1264&quot; data-ke-size=&quot;size23&quot;&gt;  예시 (직접 구현한 간단한 구조)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;abstract&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;abstract&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Execute&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(); } &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Sequence&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span&gt; List&amp;lt;Node&amp;gt; children = &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; List&amp;lt;Node&amp;gt;(); &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Sequence&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;params&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Node[] nodes) { children.AddRange(nodes); } &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;override&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Execute&lt;/span&gt;&lt;/span&gt;&lt;span&gt;() { &lt;/span&gt;&lt;span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span&gt; node &lt;/span&gt;&lt;span&gt;&lt;span&gt;in&lt;/span&gt;&lt;/span&gt;&lt;span&gt; children) { &lt;/span&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (!node.Execute()) &lt;/span&gt;&lt;span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;&lt;span&gt;// 하나라도 실패하면 종료&lt;/span&gt;&lt;/span&gt;&lt;span&gt; } &lt;/span&gt;&lt;span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span&gt;; } } &lt;/span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ActionNode&lt;/span&gt;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;&lt;span&gt;Node&lt;/span&gt;&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Func&amp;lt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; action; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;ActionNode&lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;Func&amp;lt;&lt;span&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt; action) =&amp;gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;this&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.action = action; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;override&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;Execute&lt;/span&gt;&lt;/span&gt;&lt;span&gt;() =&amp;gt; action(); } &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1944&quot; data-start=&quot;1936&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;var&lt;/span&gt;&lt;/span&gt;&lt;span&gt; attackSequence = &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; Sequence( &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ActionNode(CheckPlayerInSight), &lt;/span&gt;&lt;span&gt;&lt;span&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span&gt; ActionNode(Attack) ); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2087&quot; data-start=&quot;2064&quot; data-ke-size=&quot;size16&quot;&gt;처럼 조합해서 트리처럼 행동을 구성합니다.&lt;/p&gt;</description>
      <category>Unity/RTS</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/184</guid>
      <comments>https://sehuncodingjournal.tistory.com/184#entry184comment</comments>
      <pubDate>Wed, 22 Oct 2025 18:12:54 +0900</pubDate>
    </item>
    <item>
      <title>Navigation Mesh</title>
      <link>https://sehuncodingjournal.tistory.com/183</link>
      <description>&lt;h3 data-end=&quot;102&quot; data-start=&quot;93&quot; data-ke-size=&quot;size23&quot;&gt;  특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;421&quot; data-start=&quot;103&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;247&quot; data-start=&quot;103&quot;&gt;&lt;b&gt;길찾기용 데이터 구조&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;247&quot; data-start=&quot;125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;158&quot; data-start=&quot;125&quot;&gt;Terrain / Collider 그대로 쓰지 않고,&lt;/li&gt;
&lt;li data-end=&quot;207&quot; data-start=&quot;161&quot;&gt;캐릭터가 &lt;b&gt;실제로 걸을 수 있는 영역만&lt;/b&gt; 추출해 만든 &lt;b&gt;폴리곤 네트워크&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;224&quot; data-start=&quot;210&quot;&gt;포함: 계단, 언덕&lt;/li&gt;
&lt;li data-end=&quot;247&quot; data-start=&quot;227&quot;&gt;제외: 벽, 절벽, 장애물 위&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;249&quot;&gt;&lt;b&gt;경로 탐색&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;350&quot; data-start=&quot;265&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;265&quot;&gt;A* / Dijkstra 알고리즘 실행&lt;/li&gt;
&lt;li data-end=&quot;323&quot; data-start=&quot;293&quot;&gt;NavMesh 위에서 목적지까지 최적 경로 계산&lt;/li&gt;
&lt;li data-end=&quot;350&quot; data-start=&quot;326&quot;&gt;캐릭터는 경로를 따라 자연스럽게 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;352&quot;&gt;&lt;b&gt;동적 처리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;421&quot; data-start=&quot;368&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;421&quot; data-start=&quot;368&quot;&gt;장애물 이동, 문 열림/닫힘 &amp;rarr; NavMesh Obstacle 로 &lt;b&gt;실시간 업데이트&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;442&quot; data-start=&quot;428&quot; data-ke-size=&quot;size23&quot;&gt;  왜 필요한가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;557&quot; data-start=&quot;443&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;483&quot; data-start=&quot;443&quot;&gt;단순 &lt;b&gt;Grid 기반&lt;/b&gt; 경로 탐색 &amp;rarr; &lt;b&gt;부정확, 비효율적&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;557&quot; data-start=&quot;484&quot;&gt;NavMesh &amp;rarr; 공간을 &lt;b&gt;최적화된 Polygon&lt;/b&gt;으로 표현
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;557&quot; data-start=&quot;526&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;540&quot; data-start=&quot;526&quot;&gt;✅ 빠른 경로 계산&lt;/li&gt;
&lt;li data-end=&quot;557&quot; data-start=&quot;543&quot;&gt;✅ 부드러운 움직임&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;576&quot; data-start=&quot;564&quot; data-ke-size=&quot;size23&quot;&gt;  활용 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;691&quot; data-start=&quot;577&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;613&quot; data-start=&quot;577&quot;&gt;&lt;b&gt;RTS&lt;/b&gt; &amp;rarr; 유닛들이 서로 막히지 않고 최단거리 이동&lt;/li&gt;
&lt;li data-end=&quot;651&quot; data-start=&quot;614&quot;&gt;&lt;b&gt;RPG/액션&lt;/b&gt; &amp;rarr; NPC가 장애물 피해 자연스럽게 이동&lt;/li&gt;
&lt;li data-end=&quot;691&quot; data-start=&quot;652&quot;&gt;&lt;b&gt;스텔스 게임&lt;/b&gt; &amp;rarr; AI가 벽/구조물 회피하며 플레이어 추적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;704&quot; data-start=&quot;693&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;정의&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;773&quot; data-start=&quot;705&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;773&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;NavMesh = &quot;캐릭터가 다닐 수 있는 영역을 폴리곤으로 표현, AI가 길을 찾을 수 있도록 하는 데이터 구조&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 data-end=&quot;802&quot; data-start=&quot;780&quot;&gt;  NavMesh에서 Cost 개념&lt;/h1&gt;
&lt;h3 data-end=&quot;816&quot; data-start=&quot;804&quot; data-ke-size=&quot;size23&quot;&gt;  기본 원리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;887&quot; data-start=&quot;817&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;861&quot; data-start=&quot;817&quot;&gt;A* 탐색 시 &lt;b&gt;비용(cost)&lt;/b&gt; = 이동 거리 + 앞으로 예상 거리&lt;/li&gt;
&lt;li data-end=&quot;887&quot; data-start=&quot;862&quot;&gt;가장 &lt;b&gt;총 비용이 낮은 경로&lt;/b&gt; 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;917&quot; data-start=&quot;894&quot; data-ke-size=&quot;size23&quot;&gt;  NavMesh 특화된 Cost&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1084&quot; data-start=&quot;918&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1084&quot; data-start=&quot;918&quot;&gt;영역마다 다른 Cost 부여 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1084&quot; data-start=&quot;943&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;973&quot; data-start=&quot;943&quot;&gt;길 (Default) &amp;rarr; cost = &lt;b&gt;1&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1007&quot; data-start=&quot;976&quot;&gt;풀숲 &amp;rarr; cost = &lt;b&gt;2&lt;/b&gt; (느리게, 기피)&lt;/li&gt;
&lt;li data-end=&quot;1050&quot; data-start=&quot;1010&quot;&gt;위험 지역(불/늪/독) &amp;rarr; cost = &lt;b&gt;5&lt;/b&gt; (되도록 피함)&lt;/li&gt;
&lt;li data-end=&quot;1084&quot; data-start=&quot;1053&quot;&gt;벽/절벽 &amp;rarr; cost = &lt;b&gt;&amp;infin;&lt;/b&gt; (이동 불가)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1094&quot; data-start=&quot;1086&quot; data-ke-size=&quot;size16&quot;&gt;  예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1167&quot; data-start=&quot;1095&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1120&quot; data-start=&quot;1095&quot;&gt;풀숲 가로질러 10m (cost 높음)&lt;/li&gt;
&lt;li data-end=&quot;1143&quot; data-start=&quot;1121&quot;&gt;돌아가서 15m (cost 낮음)&lt;/li&gt;
&lt;li data-end=&quot;1167&quot; data-start=&quot;1144&quot;&gt;&amp;rarr; AI는 &lt;b&gt;돌아가는 길 선택&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1199&quot; data-start=&quot;1174&quot; data-ke-size=&quot;size23&quot;&gt;  Unity NavMesh Cost&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1256&quot; data-start=&quot;1200&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1223&quot; data-start=&quot;1200&quot;&gt;&lt;b&gt;NavMesh Area&lt;/b&gt; 사용&lt;/li&gt;
&lt;li data-end=&quot;1256&quot; data-start=&quot;1224&quot;&gt;Area 별 cost multiplier 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;int&lt;/span&gt;&lt;/span&gt;&lt;span&gt; grassArea = NavMesh.GetAreaFromName(&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;Grass&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); NavMesh.SetAreaCost(grassArea, &lt;/span&gt;&lt;span&gt;&lt;span&gt;2.0f&lt;/span&gt;&lt;/span&gt;&lt;span&gt;); &lt;/span&gt;&lt;span&gt;&lt;span&gt;// 풀숲은 비용 2배&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1405&quot; data-start=&quot;1379&quot; data-ke-size=&quot;size23&quot;&gt;  Unreal NavMesh Cost&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1462&quot; data-start=&quot;1406&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1440&quot; data-start=&quot;1406&quot;&gt;&lt;b&gt;NavModifierVolume&lt;/b&gt; 으로 영역 지정&lt;/li&gt;
&lt;li data-end=&quot;1462&quot; data-start=&quot;1441&quot;&gt;AreaClass 별 비용 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;AreaClassCost
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1655&quot; data-start=&quot;1464&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1655&quot; data-start=&quot;1528&quot;&gt;
&lt;tr data-end=&quot;1559&quot; data-start=&quot;1528&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1551&quot; data-start=&quot;1528&quot;&gt;UNavArea_Default&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1559&quot; data-start=&quot;1551&quot;&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1591&quot; data-start=&quot;1560&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1583&quot; data-start=&quot;1560&quot;&gt;UNavArea_LowCost&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1591&quot; data-start=&quot;1583&quot;&gt;0.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1623&quot; data-start=&quot;1592&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1615&quot; data-start=&quot;1592&quot;&gt;UNavArea_HighCost&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1623&quot; data-start=&quot;1615&quot;&gt;2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1655&quot; data-start=&quot;1624&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1647&quot; data-start=&quot;1624&quot;&gt;UNavArea_Null/Block&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1655&quot; data-start=&quot;1647&quot;&gt;&amp;infin;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1674&quot; data-start=&quot;1662&quot; data-ke-size=&quot;size23&quot;&gt;  최종 요약&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1834&quot; data-start=&quot;1675&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1714&quot; data-start=&quot;1675&quot;&gt;&lt;b&gt;NavMesh&lt;/b&gt; = 캐릭터 이동 가능 영역의 폴리곤 데이터&lt;/li&gt;
&lt;li data-end=&quot;1756&quot; data-start=&quot;1715&quot;&gt;&lt;b&gt;Cost&lt;/b&gt; = AI가 경로를 선택할 때 참고하는 &lt;b&gt;가중치&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1791&quot; data-start=&quot;1757&quot;&gt;&lt;b&gt;값이 클수록 &amp;rarr; 회피 / 값이 작을수록 &amp;rarr; 선호&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1834&quot; data-start=&quot;1792&quot;&gt;단순 거리뿐 아니라 &lt;b&gt;위험도, 속도, 전략적 선택&lt;/b&gt;까지 반영 가능&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Unity/RTS</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/183</guid>
      <comments>https://sehuncodingjournal.tistory.com/183#entry183comment</comments>
      <pubDate>Sat, 4 Oct 2025 19:15:12 +0900</pubDate>
    </item>
    <item>
      <title>Physical Material, Layer 설정, Update vs Fixed update</title>
      <link>https://sehuncodingjournal.tistory.com/182</link>
      <description>&lt;h3 data-end=&quot;106&quot; data-start=&quot;58&quot; data-ke-size=&quot;size23&quot;&gt;⚙️ 1. &lt;b&gt;Collider 물리 속성 (Physical Material)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;117&quot; data-start=&quot;108&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unity&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;288&quot; data-start=&quot;118&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;229&quot; data-start=&quot;118&quot;&gt;&lt;b&gt;Physic Material&lt;/b&gt; 로 설정
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;229&quot; data-start=&quot;149&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;188&quot; data-start=&quot;149&quot;&gt;Friction (마찰력) : 0 &amp;rarr; 미끄럽게 (예: 얼음)&lt;/li&gt;
&lt;li data-end=&quot;229&quot; data-start=&quot;191&quot;&gt;Bounciness (반발력) : &amp;uarr; 튀게 (예: 고무공)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;288&quot; data-start=&quot;230&quot;&gt;Rigidbody 와의 충돌 시 이 값들이 물리 계산에 반영되어&lt;br /&gt;&amp;rarr; 움직임, 반응이 달라짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;300&quot; data-start=&quot;290&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unreal&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;434&quot; data-start=&quot;301&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;434&quot; data-start=&quot;301&quot;&gt;&lt;b&gt;Physical Material&lt;/b&gt; 로 동일한 역할
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;434&quot; data-start=&quot;338&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;373&quot; data-start=&quot;338&quot;&gt;표면의 물리 속성(마찰, 밀도, 반발, 소리 등)을 정의&lt;/li&gt;
&lt;li data-end=&quot;434&quot; data-start=&quot;376&quot;&gt;예: 총알이
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;434&quot; data-start=&quot;391&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;410&quot; data-start=&quot;391&quot;&gt;철판에 맞으면 &amp;rarr; 금속 소리&lt;/li&gt;
&lt;li data-end=&quot;434&quot; data-start=&quot;415&quot;&gt;나무에 맞으면 &amp;rarr; 나무 소리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;439&quot; data-start=&quot;436&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;484&quot; data-start=&quot;441&quot; data-ke-size=&quot;size23&quot;&gt;  2. &lt;b&gt;Layer / Collision 설정 (충돌 필터링)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;495&quot; data-start=&quot;486&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unity&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;758&quot; data-start=&quot;496&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;496&quot;&gt;&lt;b&gt;Layer + Physics Matrix&lt;/b&gt; 로 충돌 여부 제어
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;679&quot; data-start=&quot;540&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;608&quot; data-start=&quot;540&quot;&gt;메뉴: Edit &amp;gt; Project Settings &amp;gt; Physics &amp;gt; Layer Collision Matrix&lt;/li&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;611&quot;&gt;예시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;679&quot; data-start=&quot;623&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;646&quot; data-start=&quot;623&quot;&gt;Player &amp;harr; Enemy ✅ 충돌&lt;/li&gt;
&lt;li data-end=&quot;679&quot; data-start=&quot;651&quot;&gt;Player &amp;harr; Ignore ❌ 충돌 안 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;758&quot; data-start=&quot;680&quot;&gt;코드로도 가능&lt;/li&gt;
&lt;li data-end=&quot;758&quot; data-start=&quot;694&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;Physics.IgnoreCollision(collider1, collider2); &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;770&quot; data-start=&quot;760&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Unreal&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;914&quot; data-start=&quot;771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;914&quot; data-start=&quot;771&quot;&gt;&lt;b&gt;Object Channel + Collision Presets&lt;/b&gt; 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;914&quot; data-start=&quot;819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;867&quot; data-start=&quot;819&quot;&gt;대표 채널: Pawn, WorldStatic, Projectile 등&lt;/li&gt;
&lt;li data-end=&quot;914&quot; data-start=&quot;870&quot;&gt;각 관계를 Block / Overlap / Ignore 로 지정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;919&quot; data-start=&quot;916&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;973&quot; data-start=&quot;921&quot; data-ke-size=&quot;size23&quot;&gt;  3. &lt;b&gt;Transform.position 으로 이동 시 Collider 무시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;984&quot; data-start=&quot;975&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 원인&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1069&quot; data-start=&quot;985&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;985&quot;&gt;transform.position = ... 은 &lt;b&gt;Physics Engine을 거치지 않음&lt;/b&gt;&lt;br /&gt;&amp;rarr; 충돌, 반발, 중력 계산이 무시됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1080&quot; data-start=&quot;1071&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1325&quot; data-start=&quot;1081&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1325&quot; data-start=&quot;1081&quot;&gt;Rigidbody 가 있는 오브젝트는 &lt;b&gt;Transform 직접 이동 금지&lt;/b&gt;&lt;br /&gt;✅ 대신 사용:&amp;rarr; 이렇게 해야 물리 충돌이 정상 작동&lt;/li&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1142&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;// FixedUpdate 내에서&lt;/span&gt;&lt;/span&gt;&lt;span&gt; rigidbody.MovePosition(targetPosition); &lt;/span&gt;&lt;span&gt;&lt;span&gt;// 또는&lt;/span&gt;&lt;/span&gt;&lt;span&gt; rigidbody.AddForce(force); rigidbody.velocity = direction * speed; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1330&quot; data-start=&quot;1327&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1366&quot; data-start=&quot;1332&quot; data-ke-size=&quot;size23&quot;&gt;⏱ 4. &lt;b&gt;Update vs FixedUpdate&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;구분실행 주기주요 용도비고
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1581&quot; data-start=&quot;1368&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1581&quot; data-start=&quot;1438&quot;&gt;
&lt;tr data-end=&quot;1495&quot; data-start=&quot;1438&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1453&quot; data-start=&quot;1438&quot;&gt;&lt;b&gt;Update()&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1472&quot; data-start=&quot;1453&quot;&gt;매 프레임마다 (FPS 의존)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1484&quot; data-start=&quot;1472&quot;&gt;입력, 애니메이션&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1495&quot; data-start=&quot;1484&quot;&gt;물리 계산 X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1581&quot; data-start=&quot;1496&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1516&quot; data-start=&quot;1496&quot;&gt;&lt;b&gt;FixedUpdate()&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1538&quot; data-start=&quot;1516&quot;&gt;고정 시간 간격 (보통 0.02초)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1565&quot; data-start=&quot;1538&quot;&gt;물리 연산 (Rigidbody, Force)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1581&quot; data-start=&quot;1565&quot;&gt;Physics 연동 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1592&quot; data-start=&quot;1583&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;정리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1701&quot; data-start=&quot;1593&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1619&quot; data-start=&quot;1593&quot;&gt;입력(Input) &amp;rarr; Update()&lt;/li&gt;
&lt;li data-end=&quot;1653&quot; data-start=&quot;1620&quot;&gt;물리(Physics) &amp;rarr; FixedUpdate()&lt;/li&gt;
&lt;li data-end=&quot;1701&quot; data-start=&quot;1654&quot;&gt;transform.position 직접 이동 ❌ (Collider 무시됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1706&quot; data-start=&quot;1703&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1720&quot; data-start=&quot;1708&quot; data-ke-size=&quot;size23&quot;&gt;  최종 요약&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;항목역할 / 주의점
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1972&quot; data-start=&quot;1722&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1972&quot; data-start=&quot;1766&quot;&gt;
&lt;tr data-end=&quot;1819&quot; data-start=&quot;1766&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1799&quot; data-start=&quot;1766&quot;&gt;&lt;b&gt;Physic / Physical Material&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1819&quot; data-start=&quot;1799&quot;&gt;표면 성질 (마찰, 반발 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1861&quot; data-start=&quot;1820&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1842&quot; data-start=&quot;1820&quot;&gt;&lt;b&gt;Layer / Channel&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1861&quot; data-start=&quot;1842&quot;&gt;어떤 객체끼리 충돌할지 결정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1924&quot; data-start=&quot;1862&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1887&quot; data-start=&quot;1862&quot;&gt;&lt;b&gt;Transform.position&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1924&quot; data-start=&quot;1887&quot;&gt;물리 무시 (Rigidbody 사용 시 절대 직접 이동 ❌)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1972&quot; data-start=&quot;1925&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1953&quot; data-start=&quot;1925&quot;&gt;&lt;b&gt;Update vs FixedUpdate&lt;/b&gt;&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1972&quot; data-start=&quot;1953&quot;&gt;입력 vs 물리 프레임 구분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>Unity/RTS</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/182</guid>
      <comments>https://sehuncodingjournal.tistory.com/182#entry182comment</comments>
      <pubDate>Sat, 4 Oct 2025 19:13:48 +0900</pubDate>
    </item>
    <item>
      <title>필수 패키지</title>
      <link>https://sehuncodingjournal.tistory.com/181</link>
      <description>&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 입문 하면서 이것젓 하면서 느끼는데.&lt;br /&gt;도움이 많이 되는 패키지들이 많은거 같다.&lt;/p&gt;
&lt;h4 id=&quot;ai-navigation-208&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Ai Navigation. 2.0.8&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #12b886;&quot; href=&quot;https://www.youtube.com/watch?v=UGh4VSeKPNA&amp;amp;embeds_referring_euri=https%3A%2F%2Fchatgpt.com%2F&amp;amp;source_ve_path=MjM4NTE&quot;&gt;유튭 설명&lt;/a&gt;&lt;br /&gt;✅ 주요 추가 기능&lt;br /&gt;1. NavMesh 링크 생성 지원: 서로 떨어진 NavMesh 간 자동 연결 가능 (예: 점프, 문 등).&lt;br /&gt;2. 높이 메쉬(HeightMesh) 베이킹: 경사진 지형에서도 정확한 길찾기.&lt;br /&gt;3. 새로운 Navigation 창 UI: 기존 Unity Navigation 창과 유사한 인터페이스.&lt;/p&gt;
&lt;h4 id=&quot;behavior-1011&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Behavior 1.0.11&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;AI 행동 로직 시각화&lt;br /&gt;복잡한 AI 행동 흐름(예: 순찰, 공격, 대기) 을 노드 기반 그래프로 설계&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디자이너와 개발자가 협업 가능 (코드 없이도 설계 가능)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Behavior Tree(행동 트리) 기반 구조&lt;br /&gt;Sequence, Selector, Parallel 등 트리 구조의 논리 흐름 제공&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 행동 노드들은 조건, 이벤트, 작업(Task) 단위로 실행됨&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Runtime 제어 및 디버깅&lt;br /&gt;실행 중 노드의 동작 상태(성공/실패/진행 중)를 시각적으로 표시&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;디버깅 기능으로 AI 행동 문제를 쉽게 추적 가능&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Blackboard 시스템&lt;br /&gt;AI 에이전트 간의 데이터 공유 및 변수 저장소 역할&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;상태, 타겟 위치, 경로 등 정보를 노드 간 공유 가능&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;확장성&lt;br /&gt;C#으로 사용자 정의 노드(Custom Node) 제작 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 특성에 맞는 AI 로직을 자유롭게 구성 가능&lt;/p&gt;
&lt;h4 id=&quot;cinemachine-카메라-314&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Cinemachine (카메라) 3.1.4&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Unity의 모듈식 카메라 시스템으로, 코드 없이도 카메라 동작을 설계할 수 있습니다.&lt;br /&gt;포커스 타겟, 따라가기, 충돌 회피, 줌, 노이즈 등 다양한 카메라 기능을 제공합니다.&lt;/p&gt;
&lt;h4 id=&quot;shader-graph-1703&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Shader Graph 17.0.3&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;노드 기반 셰이더 제작&lt;br /&gt;시각적 노드 연결으로 셰이더(표면의 색, 반사, 굴절 등)를 만듭니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;UV, 색상, 텍스처 샘플링, 수학 함수 등의 노드를 활용해 복합적인 효과를 구현 가능&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실시간 프리뷰와 조정&lt;br /&gt;변경 사항 바로 확인 가능: 노드를 조정하면 미리보기 창에 실시간 업데이트가 반영됩니다.&lt;br /&gt;Blackboard를 통한 property 노드 노출이 가능해, 머티리얼 인스펙터에서 값 조정이 간편합니다&lt;/li&gt;
&lt;li&gt;프로퍼티 노출 및 재사용&lt;br /&gt;블랙보드를 이용해 변수(Property)를 노드로 설정하고, 여러 그래프 간 Subgraph 공유 및 재사용 가능&lt;/li&gt;
&lt;li&gt;코드 없는 셰이더 워크플로우&lt;br /&gt;HLSL 코드 없이도 셰이더 제작 가능하며, 나중에 C#과 HLSL을 이용한 커스텀 노드 제작도 지원됩니다&lt;/li&gt;
&lt;li&gt;SRP(Unity의 Scriptable Render Pipeline) 통합&lt;br /&gt;URP (Universal Render Pipeline) 또는 HDRP (High Definition Render Pipeline) 기반에서만 사용 가능하며, 레거시 렌더러는 지원되지 않습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;input-system-1112&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Input System 1.11.2&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다양한 입력 장치 지원&lt;br /&gt;키보드, 마우스, 터치, 게임패드, 조이스틱, VR 컨트롤러 등 자동 인식&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;플랫폼에 맞게 입력 방식 자동 전환 가능 (모바일, 콘솔, PC)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;액션 기반 입력 처리&lt;br /&gt;Input Actions를 사용하여 &quot;점프&quot;, &quot;이동&quot;, &quot;공격&quot; 같은 행동 중심으로 설계&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;입력 장치에 관계없이 같은 액션을 트리거할 수 있음&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시각적 입력 설정 도구&lt;br /&gt;Input Actions 에셋을 만들어 Unity Editor에서 시각적으로 입력 매핑&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GUI에서 &amp;ldquo;어떤 버튼 &amp;rarr; 어떤 동작&amp;rdquo;을 쉽게 연결 가능&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;리바인딩 지원&lt;br /&gt;런타임에 키/버튼을 변경 가능 (사용자 지정 키 설정 UI 제작 가능)&lt;/li&gt;
&lt;li&gt;멀티플레이어 입력 관리&lt;br /&gt;여러 플레이어가 각자 다른 컨트롤러를 사용할 수 있게 처리&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>Unity/RTS</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/181</guid>
      <comments>https://sehuncodingjournal.tistory.com/181#entry181comment</comments>
      <pubDate>Sat, 4 Oct 2025 18:59:11 +0900</pubDate>
    </item>
    <item>
      <title>AWS RTMP 설치 방법 (EC2 or Light Sail) 우번투</title>
      <link>https://sehuncodingjournal.tistory.com/180</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;EC2 와 Light Sail 둘다 동일 하나.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Light sail 같은 경우 (3개월 무료) 인 대신에 EC2 보다 성능이 좋으니 단기간 포폴용으로 쓸거면 추천.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글이 많아 보일수 있지만 생각보다 쉽습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;필요 프로그램&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. OBS studio (인터넷 방송에 필요한 툴)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. VLC 플레이어, (서버 설치이후에 스트리밍 되는지 보기 위해서)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. AWS lightsail 이나 ec2 (그냥 AWS 웹에서 하면 됨).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;순서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 우번투 업뎃&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Nginx 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span&gt;&amp;nbsp;&lt;/span&gt;libnginx-mod-rtmp 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Ubuntu 방화벽 설정 &amp;amp; aws 보안구룹 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. nginx.conf 에 RTMP 설정 넣기 (중요 외부 ip 에서 허용 해줘야함) + 재시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 태스트 하기 (OBS 랑 VLC 로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 우번투 업뎃&lt;/h3&gt;
&lt;pre class=&quot;sas&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Nginx 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo apt install nginx -y&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;libnginx-mod-rtmp 설치&lt;/h3&gt;
&lt;pre class=&quot;gams&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo apt update
$ sudo apt install libnginx-mod-rtmp&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. Ubuntu 방화벽 설정 &amp;amp; aws 보안구룹 설정&lt;/h3&gt;
&lt;pre id=&quot;code_1741434632460&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo ufw enable&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo ufw allow 1935/tcp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo ufw allow 22/tcp&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;잘 돌아가는지 확인 하는법:&lt;/p&gt;
&lt;pre id=&quot;code_1741434737779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo ufw status&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;AWS 보안그룹에도 열어줘야 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lightsail 같은 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLXqTu/btsMFkcHULC/JLwiKz4C0d41fUk85cuC4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLXqTu/btsMFkcHULC/JLwiKz4C0d41fUk85cuC4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLXqTu/btsMFkcHULC/JLwiKz4C0d41fUk85cuC4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLXqTu%2FbtsMFkcHULC%2FJLwiKz4C0d41fUk85cuC4K%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;591&quot; height=&quot;425&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ec2 같은 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnQDK/btsMEYHUsfo/Af56emEO1T7zkX8aQywfB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnQDK/btsMEYHUsfo/Af56emEO1T7zkX8aQywfB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnQDK/btsMEYHUsfo/Af56emEO1T7zkX8aQywfB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrnQDK%2FbtsMEYHUsfo%2FAf56emEO1T7zkX8aQywfB1%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;291&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;5. nginx.conf 에 RTMP 설정 넣기 (중요 외부 ip 에서 허용 설정)&lt;/h2&gt;
&lt;pre class=&quot;awk&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo nano /etc/nginx/nginx.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 파일 들어가서 맨 밑에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;* 주석을 잘 읽어 주세요 !!!!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #000000; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                application live {
                        live on;
                        record off;
                        
                        allow publish 127.0.0.1; # 허용 하는 ip 목록, 만약에 외부 전부 허용이면 all 로 
                        deny publish all; # 막는 ip 만약에 외부 허용이면 지워주세요
                        allow play all; # all ip 에서 play 허용한다는 뜻, 제한 하고 싶으면 all 를 허용하고 싶은 ip 로

                }
        }
}&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;그리고 nginx 를 가동 재가동 하는법&lt;/p&gt;
&lt;pre class=&quot;gams&quot; style=&quot;color: #000000; text-align: left;&quot;&gt;&lt;code&gt;$ sudo systemctl start nginx.service	// 시작
$ sudo systemctl reload nginx.service	// 리로드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;자 그럼 잘되는지 테스트 하는법!!!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. OBS 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6zX8C/btsMD01c89M/LYaaKStSLbbqZ2TOp51br1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6zX8C/btsMD01c89M/LYaaKStSLbbqZ2TOp51br1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6zX8C/btsMD01c89M/LYaaKStSLbbqZ2TOp51br1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6zX8C%2FbtsMD01c89M%2FLYaaKStSLbbqZ2TOp51br1%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;542&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;997&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzJ1ud/btsMExRuXTm/nwZHIuEIBNQquJhReLXF91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzJ1ud/btsMExRuXTm/nwZHIuEIBNQquJhReLXF91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzJ1ud/btsMExRuXTm/nwZHIuEIBNQquJhReLXF91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzJ1ud%2FbtsMExRuXTm%2FnwZHIuEIBNQquJhReLXF91%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;688&quot; height=&quot;727&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;997&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;2. vlc&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Control + N 누르면 (네스워크 스트리밍 열기 )&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYZ8xa/btsMEkY2Jcc/lDXVRLwkGqhcLui66hBwjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYZ8xa/btsMEkY2Jcc/lDXVRLwkGqhcLui66hBwjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYZ8xa/btsMEkY2Jcc/lDXVRLwkGqhcLui66hBwjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYZ8xa%2FbtsMEkY2Jcc%2FlDXVRLwkGqhcLui66hBwjK%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;521&quot; height=&quot;423&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;423&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;결과 :&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1954&quot; data-origin-height=&quot;1045&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckLpLu/btsMElcCWuy/YVBD4hcag53steZNZkuImk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckLpLu/btsMElcCWuy/YVBD4hcag53steZNZkuImk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckLpLu/btsMElcCWuy/YVBD4hcag53steZNZkuImk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckLpLu%2FbtsMElcCWuy%2FYVBD4hcag53steZNZkuImk%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;1954&quot; height=&quot;1045&quot; data-origin-width=&quot;1954&quot; data-origin-height=&quot;1045&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;같은 화면을 스트리미 하니깐 어질럽긴한데 이렇게 작동 되는것을 볼수 있습니다.&lt;br /&gt;화팅 하십쇼 다들!&lt;/p&gt;</description>
      <category>회고록</category>
      <category>AWS</category>
      <category>RTMP</category>
      <category>실시간 방송</category>
      <category>웹개발</category>
      <category>인터넷방송 웹사이트 제작</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/180</guid>
      <comments>https://sehuncodingjournal.tistory.com/180#entry180comment</comments>
      <pubDate>Sat, 8 Mar 2025 21:14:59 +0900</pubDate>
    </item>
    <item>
      <title>웹개발 실시간 방송. (Websocket,WEBRTC, RTMP, SRT)</title>
      <link>https://sehuncodingjournal.tistory.com/179</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;실시간 방송을 구현 하면서 배우게 된것들 과 시행 착오들&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oXzmZ/btsMDAHZ9UV/rXOEc86ao4FSWoKsl8RjTK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oXzmZ/btsMDAHZ9UV/rXOEc86ao4FSWoKsl8RjTK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oXzmZ/btsMDAHZ9UV/rXOEc86ao4FSWoKsl8RjTK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoXzmZ%2FbtsMDAHZ9UV%2FrXOEc86ao4FSWoKsl8RjTK%2Fimg.webp&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;439&quot; height=&quot;439&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;WebSocket&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  개념&lt;/b&gt;&lt;br /&gt;WebSocket은 클라이언트와 서버 간의 &lt;b&gt;양방향 통신&lt;/b&gt;을 가능하게 하는 프로토콜. HTTP 요청처럼 요청-응답 방식이 아니라, &lt;b&gt;한 번 연결되면 계속 유지&lt;/b&gt;되며 실시간 데이터 전송이 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; TCP 기반으로 동작 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://happyzodiac.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://happyzodiac.tistory.com/73&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741341097649&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;[Spring Boot] WebSocket 실시간 채팅 간단하게 구현하기!&quot; data-og-description=&quot;1. 개요 채팅 기능을 구현하기 위해 WebSocket 에 대한 공부를 시작했다. 웹소켓을 왜 사용하는 지, 동작부터 구현까지 정리해보도록 하겠다.(1) HTTP vs WebSocket가장 일반적으로 서버와의 통신은 HTTP &quot; data-og-host=&quot;happyzodiac.tistory.com&quot; data-og-source-url=&quot;https://happyzodiac.tistory.com/73&quot; data-og-url=&quot;https://happyzodiac.tistory.com/73&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nu8Xg/hyYm0gx20V/U4QxZJpVPtboMybktMQQW0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cjMlt9/hyYqcNmgFv/Av2HuiZV3lTzQ2GYZAapj1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://happyzodiac.tistory.com/73&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://happyzodiac.tistory.com/73&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nu8Xg/hyYm0gx20V/U4QxZJpVPtboMybktMQQW0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cjMlt9/hyYqcNmgFv/Av2HuiZV3lTzQ2GYZAapj1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;[Spring Boot] WebSocket 실시간 채팅 간단하게 구현하기!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. 개요 채팅 기능을 구현하기 위해 WebSocket 에 대한 공부를 시작했다. 웹소켓을 왜 사용하는 지, 동작부터 구현까지 정리해보도록 하겠다.(1) HTTP vs WebSocket가장 일반적으로 서버와의 통신은 HTTP&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;happyzodiac.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;Spring boot 관련 블로그 로는 실시간 채팅만 있고,&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;WEBRTC&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  개념&lt;/b&gt;&lt;br /&gt;WebRTC는 &lt;b&gt;브라우저 간(Peer-to-Peer, P2P) 직접 미디어 및 데이터 스트리밍&lt;/b&gt;을 지원하는 기술.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영상 및 음성 데이터를 실시간으로 주고받을 수 있도록 설계.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UDP 기반으로 동작 (팩킷 손실 보다 속도를 우선시)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;서버를 거치지 않고 클라이언트 끼리 실시간 정보를 주고 받는다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stun 과 Turn 서버를 사용하여 &lt;b&gt;네트워크 방화벽을&lt;/b&gt; 우회하여 ip 를 주고 받고 &lt;b&gt;handshake&lt;/b&gt; 한다음 통신이 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gh402.tistory.com/45&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gh402.tistory.com/45&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741340643265&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;[WebRTC] NAT, ICE, STUN, TURN 이란? ( WebRTC를 이해하기 위해 필요한 지식들)&quot; data-og-description=&quot;WebRTC를 사용하기 전, 기본적으로 익혀야 할 지식들!!   NAT(Network Address Translation) '나'는 누구인지 '이름'으로 구별할 수 있듯, 각 기기에도 자신만의 이름이 있다. 그것이 바로 IP이고 이 IP는 고&quot; data-og-host=&quot;gh402.tistory.com&quot; data-og-source-url=&quot;https://gh402.tistory.com/45&quot; data-og-url=&quot;https://gh402.tistory.com/45&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3CM03/hyYmI1nNCo/K9D7ktjIRTqkwX1u8swKHK/img.png?width=797&amp;amp;height=354&amp;amp;face=0_0_797_354,https://scrap.kakaocdn.net/dn/iRWYQ/hyYmNuMFJW/4x4V54AQRfvu4VagvhG6tk/img.png?width=797&amp;amp;height=354&amp;amp;face=0_0_797_354,https://scrap.kakaocdn.net/dn/biQwjP/hyYqZG6pAb/QjupzzN0M9q8KwEQTeqGeK/img.jpg?width=960&amp;amp;height=1280&amp;amp;face=0_0_960_1280&quot;&gt;&lt;a href=&quot;https://gh402.tistory.com/45&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gh402.tistory.com/45&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3CM03/hyYmI1nNCo/K9D7ktjIRTqkwX1u8swKHK/img.png?width=797&amp;amp;height=354&amp;amp;face=0_0_797_354,https://scrap.kakaocdn.net/dn/iRWYQ/hyYmNuMFJW/4x4V54AQRfvu4VagvhG6tk/img.png?width=797&amp;amp;height=354&amp;amp;face=0_0_797_354,https://scrap.kakaocdn.net/dn/biQwjP/hyYqZG6pAb/QjupzzN0M9q8KwEQTeqGeK/img.jpg?width=960&amp;amp;height=1280&amp;amp;face=0_0_960_1280');&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;[WebRTC] NAT, ICE, STUN, TURN 이란? ( WebRTC를 이해하기 위해 필요한 지식들)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;WebRTC를 사용하기 전, 기본적으로 익혀야 할 지식들!!   NAT(Network Address Translation) '나'는 누구인지 '이름'으로 구별할 수 있듯, 각 기기에도 자신만의 이름이 있다. 그것이 바로 IP이고 이 IP는 고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gh402.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;Stun 은 구글에서 지원 해주는 무료가 있고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Turn 은 직접 만들던가 (무료 AWS EC2 나 lightsail), 다른 클라우드 결제를 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;처음에는 이 기술을 채택 하였으나, 게임 스트리밍 에 적합하지 않다고 판단.&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;1. 많은 유저가 유입되면 지연이 급격하게 늘어난다는 단점.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;2. 특정 게임은 전체 화면 공유를 하면 화면이 검정색으로 나온다는 단점.&lt;/u&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;RTMP&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 방송 웹에서 가장 많이 쓰는 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;저지연(낮은 딜레이) 라이브 스트리밍&lt;/b&gt;을 위해 Adobe에서 개발한 프로토콜로, 주로 &lt;b&gt;비디오 스트리밍 전송&lt;/b&gt;에 사용.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트리머는 OBS 같은 툴을 사용.&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;TCP 기반으로 동작&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;span style=&quot;color: #ee2323;&quot;&gt;현제 아도비 플레시 지원 중단 문제로 보안 문제가 있지만 이미 많은 사이트에서 사용되고 있었기 때문에 커뮤니티가 활발한.....&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( YouTube, Facebook, Twitch 등의 라이브 스트리밍 에서 이미 사용중)&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;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 직접 구현 (AWS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=8mEMS4JIhW0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=8mEMS4JIhW0&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=8mEMS4JIhW0&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/eSYL1/hyYmLRilyj/QaHxHvqNNhh2RIcAdbqg30/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bL2oWA/hyYqLWoMSA/khOEY8mfvg1J8CiuvrGyg1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;Deploy Owncast RTMP Streaming Server on Amazon EC2 Ubuntu Linux Instance&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/8mEMS4JIhW0&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. AWS MediaLive 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741341174370&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;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&quot; data-og-description=&quot;&quot; data-og-host=&quot;ap-northeast-2.console.aws.amazon.com&quot; data-og-source-url=&quot;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&quot; data-og-url=&quot;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&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;https://ap-northeast-2.console.aws.amazon.com/medialive/home?region=ap-northeast-2#/&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;ap-northeast-2.console.aws.amazon.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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SRT&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RTMP 의 상위호환?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SRT는 &lt;b&gt;인터넷을 통한 저지연(Low Latency) 비디오 전송&lt;/b&gt;을 위한 프로토콜. 기존 RTMP보다 보안성과 신뢰성을 강화한 대안으로 주목받고 있다.&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;UDP 기반 (낮은 지연 시간, 빠른 속도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적이고 고품질 저지연 방송 을 원한다면 채택 할만하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 자료가 너무 적다는 것이 문제.&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;</description>
      <category>회고록</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/179</guid>
      <comments>https://sehuncodingjournal.tistory.com/179#entry179comment</comments>
      <pubDate>Fri, 7 Mar 2025 18:58:38 +0900</pubDate>
    </item>
    <item>
      <title>WebSocket 라이브러리 (dependenc)</title>
      <link>https://sehuncodingjournal.tistory.com/178</link>
      <description>&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;WebSocket을 활용한 실시간 화면 공유 프로그램 구현 시 사용하는 라이브러리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹소켓을 활용한 실시간 화면 공유 프로그램을 작성하면서 WebRTC를 알게 되었고, 관련하여 자주 사용되는 라이브러리 두 가지 였습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;spring-boot-starter-websocket&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;implementation 'org.springframework.boot:spring-boot-starter-websocket'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;spring-websocket&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div style=&quot;background-color: #1e1f22; color: #bcbec4;&quot;&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;implementation 'org.springframework:spring-websocket:6.1.13'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;spring-boot-starter-websocket&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring-boot-starter-websocket은 Spring Boot 프로젝트에서 WebSocket을 쉽게 사용할 수 있도록 도와주는 스타터 패키지입니다. 이 라이브러리를 사용하면 WebSocket 서버를 설정하고, 클라이언트와 실시간 양방향 통신을 간편하게 구현할 수 있습니다.&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;WebSocket 서버 구축&lt;/b&gt;: WebSocket 엔드포인트를 만들어 클라이언트와 실시간 양방향 통신을 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;STOMP 프로토콜 지원&lt;/b&gt;: spring-messaging을 통해 WebSocket을 메시징 시스템처럼 활용할 수 있습니다. STOMP(Simple Text Oriented Messaging Protocol)를 사용하면 WebSocket을 메시지 브로커와 연동하여 확장성 있는 시스템을 만들 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebSocket 핸들러 제공&lt;/b&gt;: TextWebSocketHandler 또는 BinaryWebSocketHandler를 사용하여 메시지를 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SockJS 지원&lt;/b&gt;: WebSocket을 지원하지 않는 브라우저에서도 사용할 수 있도록 SockJS를 지원합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spring Security와 통합&lt;/b&gt;: WebSocket 연결 시, Spring Security와 통합하여 보안 설정을 함께 사용할 수 있습니다.&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-ke-size=&quot;size23&quot;&gt;&lt;b&gt;spring-websocket&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;spring-websocket은 Spring Framework의 WebSocket 기능을 제공하는 기본 모듈입니다. 이 모듈은 Spring Boot 프로젝트가 아닌 일반 Spring Framework 기반의 프로젝트에서 WebSocket을 사용할 때 필요합니다.&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;WebSocket 서버 및 클라이언트 기능&lt;/b&gt;: WebSocket 서버 및 클라이언트 기능을 제공하여, 실시간 양방향 통신을 가능하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spring Boot 통합 지원 없음&lt;/b&gt;: spring-boot-starter-websocket과는 달리, spring-websocket은 Spring Boot에 최적화된 설정을 제공하지 않으므로, 별도로 Spring Boot 환경에서 사용하려면 수동으로 설정해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추가 의존성 필요&lt;/b&gt;: spring-messaging 등과 같은 추가 라이브러리를 수동으로 추가해야 할 수 있습니다.&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-ke-size=&quot;size23&quot;&gt;&lt;b&gt;차이점 요약&lt;/b&gt;&lt;/h3&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&gt;&lt;b&gt;spring-boot-starter-websocket&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Spring Boot 프로젝트에서 WebSocket을 쉽게 사용할 수 있도록 해주는 스타터 패키지. spring-websocket을 포함하고 Spring Boot의 **자동 설정(Auto Configuration)**을 제공하여 설정이 간편함.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;spring-websocket&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;일반 Spring Framework 프로젝트에서 WebSocket을 사용할 때 필요한 기본 모듈. 추가로 spring-messaging과 같은 의존성을 수동으로 추가해야 할 수 있음.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;/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;Spring Boot 프로젝트&lt;/b&gt;에서는 **spring-boot-starter-websocket**을 사용하여 WebSocket을 쉽게 설정하고 확장할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일반 Spring Framework 프로젝트&lt;/b&gt;에서는 **spring-websocket**을 사용하여 WebSocket을 구현하며, 필요한 추가 라이브러리를 수동으로 관리해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;WebSocket만 필요하면&lt;/b&gt; TextWebSocketHandler 기반으로 개발하고, &lt;b&gt;STOMP 기반 메시징이 필요하면&lt;/b&gt; @EnableWebSocketMessageBroker와 STOMP를 활용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Spring</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/178</guid>
      <comments>https://sehuncodingjournal.tistory.com/178#entry178comment</comments>
      <pubDate>Thu, 27 Feb 2025 16:09:09 +0900</pubDate>
    </item>
    <item>
      <title>Mongo Atlas 연결 문제 (Could not connect to any servers in your MongoDB Atlas cluster)</title>
      <link>https://sehuncodingjournal.tistory.com/176</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 접속이 아예 안된다. (다른 프로그램도 VsCode Mongo &amp;amp; Mongo Compass)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NACL 에 막힌 경우.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에는 Mongo Atlas 에 접속해거 ip 주소를 추가해주면 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(0 .0. 0. 0/0 은 모든 ip 허용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNyQ7b/btsKIFc2LCK/DjPTkJ1FReY4CXzL44mkdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNyQ7b/btsKIFc2LCK/DjPTkJ1FReY4CXzL44mkdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNyQ7b/btsKIFc2LCK/DjPTkJ1FReY4CXzL44mkdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNyQ7b%2FbtsKIFc2LCK%2FDjPTkJ1FReY4CXzL44mkdK%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;594&quot; height=&quot;230&quot; data-origin-width=&quot;1892&quot; data-origin-height=&quot;732&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&lt;/span&gt; 다른 앱으론 접속이 되는데 npm 만 안된다!!!!!!!!&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 npm 파일이 없는경우 !!!!!!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;필요한 npm 파일!&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;1. cors (npm i cors)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;2. mongoose (npm i &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;mongoose&lt;/span&gt;) &lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;3. mongodb &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(npm i&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;mongodb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;u&gt;4, express (npm i express)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;npm list -g --depth=0&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;npm list --depth=0&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;으로 어떤 npm 파일들이 설치 되어있는지 확인.&lt;/p&gt;</description>
      <category>AWS</category>
      <category>db connection error: mongooseserverselectionerror: could not connect to any servers in your mongodb atlas cluster.</category>
      <category>make sure your current ip address is on your atlas cluster's ip whitelist:</category>
      <category>MongoDB</category>
      <category>trying to access the database from an ip that isn't whitelisted.</category>
      <category>몽고연결안됨</category>
      <author>sehunbang</author>
      <guid isPermaLink="true">https://sehuncodingjournal.tistory.com/176</guid>
      <comments>https://sehuncodingjournal.tistory.com/176#entry176comment</comments>
      <pubDate>Thu, 14 Nov 2024 18:44:43 +0900</pubDate>
    </item>
  </channel>
</rss>