<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>눈으로 개발하는 블로그</title>
    <link>https://carrotweb.tistory.com/</link>
    <description>Java를 기반으로 한 웹 개발에 필요한 환경과 기술들을 소개합니다.</description>
    <language>ko</language>
    <pubDate>Wed, 6 May 2026 12:27:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>carrotweb</managingEditor>
    <image>
      <title>눈으로 개발하는 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/2759149/attach/98ea264f0a594b4d99191374c2f73021</url>
      <link>https://carrotweb.tistory.com</link>
    </image>
    <item>
      <title>파이썬 장고 사이트 국제화, 시간 설정 - LANGUAGE_CODE, TIME_ZONE, USE_I18N, USE_TZ</title>
      <link>https://carrotweb.tistory.com/308</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;2604&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btajks/btsKujOx8B4/zcIxCndMVYGiYJ5zju5pXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btajks/btsKujOx8B4/zcIxCndMVYGiYJ5zju5pXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btajks/btsKujOx8B4/zcIxCndMVYGiYJ5zju5pXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtajks%2FbtsKujOx8B4%2FzcIxCndMVYGiYJ5zju5pXk%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;2604&quot; height=&quot;1518&quot; data-origin-width=&quot;2604&quot; data-origin-height=&quot;1518&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;사이트에 표시되는 언어를 영어에서 한국어로 변경하고 싶을 경우에는 LANGUAGE_CODE(언어 코드)를 변경하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Internationalization(국제화) 설정&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;config 폴더에 있는 settings.py 파일에서 internationalization(국제화) 영역에 있는 LANGUAGE_CODE를 'en-us'에서 'ko-kr'로 변경하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730642894527&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 언어 - 한국어
LANGUAGE_CODE = 'ko-kr'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diL9U7/btsKtNWaAP8/anT8Krun4A65UFCW305uv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diL9U7/btsKtNWaAP8/anT8Krun4A65UFCW305uv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diL9U7/btsKtNWaAP8/anT8Krun4A65UFCW305uv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiL9U7%2FbtsKtNWaAP8%2FanT8Krun4A65UFCW305uv0%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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;2604&quot; data-origin-height=&quot;1518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRdTy7/btsKvIsMt3Z/oiyMj5c28eEBYHSSwKoaIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRdTy7/btsKvIsMt3Z/oiyMj5c28eEBYHSSwKoaIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRdTy7/btsKvIsMt3Z/oiyMj5c28eEBYHSSwKoaIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRdTy7%2FbtsKvIsMt3Z%2FoiyMj5c28eEBYHSSwKoaIK%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;2604&quot; height=&quot;1518&quot; data-origin-width=&quot;2604&quot; data-origin-height=&quot;1518&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;장고가 제공하는 메인 페이지는 myenv(가상환경)&amp;nbsp;&amp;gt;&amp;nbsp;Lib&amp;nbsp;&amp;gt;&amp;nbsp;site-packages&amp;nbsp;&amp;gt;&amp;nbsp;django&amp;nbsp;&amp;gt; views &amp;gt; templates 폴더에 있는 default_urlconf.html 파일입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBg8A/btsKuxFPVhq/FFi5YcAgNIq1HUeMjHKObK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBg8A/btsKuxFPVhq/FFi5YcAgNIq1HUeMjHKObK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBg8A/btsKuxFPVhq/FFi5YcAgNIq1HUeMjHKObK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBg8A%2FbtsKuxFPVhq%2FFFi5YcAgNIq1HUeMjHKObK%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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;메인 페이지(default_urlconf.html)를 보면 상단에 load 템플릿 태그가 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730645282093&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% load i18n %}&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;이는 internationalization(국제화)를 로드하여 템플릿 페이지에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;번역된 문장열을 사용하겠다는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서, i18(또는 대문자로 I18N)이 무슨 단어이기에 국제화라는 걸까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i18n은 internationalization의 첫 번째 단어 i부터 끝단어 n사이에 18개의 문자가 있는 것을 합처서&amp;nbsp;i18n으로 약어를 만든 겁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730645808635&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;i nternationalizatio n
  ------------------
                  18

i18n&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;반대로 localization(지역화 또는 현지화)는 무슨 단어일까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네, 예상하신 대로 l10n(또는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;대문자로&lt;span&gt; L10N)입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730646066729&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;l ocalizatio n
  ----------
          10

l10n&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;템플릿 페이지에서 internationalization(국제화)로 번역된 문자열을 사용하고 싶을 때는 translate 템플릿 태그를 사용하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메인 페이지(default_urlconf.html)처럼 번역된 문자열을 사용하고 싶은 문자열마다 translate 템플릿 태그를 사용하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730646224816&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;title&amp;gt;{% translate &quot;The install worked successfully! Congratulations!&quot; %}&amp;lt;/title&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 번역된 문자열들은 어디에 있을까요?&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;번역된 문자열들은 myenv(가상환경) &amp;gt; Lib &amp;gt; site-packages &amp;gt; django &amp;gt; conf &amp;gt; locale 폴더에 언어 코드별로 있습니다.&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;한국어로 번역된 문자열들은 myenv(가상환경) &amp;gt; Lib &amp;gt; site-packages &amp;gt; django &amp;gt; conf &amp;gt; locale &amp;gt; ko &amp;gt; LC_MESSAGES 폴더에 있는 django.po&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqd2u/btsKvhh9Hmk/PNkO9i3vLxy2yU7lKay8Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqd2u/btsKvhh9Hmk/PNkO9i3vLxy2yU7lKay8Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqd2u/btsKvhh9Hmk/PNkO9i3vLxy2yU7lKay8Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foqd2u%2FbtsKvhh9Hmk%2FPNkO9i3vLxy2yU7lKay8Dk%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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;원문과 번역문은 msgid와 msgstr로 구성되어 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730647448467&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;msgid &quot;The install worked successfully! Congratulations!&quot;
msgstr &quot;성공적으로 설치되었습니다! 축하합니다!&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;msgid는 translate 템플릿 태그에 있는 문자열입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730647746052&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{% translate &quot;The install worked successfully! Congratulations!&quot; %}
              -------------------------------------------------
                                                          msgid&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;msgstr은 번역된 문자열입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 국제화를 사용하고 싶지 않을 경우에는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;config 폴더에 있는 settings.py 파일에서 internationalization(국제화) 영역에 있는&amp;nbsp;&lt;/span&gt;USE_I18N를 False로 하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730648528596&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 국제화를 사용하지 않음
USE_I18N = False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQGS8q/btsKuPTPhbe/GhWONWDKomPUEDQ0idAFwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQGS8q/btsKuPTPhbe/GhWONWDKomPUEDQ0idAFwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQGS8q/btsKuPTPhbe/GhWONWDKomPUEDQ0idAFwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQGS8q%2FbtsKuPTPhbe%2FGhWONWDKomPUEDQ0idAFwK%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;템플릿 페이지에 있는&lt;span&gt; 문장이 그대로 나옵니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;우리는 관리자 페이지를 한국어로 표시할 것이기 때문에 &lt;/span&gt;&lt;/span&gt;USE_I18N은 True로 변경하지 않을 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;국제화와 번역에 대한 더 자세한 내용 장고 문서 사이트를 참고하시기 바랍니다. (&lt;a href=&quot;https://docs.djangoproject.com/en/5.1/topics/i18n/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.djangoproject.com/en/5.1/topics/i18n/&lt;/a&gt;, &lt;a href=&quot;https://docs.djangoproject.com/en/5.1/topics/i18n/translation/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.djangoproject.com/en/5.1/topics/i18n/translation/&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;템플릿 페이지에서 사용할 국제화 생성에 대해서 다음에 앱을 만들고 템플릿 페이지를 만들 때 다시 설명하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;시간 설정&lt;/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;장고는 기본적으로 TIME_ZONE은 UTC(Universal Time Coordinated, &lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: start;&quot;&gt;협정 세계시&lt;/span&gt;)으로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;config 폴더에 있는 settings.py 파일에서 internationalization(국제화) 영역에 있는 TIME_ZONE이 UTC으로 설정되어 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730650129577&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TIME_ZONE = 'UTC'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCTdYc/btsKucoCdcs/lZhvloCbzpXlfcvMovZpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCTdYc/btsKucoCdcs/lZhvloCbzpXlfcvMovZpkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCTdYc/btsKucoCdcs/lZhvloCbzpXlfcvMovZpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCTdYc%2FbtsKucoCdcs%2FlZhvloCbzpXlfcvMovZpkk%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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 data-ke-size=&quot;size16&quot;&gt;TIME_ZONE를 Asia/Seoul로 변경하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730651228633&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 시간 - 한국
TIME_ZONE = 'Asia/Seoul'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m3FZ1/btsKtWM9cQp/fyZcYddMinmJvGdyQbRk9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m3FZ1/btsKtWM9cQp/fyZcYddMinmJvGdyQbRk9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m3FZ1/btsKtWM9cQp/fyZcYddMinmJvGdyQbRk9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm3FZ1%2FbtsKtWM9cQp%2FfyZcYddMinmJvGdyQbRk9k%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;여기서 주의할 점!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에 저장될 때는 UTC로 저장되는 겁니다.&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;다음처럼, 현재 한국 시간이 2024년 11월 3일 오후 7시 39분 34초라면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터베이스에 저장될 때는&lt;span&gt; UTC로 변형되어 저장됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730653060384&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UTC로 저장되는 시간
datetime.datetime(2024, 11, 3, 10, 39, 34, tzinfo=datetime.timezone.utc)

한국 시간으로 처리된 시간
datetime.datetime(2024, 11, 3, 19, 39, 34, tzinfo=&amp;lt;DstTzInfo 'Asia/Seoul' LMT+9:00:00 STD&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 데이터베이스에 저장된 시간은 한국 시간 기준보다 9시간이 느리게 저장이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730653741049&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;UTC
Asia/Seoul = UTC + 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 시스템(서버) 시간이 한국 시간 기준일 경우 데이터베이스에 저장된 시간과 맞지 않아서 서버 프로그램에 개발에 문제가 될 수 도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터베이스에&lt;span&gt; 저장되는 시간을 시스템 시간(한국 시간 기준)으로 하려면 어떻게 해야 할까요?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;TIME_ZONE를 사용하지 않으면 됩니다. 그래서 USE_TZ를&amp;nbsp;&lt;/span&gt;False로 변경하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730655184972&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# TIME_ZONE를 사용하지 않음
USE_TZ = False&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmV8em/btsKukmtHAb/LiFCILHw2hlkerGVs8veaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmV8em/btsKukmtHAb/LiFCILHw2hlkerGVs8veaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmV8em/btsKukmtHAb/LiFCILHw2hlkerGVs8veaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmV8em%2FbtsKukmtHAb%2FLiFCILHw2hlkerGVs8veaK%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; TIME_ZONE를 사용하지 않기 때문에 데이터베이스에 저장된 시간은 시스템 시간(한국 시간 기준)이 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730656114992&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;USE_TZ = True --&amp;gt; UTC 시간으로 저장됩니다.
USE_TZ = False --&amp;gt; 시스템 시간으로 저장됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;만약, 국제화를 사용하지 않고 시스템 시간(한국 시간 기준)을 기준으로 하고 싶을 경우에는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;USE_I18N과 USE_TZ를 False로 설정하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730655856734&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 국제화를 사용하지 않음
USE_I18N = False

# TIME_ZONE를 사용하지 않음
USE_TZ = False&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;우리는 시스템 시간(한국 시간 기준)으로 저장할 것이 때문에 USE_TZ를 False로 설정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>django</category>
      <category>default_urlconf.html</category>
      <category>django</category>
      <category>i18n</category>
      <category>internationalization</category>
      <category>LANGUAGE_CODE</category>
      <category>TIME_ZONE</category>
      <category>use_i18n</category>
      <category>USE_TZ</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/308</guid>
      <comments>https://carrotweb.tistory.com/308#entry308comment</comments>
      <pubDate>Mon, 4 Nov 2024 02:51:36 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 장고 마이그레이션 - makemigrations, migrate, reversing migrations</title>
      <link>https://carrotweb.tistory.com/307</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;장고 기반 프로젝트를 처음 실행하면 터미널(Terminal)에 다음과 같이 붉은색으로 마이그레이션(Migration)에 대한 경고를 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvvGZ/btsKdGhVp99/npE0vnTeiVRjpfPcjCl5Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvvGZ/btsKdGhVp99/npE0vnTeiVRjpfPcjCl5Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvvGZ/btsKdGhVp99/npE0vnTeiVRjpfPcjCl5Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvvGZ%2FbtsKdGhVp99%2FnpE0vnTeiVRjpfPcjCl5Z0%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;2632&quot; height=&quot;1716&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1716&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;You&amp;nbsp;have&amp;nbsp;18&amp;nbsp;unapplied&amp;nbsp;migration(s).&amp;nbsp;Your&amp;nbsp;project&amp;nbsp;may&amp;nbsp;not&amp;nbsp;work&amp;nbsp;properly&amp;nbsp;until&amp;nbsp;you&amp;nbsp;apply&amp;nbsp;the&amp;nbsp;migrations&amp;nbsp;for&amp;nbsp;app(s):&amp;nbsp;admin,&amp;nbsp;auth,&amp;nbsp;contenttypes,&amp;nbsp;sessions. &lt;br /&gt;Run&amp;nbsp;'python&amp;nbsp;manage.py&amp;nbsp;migrate'&amp;nbsp;to&amp;nbsp;apply&amp;nbsp;them.&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;번역하면 적용되지 않은 마이그레이션이 18개 있습니다. 당신의 프로젝트가 앱(admin, auth, contenttypes, sessions)에 대한 마이그레이션을 할 때까지 제대로 작동하지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적용하려면 'python manage.py migrate'을 실행하세요.&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;경고가 발생한 이유는 장고 기반 프로젝트는 기본적으로 관리자 기능이 함께 제공되기 때문입니다. 그래서 관리자 앱(App)에 있는 모델(Model)들과 연동되는 테이블(Table)이 데이터베이스(Database)에 있어야 합니다.&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;장고 관리자 앱(admin, auth, contenttypes, sessions)은 어디에 있나요?&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;config 폴더에 있는 settings.py 파일에서 INSTALLED_APPS에 설정되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KSmT3/btsKljHVJPR/gWoQmLnOmgWjPZkfbkA4sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KSmT3/btsKljHVJPR/gWoQmLnOmgWjPZkfbkA4sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KSmT3/btsKljHVJPR/gWoQmLnOmgWjPZkfbkA4sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKSmT3%2FbtsKljHVJPR%2FgWoQmLnOmgWjPZkfbkA4sk%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;관리자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 앱들은 myenv(가상환경) &amp;gt; Lib &amp;gt; site-packages &amp;gt; django &amp;gt; contrib 폴더에 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6sSMG/btsKvFJz5ey/OqwQYlIHZvVsY6j1WKfWB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6sSMG/btsKvFJz5ey/OqwQYlIHZvVsY6j1WKfWB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6sSMG/btsKvFJz5ey/OqwQYlIHZvVsY6j1WKfWB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6sSMG%2FbtsKvFJz5ey%2FOqwQYlIHZvVsY6j1WKfWB1%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;2652&quot; height=&quot;1728&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1728&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;그리고 모델(model)들은 앱(admin, auth, contenttypes, sessions) 폴더에 있는 models.py 파일에 있습니다. (messages, staticfiles 앱에는 모델이 없습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc0G1L/btsKucIOIZt/4KO5hEXzQfK0P08UArr1oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc0G1L/btsKucIOIZt/4KO5hEXzQfK0P08UArr1oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc0G1L/btsKucIOIZt/4KO5hEXzQfK0P08UArr1oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc0G1L%2FbtsKucIOIZt%2F4KO5hEXzQfK0P08UArr1oK%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;2650&quot; height=&quot;1728&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1728&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;4개의 앱에 있는 모델 클래스가 18개 있습니다. 그래서 마이그레이션 대상이 18개가 있다고 한 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션에 대한 내용 아래에서 자세히 다루겠습니다.&lt;/span&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;데이터베이스에 대한 설정은 config 폴더에 있는 settings.py 파일에서 DATABASES에 SQLite3로 설정되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4c1DG/btsKkJf3Vo5/9EnaHRsIH5Ig6DFmVhXpIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4c1DG/btsKkJf3Vo5/9EnaHRsIH5Ig6DFmVhXpIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4c1DG/btsKkJf3Vo5/9EnaHRsIH5Ig6DFmVhXpIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4c1DG%2FbtsKkJf3Vo5%2F9EnaHRsIH5Ig6DFmVhXpIk%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;왼쪽 EXPLORER를 보면 db.sqlite3 파일이 추가된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 추가된 db.sqlite3 파일이 데이터베이스로 사용될 파일입니다.&lt;/p&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;SQLite3는 Python에 포함되어 있어 별도로 설치할 필요가 없습니다. 그래서 개발할 때 편리하게 사용할 수 있습니다.&lt;/p&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 data-ke-size=&quot;size16&quot;&gt;만약, 데이터베이스를 MariaDB, MySQL, PostgreSQL로 변경하실 경우에는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;settings.py 파일에서 DATABASES를 변경하고 싶은 데이터베이스로 변경하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션을 통해 데이터베이스에 관리자 테이블들을 생성해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션을 하기 위해서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt; 파일(&lt;/span&gt;&lt;/span&gt;마이그레이션 클래스가 있는 파일)을 생성해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션 클래스는 앱(app)에 모델(model)이 추가되거나 변경되었을 때 데이터베이스에 테이블을 추가, 수정, 삭제하거나 테이블의 컬럼을 추가, 수정, 삭제할 수 있게 해 줍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모델이 추가되면 migrations.CreateModel&lt;/li&gt;
&lt;li&gt;모델이 수정되면 migrations.AlterModelTable&lt;/li&gt;
&lt;li&gt;모델이&amp;nbsp;삭제되면&amp;nbsp;migrations.DeleteModel&lt;/li&gt;
&lt;li&gt;모델에 필드가 추가되면 migrations.AddField&lt;/li&gt;
&lt;li&gt;모델에 필드가 수정되면 migrations.AlterField&lt;/li&gt;
&lt;li&gt;모델에 필드가 삭제되면 migrations.RemoveField&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이그레이션 클래스에 대한 더 자세한 내용 장고 문서 사이트를 참고하시기 바랍니다. (&lt;a href=&quot;https://docs.djangoproject.com/en/5.1/ref/migration-operations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.djangoproject.com/en/5.1/ref/migration-operations/&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 모델이 추가되면 마이그레이션 클래스의 오퍼레이션에 migrations.CreateModel 클래스로 테이블과 테이블의 필드를 추가할 수 있습니다. (admin의 LogEntry 모델에 대한 마이그레이션 파일입니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JkTxY/btsKlzp5qyi/vyXBK2ZZcH4wGOCv10KK00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JkTxY/btsKlzp5qyi/vyXBK2ZZcH4wGOCv10KK00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JkTxY/btsKlzp5qyi/vyXBK2ZZcH4wGOCv10KK00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJkTxY%2FbtsKlzp5qyi%2FvyXBK2ZZcH4wGOCv10KK00%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;예를 들어, 모델이 수정되면&lt;span&gt; 마이그레이션 클래스의 오퍼레이션에&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; migrations. AlterField 클래스로 테이블의 필드를 수정할 수 있습니다. (auth의&lt;span&gt; Permission&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;모델에 대한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;마이그레이션 파일입니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T8I8r/btsKkcpo0vX/lYr4yllEospjDe9AbD3Kzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T8I8r/btsKkcpo0vX/lYr4yllEospjDe9AbD3Kzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T8I8r/btsKkcpo0vX/lYr4yllEospjDe9AbD3Kzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT8I8r%2FbtsKkcpo0vX%2FlYr4yllEospjDe9AbD3Kzk%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;앱(App)에 모델(Model)이 있으면 반드시 모델에 대한 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;클래스가&lt;span&gt;&lt;span&gt; 있어야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하나의 마이그레이션 파일에는 앱에 있는 모델 수만큼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클래스가 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;그럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;클래스를 직접 만들어야 할까요?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아닙니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;직접 만들 수 있지만 장고에서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클래스를 자동으로 생성해 주는 makemigrations 명령어를 지원하고 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; makemigrations&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: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;클래스를&lt;span&gt; &lt;/span&gt;&lt;/span&gt;생성해&lt;span&gt; &lt;/span&gt;&lt;/span&gt;주는 명령어인 makemigrations를 터미널(Terminal)에서 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729926014861&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py makemigrations {앱 이름}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(앱 이름}은 모델이 변경된 앱의 이름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(앱 이름}이 있으면 해당 앱에서만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추가되거나&lt;span&gt; &lt;/span&gt;&lt;/span&gt;변경된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;모델이&lt;span&gt; &lt;/span&gt;&lt;/span&gt;있는지 확인해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션 클래스를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;생성해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(앱 이름}이 없으면 전체 앱을 대상으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추가되거나&lt;span&gt; &lt;/span&gt;&lt;/span&gt;변경된 모델이 있는지 확인해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션 클래스를 &lt;/span&gt;생성해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장고 관리자의 앱(admin, auth, contenttypes, sessions)에 대해 하나씩 실행할 수 있지만 전체 앱을 대상으로 실행하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729929747378&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py makemigrations&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFU4F/btsKlPFV4Gv/vAPPgm3j4Qr4kwaUxDUef1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFU4F/btsKlPFV4Gv/vAPPgm3j4Qr4kwaUxDUef1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFU4F/btsKlPFV4Gv/vAPPgm3j4Qr4kwaUxDUef1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFU4F%2FbtsKlPFV4Gv%2FvAPPgm3j4Qr4kwaUxDUef1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1720&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1720&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;span style=&quot;color: #333333; text-align: start;&quot;&gt; makemigrations를 실행하면 터미널(Terminal)에 No changes detected (감지된 변경이 없습니다.)라고 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;왜 장고 관리지 앱에 대해&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클래스가 있는 파일이 생성되지 않았을까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt; 파일을&lt;/span&gt;&lt;/span&gt;&amp;nbsp;생성한 적이 없는 왜 변경된 게 없다고 할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그 이유는 이미 장고 관리자 앱에는&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클래스가 있는 파일이 생성되어 있고 &lt;/span&gt;우리가 관리자 앱에 있는 모델을 수정한 적이 없기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위에서 마이그레이션 클래스를 설명할 때 예시로 보여드린 화면을 보시면 django의 auth &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;앱에&lt;span&gt; &lt;/span&gt;migrations 폴더에서 &lt;/span&gt;마이그레이션 파일들이 있는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다음은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;django의&amp;nbsp;&lt;/span&gt;contenttypes 앱에 migrations 폴더에 있는 &lt;/span&gt;마이그레이션 파일입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clIYpy/btsKl3qAOhi/jENS9J8gMXcaAmUKeJO3kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clIYpy/btsKl3qAOhi/jENS9J8gMXcaAmUKeJO3kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clIYpy/btsKl3qAOhi/jENS9J8gMXcaAmUKeJO3kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclIYpy%2FbtsKl3qAOhi%2FjENS9J8gMXcaAmUKeJO3kk%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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;위와 같이 앱에 모델이 있을 경우 makemigrations를 실행하면 앱에 있는 migrations 폴더에 마이그레이션 파일이 생성됩니다.&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;예를 들어, test라는 앱을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션 한다면 test 앱에 있는 migrations 폴더에 0001_initial.py 파일이 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1730015200262&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py makemigrations test&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1730015519505&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test/ --&amp;gt; 앱 폴더
    migrations/ --&amp;gt; 마이그레이션 폴더 (앱 생성시 자동으로 생성됩니다.)
        __init__.py --&amp;gt; 초기화 파일 (파일에 내용은 없습니다. 앱 생성시 자동으로 생성됩니다.)
        0001_initial.py --&amp;gt; 처음 생성된 마이그레이션 파일&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;__init__.py 파일은 마이그레이션을 초기화하기 위해서 생성되는 파일입니다.&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;생선 된 마이그레이션 파일 명을 보면 앞에 0001_처럼 번호가 있는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 번호는 makemigrations를 실행할 때 앱의 모델이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추가되거나&lt;span&gt; &lt;/span&gt;&lt;/span&gt;변경된 것이 있으면 자동으로 번호가 증가하여 마이그레이션 파일 명에 추가됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음처럼, auth 앱은 처음 마이그레이션(0001_initial.py) 한 후 11번을 수정(0012_alter_user_first_name_max_length.py) 한 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DVQDX/btsKk7VbSVn/FQyQZ6r6YF7RnNuJK7rRE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DVQDX/btsKk7VbSVn/FQyQZ6r6YF7RnNuJK7rRE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DVQDX/btsKk7VbSVn/FQyQZ6r6YF7RnNuJK7rRE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDVQDX%2FbtsKk7VbSVn%2FFQyQZ6r6YF7RnNuJK7rRE0%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 생성된&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션 파일을 통해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션을 실행해 보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Migrate&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: #333333; text-align: start;&quot;&gt;마이그레이션을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;실행&lt;/span&gt;&lt;/span&gt;해&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;주는 명령어인 migrate를 터미널(Terminal)에서 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730017128409&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate {앱 이름} {마이그레이션 번호}&lt;/code&gt;&lt;/pre&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;(앱 이름}은 마이그레이션을 할 앱의 이름입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(앱 이름}이 있으면 해당 앱에서만 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마이그레이션을 실행합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(앱 이름}이 없으면 전체 앱을 대상으로 마이그레이션을 실행합니다.&lt;/p&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(마이그레이션 번호}가 있으면 번호로 만들어진 마이그레이션 파일을 실행합니다. (Reversing Migrations - 이전 번호를 입력하면 이전 상태로 되돌아가게 됩니다.)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(마이그레이션 번호}가 없으면&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;전체&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;마이그레이션 파일을 실행합니다.&lt;/p&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Reversing Migrations는 아래에서 설명드리겠습니다.&lt;/span&gt;&lt;/p&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_1730017659246&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx4diH/btsKlZu5RKT/DRNSDNerawUn9k4Jt8KtdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx4diH/btsKlZu5RKT/DRNSDNerawUn9k4Jt8KtdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx4diH/btsKlZu5RKT/DRNSDNerawUn9k4Jt8KtdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx4diH%2FbtsKlZu5RKT%2FDRNSDNerawUn9k4Jt8KtdK%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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;실행 결과를 보면 장고 관리자의 앱(admin, auth, contenttypes, sessions)에 있는 마이그레이션 파일들이 실행된 것을 알 수 있습니다.&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;DBeaver로 db.sqlite3 파일을 오픈해 보면 장고 관리자 테이블들이 생성된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2702&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI3wbC/btsKmpmFY8A/GowkgSl55u9VuiGR48fze1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI3wbC/btsKmpmFY8A/GowkgSl55u9VuiGR48fze1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI3wbC/btsKmpmFY8A/GowkgSl55u9VuiGR48fze1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI3wbC%2FbtsKmpmFY8A%2FGowkgSl55u9VuiGR48fze1%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;2702&quot; height=&quot;1536&quot; data-origin-width=&quot;2702&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Reversing Migrations&lt;/b&gt;(리버싱 마이그레이션, 마이그레이션을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이전 상태로 되돌리기&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다음처럼, test앱에서 3번의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;마이그레이션을 실행했다고 가정하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730622111827&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test/
    migrations/
        __init__.py
        0001_initial.py
        0002_alter_user_name_max_length.py
        0003_alter_user_email_max_length.py&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 모델에 있는 메일의 길이가 수정할 필요가 없어졌다면 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델에 있는 메일의 길이를 다시 이전 길이로 수정하고 다시 makemigrations를 실행하고 migrate를 실행합니다. (그럼 0004 마이그레이션 파일이 생성되고 실행됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 이전 마이그레이션(0002)으로 되돌리고 0003 마이그레이션을 삭제합니다.&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;여기서는 이전 마이그레이션(0002)으로 되돌리고 0003 마이그레이션을 삭제해 보겠습니다.&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;마이그레이션을 0002번째로 되돌리기 위해서는 migrate를 실행할 때 test 앱과 0002 번호를 입력하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730622139561&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate test 0002&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;그럼 0002번째 마이그레이션으로 변경됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730622181075&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Operations to perform:
  Target specific migration: 0002_alter_user_name_max_length, from test
Running migrations:
  Rendering model states... DONE
  Unapplying test.0003_alter_user_email_max_length... OK&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;그러고 나서 0003_alter_user_email_max_length.py 파일을 삭제하면 됩니다.&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;마이그레이션 파일을 삭제할 때는 주의를 기울여야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면, 마이그레이션 파일은 이전 번호 마이그레이션에 의존하게 되어 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 중간에 있는 마이그레이션 파일은 임의로 삭제하면 안 됩니다.&lt;/p&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;다음처럼, auth 앱에 마지막 마이그레이션 파일을 보게 되면 dependencies에 &quot;0011_update_proxy_permissions&quot;과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;의존하고 있는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coFDVn/btsKldgwaCo/g8JglU8aK4JTJn7MyWKDoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coFDVn/btsKldgwaCo/g8JglU8aK4JTJn7MyWKDoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coFDVn/btsKldgwaCo/g8JglU8aK4JTJn7MyWKDoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoFDVn%2FbtsKldgwaCo%2Fg8JglU8aK4JTJn7MyWKDoK%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;2648&quot; height=&quot;1720&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1720&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;반드시 이전 번호로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Reversing Migrations 한 후에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;마이그레이션 파일을 삭제하시길 바랍니다.&lt;/p&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;a href=&quot;https://docs.djangoproject.com/en/5.1/topics/migrations/&quot;&gt;https://docs.djangoproject.com/en/5.1/topics/migrations/&lt;/a&gt;)&lt;/p&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;그럼 테스트로 auth 앱의 마이그레이션을 0011번으로 Reversing Migrations 한 후에 다시 0012번으로 마이그레이션 해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730625495557&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate auth 0011&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciOW9f/btsKujHMjnP/O1BO0pdRMzKQQOhNUB8tK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciOW9f/btsKujHMjnP/O1BO0pdRMzKQQOhNUB8tK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciOW9f/btsKujHMjnP/O1BO0pdRMzKQQOhNUB8tK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciOW9f%2FbtsKujHMjnP%2FO1BO0pdRMzKQQOhNUB8tK0%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;2652&quot; height=&quot;1728&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1728&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;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1730625502862&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate auth 0012&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FLLz3/btsKvB8omtZ/SKWopRBU2HOSM9uJ6Ojnbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLLz3/btsKvB8omtZ/SKWopRBU2HOSM9uJ6Ojnbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLLz3/btsKvB8omtZ/SKWopRBU2HOSM9uJ6Ojnbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLLz3%2FbtsKvB8omtZ%2FSKWopRBU2HOSM9uJ6Ojnbk%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;2652&quot; height=&quot;1728&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>django</category>
      <category>django</category>
      <category>makemigrations</category>
      <category>Migrate</category>
      <category>reversing migrations</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/307</guid>
      <comments>https://carrotweb.tistory.com/307#entry307comment</comments>
      <pubDate>Sun, 27 Oct 2024 22:21:31 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 장고 설치 및 프로젝트 생성, 실행 - Installing Django, django-admin startproject, manage.py runserver</title>
      <link>https://carrotweb.tistory.com/306</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;장고(Django)는 하이 레벨 파이썬 웹 프레임워크(high-level&amp;nbsp;Python&amp;nbsp;web&amp;nbsp;framework)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jlml0/btsKbI9eUNf/8rb34WMMXpNoUaaBPMUA9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jlml0/btsKbI9eUNf/8rb34WMMXpNoUaaBPMUA9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jlml0/btsKbI9eUNf/8rb34WMMXpNoUaaBPMUA9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJlml0%2FbtsKbI9eUNf%2F8rb34WMMXpNoUaaBPMUA9k%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;1638&quot; height=&quot;406&quot; data-origin-width=&quot;1638&quot; data-origin-height=&quot;406&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;장고(Django)는 프런트엔드(사용자 대면)와 백엔드(데이터베이스 및 로직)를 모두 개발할 수 있는 풀 스택 프레임워크(Full Stack Framework)입니다.&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;Django에서 D가 묵음이기 때문에 &quot;드장고&quot;가 아닌 &quot;장고&quot;로 읽으시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 내용 장고 사이트를 참고하시기 바랍니다. (&lt;a href=&quot;https://www.djangoproject.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.djangoproject.com&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;1642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sp65v/btsKdDL1I9E/FK91iNoi4A6MwY52qbZDUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sp65v/btsKdDL1I9E/FK91iNoi4A6MwY52qbZDUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sp65v/btsKdDL1I9E/FK91iNoi4A6MwY52qbZDUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSp65v%2FbtsKdDL1I9E%2FFK91iNoi4A6MwY52qbZDUK%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;2392&quot; height=&quot;1642&quot; data-origin-width=&quot;2392&quot; data-origin-height=&quot;1642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;장고 확인&lt;/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;현재 가상 환경에 장고가 설치되어 있는지 확인하기 위해서 Terminal(터미널)에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729351144292&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m django --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Afez2/btsKdMoAQcc/xkXOfcWlJ8vXgjIbV8jJT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Afez2/btsKdMoAQcc/xkXOfcWlJ8vXgjIbV8jJT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Afez2/btsKdMoAQcc/xkXOfcWlJ8vXgjIbV8jJT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAfez2%2FbtsKdMoAQcc%2FxkXOfcWlJ8vXgjIbV8jJT1%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&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;저는 가상 환경에 장고가 아직 설치되어 있지 않아서 &quot;No module named django(장고라는 모듈이 없습니다.)&quot;라고 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 가상 환경에 장고를 설치해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;장고 설치&lt;/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;장고를 설치하기 위해 Terminal(터미널)에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729350577652&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django=={버전}&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;현재 작성 당시 버전은 5.1.2입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729351044825&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install Django==5.1.2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전을 입력하지 않으면 현재 최신 버전으로 설치됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729350775653&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장고는 다음처럼 버전에 대한 지원 연도를&amp;nbsp;알려주고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 특정 연도에 지원이 되지 않는 버전을 사용하고 있을 경우 장고 버전을 업그레이드해야 합니다.&lt;/p&gt;
&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;1630&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3HYSS/btsKb5JMJH6/lVWLFjsYkQrYgoYJteIlwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3HYSS/btsKb5JMJH6/lVWLFjsYkQrYgoYJteIlwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3HYSS/btsKb5JMJH6/lVWLFjsYkQrYgoYJteIlwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3HYSS%2FbtsKb5JMJH6%2FlVWLFjsYkQrYgoYJteIlwk%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;1630&quot; height=&quot;768&quot; data-origin-width=&quot;1630&quot; data-origin-height=&quot;768&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;a href=&quot;https://www.djangoproject.com/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.djangoproject.com/download/&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 최신 버전을 설치하기 위해 버전을 입력하지 않았습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729351953397&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LrHkk/btsKccovZg4/LxfZ3swIPjJe1PGKpdwH61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LrHkk/btsKccovZg4/LxfZ3swIPjJe1PGKpdwH61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LrHkk/btsKccovZg4/LxfZ3swIPjJe1PGKpdwH61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLrHkk%2FbtsKccovZg4%2FLxfZ3swIPjJe1PGKpdwH61%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&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;장고를 설치한 후 다시 버전을 확인해 보면 5.1.2이 설치된 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 가상 환경 폴더(myenv)의 Lib 폴더를 보면 장고(django)와 관련 모듈(asgiref, sqlparse, tzdata)들이 설치되어 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NcnxU/btsKcNort4o/OeoDKFdiG0Oy72JAn86EO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NcnxU/btsKcNort4o/OeoDKFdiG0Oy72JAn86EO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NcnxU/btsKcNort4o/OeoDKFdiG0Oy72JAn86EO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcnxU%2FbtsKcNort4o%2FOeoDKFdiG0Oy72JAn86EO0%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로젝트 생성&lt;/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: #333333; text-align: start;&quot;&gt;프로젝트 관리 파일(manage.py)과 프로젝트 패키지 파일(settings.py, urls.py, asgi.py, wsgi.py)들을 생성하기 위해 &lt;/span&gt;Terminal(터미널)에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729420497385&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django-admin startproject {이름} {디렉토리}&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;django-admin은 장고를 관리하는 명령입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729423036583&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django-admin &amp;lt;command&amp;gt; [options]&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;django-admin startproject 명령은 &lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt;프로젝트가 구동될 수 있게 구조를 생성해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{이름}은 프로젝트 패키지 파일들이 들어갈 폴더 이름입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt;{디렉토리}는 프로젝트를 생성할 디렉터리입니다. (현재 &lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt;디렉토리&lt;/span&gt;에서 생성할 경우 &quot;.&quot;를 입력하고 다른 &lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt;디렉토리&lt;/span&gt;로 생성할 경우 &lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt;디렉토리&lt;/span&gt;를 입력하면 됩니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;더 자세한 내용 장고 문서 사이트를 참고하시기 바랍니다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;(&lt;a href=&quot;https://docs.djangoproject.com/en/5.1/ref/django-admin/#startproject&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.djangoproject.com/en/5.1/ref/django-admin/#startproject&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 현재 폴더에 &lt;span style=&quot;background-color: #ffffff; color: #0c3c26; text-align: start;&quot;&gt;프로젝트 구조를 생성할 것이 때문에 &quot;.&quot;를 입력하였고 프로젝트 패키지 파일들이 들어갈 폴더 이름은 &quot;config&quot;으로 입력하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1729420184258&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;django-admin startproject config .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1HAl8/btsKb027nrZ/ajkGA3MZK9o69dziRyvDN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1HAl8/btsKb027nrZ/ajkGA3MZK9o69dziRyvDN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1HAl8/btsKb027nrZ/ajkGA3MZK9o69dziRyvDN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1HAl8%2FbtsKb027nrZ%2FajkGA3MZK9o69dziRyvDN1%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;2632&quot; height=&quot;1716&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1716&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;EXPLORER를 보면 PROJECT1 폴더에 config 폴더(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프로젝트 패키지 파일들이 있는 폴더&lt;/span&gt;)와 manage.py(프로젝트 관리 파일)가 생성된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 프로젝트를 실행해 보도록 하겠습니다.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;프로젝트 실행(개발 웹 서버 실행)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. 파이썬에서 제공하는 개발 웹 서버로 프로젝트를 실행하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Terminal(터미널)에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1729422813424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py runserver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m3naQ/btsKcXxOz0X/cL76hB753AXsHVmYgqviI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m3naQ/btsKcXxOz0X/cL76hB753AXsHVmYgqviI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m3naQ/btsKcXxOz0X/cL76hB753AXsHVmYgqviI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm3naQ%2FbtsKcXxOz0X%2FcL76hB753AXsHVmYgqviI1%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;2632&quot; height=&quot;1716&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1716&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;개발 웹 서버는 로컬 컴퓨터에서 실행되기 때문에 도메인이 127.0.0.1로 실행되고 포트를 입력하지 않으면 자동으로 8000으로 설정되어 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;더 자세한 내용 장고 문서 사이트를 참고하시기 바랍니다.&lt;/span&gt; (&lt;a href=&quot;https://docs.djangoproject.com/en/5.1/ref/django-admin/#runserver&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.djangoproject.com/en/5.1/ref/django-admin/#runserver&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 웹 브라우저에서 &quot;http://127.0.0.1:8000/&quot;를 입력합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2450&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvVu4n/btsKcfS58Om/rfhMDpdu8UysKBVNkpF5W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvVu4n/btsKcfS58Om/rfhMDpdu8UysKBVNkpF5W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvVu4n/btsKcfS58Om/rfhMDpdu8UysKBVNkpF5W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvVu4n%2FbtsKcfS58Om%2FrfhMDpdu8UysKBVNkpF5W0%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;2450&quot; height=&quot;1618&quot; data-origin-width=&quot;2450&quot; data-origin-height=&quot;1618&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 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>django</category>
      <category>django-admin</category>
      <category>install</category>
      <category>manage.py</category>
      <category>runserver</category>
      <category>startproject</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/306</guid>
      <comments>https://carrotweb.tistory.com/306#entry306comment</comments>
      <pubDate>Sun, 20 Oct 2024 20:59:40 +0900</pubDate>
    </item>
    <item>
      <title>윈도우 파이썬 가상 환경 생성 - Python venv - Creation of virtual environments</title>
      <link>https://carrotweb.tistory.com/305</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 프로젝트 별로 파이썬 환경이 독립될 수 있도록 가상 환경(virtual environments)을 제공하고 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 프로젝트들이 동일한 환경에서 개발되면 문제가 없겠지만 여러 프로젝트들이 다르게 사용하는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;라이브러리가 있거나&lt;span&gt; 다른 라이브러리 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;버전이 있을 경우에는 문제 됩니다. 그래서, 프로젝트 별로 가상 환경을 생성하고 가상 환경에 라이브러리를 설치하면 이런 문제점들을 해결할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 내용은 파이썬 문서를 참고하시기 바랍니다. (&lt;a href=&quot;https://docs.python.org/3/library/venv.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.python.org/3/library/venv.html&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(python 사이트 상단에 있는 Docs 클릭 &amp;gt; Python 3.12.7 documentation에서 Library reference 클릭 &amp;gt; The Python Standard Library에서 Software Packaging and Distribution에 있는 venv &amp;mdash; Creation of virtual environments 클릭)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2578&quot; data-origin-height=&quot;1830&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2WvKl/btsJU21Byjq/K940fbbTck24kPYZjMXfY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2WvKl/btsJU21Byjq/K940fbbTck24kPYZjMXfY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2WvKl/btsJU21Byjq/K940fbbTck24kPYZjMXfY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2WvKl%2FbtsJU21Byjq%2FK940fbbTck24kPYZjMXfY1%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;2578&quot; height=&quot;1830&quot; data-origin-width=&quot;2578&quot; data-origin-height=&quot;1830&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;span style=&quot;letter-spacing: 0px;&quot;&gt;가상 환경은 파이썬 3.3에 추가된 기능입니다. (파이썬 3.3.0은 2012년 9월 29일에 릴리즈 되었기 때문에 오래전에 설치하지 않았다면 사용하는 데는 문제가 없을 겁니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 파이썬의 버전을 확인하기 위해서는 콘솔에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728108627172&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lT4vZ/btsJVT3KeSP/PhFA90n971y1sZqjUghBSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lT4vZ/btsJVT3KeSP/PhFA90n971y1sZqjUghBSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lT4vZ/btsJVT3KeSP/PhFA90n971y1sZqjUghBSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlT4vZ%2FbtsJVT3KeSP%2FPhFA90n971y1sZqjUghBSK%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;2350&quot; height=&quot;1226&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&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;저는 Python 3.12.4가 설치되어 있습니다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(파이썬 저장 위치 :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;C:\workspaces\Python\python312)&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;현재 PC에 설치된 파이썬 라이브러리를 확인하기 위해서는 콘솔에서 다음과 같이&lt;span&gt;&amp;nbsp;&lt;/span&gt;명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728108936880&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X6vCe/btsJUWAl9WV/hTFgY0vS5hEeCYai7WiGd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X6vCe/btsJUWAl9WV/hTFgY0vS5hEeCYai7WiGd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X6vCe/btsJUWAl9WV/hTFgY0vS5hEeCYai7WiGd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX6vCe%2FbtsJUWAl9WV%2FhTFgY0vS5hEeCYai7WiGd0%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;2350&quot; height=&quot;1226&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&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;저의 PC에는 다른 라이브러리가 설치되어 있지 않습니다. (pip 버전이 24.2로 업그레이드되었다고 알려주네요. 아래에 있는 명령어를 실행하여 업그레이드를 해야겠습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pip는 파이썬 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;패키지를 설치하고 관리해 주는 패키지&lt;/span&gt;&amp;nbsp;관리&amp;nbsp;시스템입니다. (&lt;a href=&quot;https://pypi.org/project/pip/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://pypi.org/project/pip/&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pip는 파이썬 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;설치 프로그램에서 선택하여 설치할 수 있습니다. (기본적으로 pip는 체크되어 있습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSpIIi/btsJWOgi8C1/axBKm0ZspSMgcY8dareQFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSpIIi/btsJWOgi8C1/axBKm0ZspSMgcY8dareQFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSpIIi/btsJWOgi8C1/axBKm0ZspSMgcY8dareQFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSpIIi%2FbtsJWOgi8C1%2FaxBKm0ZspSMgcY8dareQFK%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;600&quot; height=&quot;370&quot; data-origin-width=&quot;1312&quot; data-origin-height=&quot;810&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;가상 환경은 콘솔에서 생성할 수 있습니다. 그러나 저는 새로운 프로젝트를 위해 폴더를 생성하고 프로젝트에서 사용할 가상 환경을 생성하도록 하겠습니다. 그리고 개발 IDE로 Visual Studio Code를 사용하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;가상 환경 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트 폴더를 생성합니다. (저는 C:\workspaces\projects\project1 폴더를 생성하였습니다.&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하여 &quot;C:\workspaces\projects\project1&quot; 폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누르면 폴더가 오픈됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFloSX/btsJVWGanWD/3UF3rr9CZdKA39NUWgkVik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFloSX/btsJVWGanWD/3UF3rr9CZdKA39NUWgkVik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFloSX/btsJVWGanWD/3UF3rr9CZdKA39NUWgkVik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFloSX%2FbtsJVWGanWD%2F3UF3rr9CZdKA39NUWgkVik%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;2490&quot; height=&quot;1688&quot; data-origin-width=&quot;2490&quot; data-origin-height=&quot;1688&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;보안을 위해 Trust(신뢰) 확인 창이 나타납니다. &quot;Yes, I Trust the authors&quot; 버튼을 누릅니다. 그리고 Welcome 창은 닫습니다.&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;3. Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭합니다. 그리고 가상 환경을 생성하기 위해 Terminal(터미널)에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728111660631&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m venv {가상 환경 이름 또는 경로를 포함한 가상 환경 이름}&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;저는 가상 환경 이름을 myenv(my environments)라고 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728111295342&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m venv myenv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbZ2n/btsKddfR74f/OiEYhXKF2BjjYHwTLUMEo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbZ2n/btsKddfR74f/OiEYhXKF2BjjYHwTLUMEo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbZ2n/btsKddfR74f/OiEYhXKF2BjjYHwTLUMEo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbZ2n%2FbtsKddfR74f%2FOiEYhXKF2BjjYHwTLUMEo0%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&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;가상 환경이 생성되면 project1 폴더에 myenv라는 폴더가 생성됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 환경 폴더 구조는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728112311879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;project1/
    myenv/ --&amp;gt; 가상 환경 풀더
        Lib --&amp;gt; 가상 환경에서 pip로 설치한 라이브러리들이 저장되는 폴더
        Scripts --&amp;gt; 가상 환경을 관리하는 스크립트가 있는 폴더&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 생성된 가상 환경을 활성화하기 위해서는 myenv의 Scripts 폴더에 있는 activate를 Terminal(터미널)에서&lt;span&gt; &lt;/span&gt;실행해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728112873308&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd myenv\Scripts                                                               
./activate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSqsi/btsKdC7sECG/ObktNTlkkSvvlOEN1Nacf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSqsi/btsKdC7sECG/ObktNTlkkSvvlOEN1Nacf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSqsi/btsKdC7sECG/ObktNTlkkSvvlOEN1Nacf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSqsi%2FbtsKdC7sECG%2FObktNTlkkSvvlOEN1Nacf0%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&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;가상 환경이 활성화되면 가상 환경 이름인 (myenv)가 표시됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728113170364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(myenv) PS C:\workspaces\projects\project1\myenv\Scripts&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 새로운 프로젝트를 위한 가상 환경이 생성되었습니다. (가상 환경이 활성화되어 있어야 pip로 설치한 라이브러리들이 가상 환경의 Lib 폴더에 저장이 됩니다.)&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;Python 3.12.4인 것을 알 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 설치된 파이썬 라이브러리를 확인하면 pip가 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3mmcc/btsKcOnnCij/z3iZ9wkrzgfCZheId81BKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3mmcc/btsKcOnnCij/z3iZ9wkrzgfCZheId81BKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3mmcc/btsKcOnnCij/z3iZ9wkrzgfCZheId81BKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3mmcc%2FbtsKcOnnCij%2Fz3iZ9wkrzgfCZheId81BKK%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가상 환경을 비활성화하기 위해서는 myenv의 Scripts 폴더에 있는 deactivate를 Terminal(터미널)에서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;실행해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728113118126&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;deactivate&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xOyvT/btsKcRYyUMh/w2wKy7vt3OE7AmhCMi1YxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xOyvT/btsKcRYyUMh/w2wKy7vt3OE7AmhCMi1YxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xOyvT/btsKcRYyUMh/w2wKy7vt3OE7AmhCMi1YxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxOyvT%2FbtsKcRYyUMh%2Fw2wKy7vt3OE7AmhCMi1YxK%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;2632&quot; height=&quot;1712&quot; data-origin-width=&quot;2632&quot; data-origin-height=&quot;1712&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;다른 버전의 파이썬으로 가상 환경 생성&lt;/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;저의 PC에는 다른 파이썬 버전인 3.11.1도 설치되어 있습니다. (파이썬 저장 위치 : C:\workspaces\Python\python311)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 프로젝트 폴더를 생성합니다. (저는 C:\workspaces\projects\project2 폴더를 생성하였습니다.)&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. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하여 &quot;C:\workspaces\projects\project2&quot; 폴더를 오픈하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하고 가상 환경을 생성하기 위해 Terminal(터미널)에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728200326495&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;py -{파이썬 버전} -m venv myenv&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;여러 버전의 파이썬이 설치되어 있으면 python 명령어 대신 py 명령어를 사용하여 버전 별로 실행해야 합니다.&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;저는 3.11 버전으로 가상 환경을 생성하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728113855973&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;py -3.11 -m venv myenv&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csRB4M/btsJVbK256I/ayPObrcSVBMwnfvrFjxEtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csRB4M/btsJVbK256I/ayPObrcSVBMwnfvrFjxEtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csRB4M/btsJVbK256I/ayPObrcSVBMwnfvrFjxEtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsRB4M%2FbtsJVbK256I%2FayPObrcSVBMwnfvrFjxEtK%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;2234&quot; height=&quot;1464&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1464&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;4. 생성된 가상 환경을 활성화하기 위해서는 myenv의 Scripts 폴더에 있는 activate를 Terminal(터미널)에서&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;실행했습니다. 그리고 가상 환경의 파이썬의 버전을 확인해 보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XgEDu/btsJWzcApbr/zHulpethLax0CFXR5h5w21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XgEDu/btsJWzcApbr/zHulpethLax0CFXR5h5w21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XgEDu/btsJWzcApbr/zHulpethLax0CFXR5h5w21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXgEDu%2FbtsJWzcApbr%2FzHulpethLax0CFXR5h5w21%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;2234&quot; height=&quot;1464&quot; data-origin-width=&quot;2234&quot; data-origin-height=&quot;1464&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 data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;py 명령어 대신 다른 파이썬 버전이 설치되어 있는 경로를 이용해서 가상 환경을 생성할 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728116903523&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\workspaces\projects\project2&amp;gt; C:\workspaces\Python\python311\python.exe -m venv myenv&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;py 명령어&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;여러 버전의 파이썬이 설치되어 있을 경우 py 명령어를 사용하여 버전 별로 파이썬을 실행할 수 있습니다.&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;콘솔에서 다음과 같이 명령어를 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728206257011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;py -h&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bknyMB/btsJWvH4EXh/162d3pSfVJmJFnpL3SR1s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bknyMB/btsJWvH4EXh/162d3pSfVJmJFnpL3SR1s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bknyMB/btsJWvH4EXh/162d3pSfVJmJFnpL3SR1s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbknyMB%2FbtsJWvH4EXh%2F162d3pSfVJmJFnpL3SR1s1%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;2350&quot; height=&quot;1226&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&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;설치되어 있는 버전으로 파이썬을 실행하기 위해서는 launcher-args(Launcher arguments)에 실행할 버전을 입력하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1728206469385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;py [launcher-args]&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;설치되어 있는 파이썬 버전인 3.11.1과 3.12.4를 py 명령어를 이용하여 실행하고 3.X 버전 중 마지막 버전으로 실행되게 하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1728206723893&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;py -3.11
py -3.12
py -3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzqL5c/btsJWuvEniQ/IHPQhDjPmWKNkpjkkfp6Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzqL5c/btsJWuvEniQ/IHPQhDjPmWKNkpjkkfp6Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzqL5c/btsJWuvEniQ/IHPQhDjPmWKNkpjkkfp6Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzqL5c%2FbtsJWuvEniQ%2FIHPQhDjPmWKNkpjkkfp6Z1%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;2350&quot; height=&quot;1226&quot; data-origin-width=&quot;2350&quot; data-origin-height=&quot;1226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>django</category>
      <category>PIP</category>
      <category>PY</category>
      <category>Python</category>
      <category>venv</category>
      <category>가상환경</category>
      <category>파이썬</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/305</guid>
      <comments>https://carrotweb.tistory.com/305#entry305comment</comments>
      <pubDate>Sun, 6 Oct 2024 18:28:31 +0900</pubDate>
    </item>
    <item>
      <title>three.js 3D 모델을 glTF 파일로 다운로드하기(.glb or .gltf)</title>
      <link>https://carrotweb.tistory.com/304</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 추출된 glTF 정보를 .glb 파일(바이너리) 또는 .gltf&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파일(JSON)&lt;/span&gt;로 다운로드하여 저장할 수 있게 헤보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;glTF 정보를 스크립트에서 다운로드하기 위해서는 URL.createObjectURL() 메서드를 사용하면 됩니다.&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;URL.createObjectURL() 메서드에 대한 영문 설명은 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The&amp;nbsp;URL.createObjectURL()&amp;nbsp;static&amp;nbsp;method&amp;nbsp;creates&amp;nbsp;a&amp;nbsp;string&amp;nbsp;containing&amp;nbsp;a&amp;nbsp;URL&amp;nbsp;representing&amp;nbsp;the&amp;nbsp;object&amp;nbsp;given&amp;nbsp;in&amp;nbsp;the&amp;nbsp;parameter.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;번역해 보면 URL.createObjectURL() 정적 메서드는 파라미터로 전달받은 객체를 가리키는 URL이 포함된 문자열을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697363134375&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;URL.createObjectURL(object)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;object: File, Blob, MediaSource 객체입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;File 객체 또는 Blob 객체 또는 MediaSource 객체를 URL로 접근할 수 있게 아래와 같이 Blob URL를 생성하여 리턴하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697367065526&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;blob:http://localhost:5173/c95eb15c-3c2d-4ca1-b327-8e25a8bfe73e&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;그리고 URL.createObjectURL() 정적 메서드를 사용할 때마다 새로운 Blob URL를 생성되기 때문에 생성된 Blob URL은 URL.revokeObjectURL() 정적 메서드를 사용하여 해제해줘야 합니다.&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;그러나 생성된 Blob URL를 해제하지 않아도 웹 브라우저가 unload(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;다른 경로로 이동&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하거나 웹 브라우저가 종료될 때)가 되면&lt;span&gt; 웹 브라우저가&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;자동으로 해제해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 URL.createObjectURL()와 URL.revokeObjectURL() 정적 메서드로 blob URL를 생성하고 해제하는 방법은 W3C의 &lt;a href=&quot;https://www.w3.org/TR/FileAPI/#creating-revoking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Creating and Revoking a blob URL&lt;/a&gt;를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;URL.createObjectURL() 정적 메서드로 Blob URL를 생성하기 위해서는 먼저 glTF 정보를 Blob 객체로 만들어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blob(Binary Large Object, 비랍/블랍)은 대용량의 바이너리로 저장된 객체입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697380630537&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Blob(array, options)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;array: ArrayBuffer[] 또는 TypedArray[] 또는 DataView[] 또는 USVString(UTF-8로 인코딩 된 string[]) &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;또는 다른&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Blob 배열 객체이거나 객체 또는 여러 개의 타입이 혼합된 배열 객체입니다.&lt;/li&gt;
&lt;li&gt;options: 데이터의 type과 endings을 설정하는 옵셥입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;options은 다음과 같이 설정할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;type: 저장될 데이터의 MIME 타입입니다. 기본값 &quot;&quot;(빈 문자열)&lt;/li&gt;
&lt;li&gt;endings(transparent, native): array 타입이 USVString(UTF-8로 인코딩 된 string[])일 때&amp;nbsp; 개행 문자(&quot;\n&quot;)를 사용 중인 OS에 맞춰서 개행 문자를 변환할지(native) 아니면 변환하지 않을지(transparent) 선택합니다. 기본값 transparent&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추출된 glTF&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;정보를&lt;span&gt; Blob(Binary Large Object, 비랍/블랍)으로 만들고 Blob URL를 생성하여 파일로 다운로드해 보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. &lt;/span&gt;추출된 glTF 정보를 파라미터로 받아 바이너리 형식과&amp;nbsp;JSON 형식의 &amp;nbsp;Blob 객체를 만드는 함수를 만듭니다.&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;바이너리 형식으로 변환하기 위해서 options의 type를 &quot;application/octet-stream&quot;으로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697384331109&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 바이너리 형식으로 변환
function downloadBinary(buffer) {
    const blob = new Blob([buffer], {type: 'application/octet-stream'});
    console.log(&quot;Blob:&quot;, blob);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;JSON 형식으로 변환하기 위해서&lt;span&gt;&amp;nbsp;추출된 glTF 정보를 JSON 문자열로 변환하고 &lt;/span&gt;&lt;/span&gt;options의 type를 &quot;application/json&quot;으로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697384843411&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// JSON 형식으로 변환
function downloadJSON(buffer) {
    const blob = new Blob([JSON.stringify(buffer)], {type: 'application/json'});
    console.log(&quot;Blob:&quot;, blob);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/banDXv/btszlI5BJvn/pzeEtpggRzdyz4xmK0hIVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/banDXv/btszlI5BJvn/pzeEtpggRzdyz4xmK0hIVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/banDXv/btszlI5BJvn/pzeEtpggRzdyz4xmK0hIVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbanDXv%2FbtszlI5BJvn%2FpzeEtpggRzdyz4xmK0hIVk%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;2. 기존 ExportglTF() 함수에 downloadBinary()와 downloadJSON()를 추가합니다. glTF 정보가 ArrayBuffer[]이면 downloadBinary() 함수를 호출하고 그렇지 않으면 downloadJSON() 함수를 호출하게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697385054261&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExportglTF() {
    // GLTF익스포트 생성
    const exporter = new GLTFExporter();

    // GLTF익스포트 옵션 - 바이너리 형식으로 추출
    const options = {
        binary: false
    };

    exporter.parse(
        box2,
        function (gltf) {
            if (gltf instanceof ArrayBuffer) {
                console.log(&quot;export gltf:&quot;, gltf);
                downloadBinary(gltf);
            } else {
                console.log(&quot;export gltf:&quot;, gltf);
                downloadJSON(gltf);
            }
        },
        function (error) {
            console.error(&quot;exporter error:&quot;, error);
        },
        options
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zpqUS/btszjBsWnnJ/GgoA34kYO8aztWynU6N5p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zpqUS/btszjBsWnnJ/GgoA34kYO8aztWynU6N5p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zpqUS/btszjBsWnnJ/GgoA34kYO8aztWynU6N5p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzpqUS%2FbtszjBsWnnJ%2FGgoA34kYO8aztWynU6N5p0%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Controls에서 &quot;Export&quot; 버튼을 클릭하면 콘솔에 Blob 객체 정보가 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHPZP7/btsyue5tMFl/a0SIGzZeZONVf24QPhyI1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHPZP7/btsyue5tMFl/a0SIGzZeZONVf24QPhyI1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHPZP7/btsyue5tMFl/a0SIGzZeZONVf24QPhyI1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHPZP7%2Fbtsyue5tMFl%2Fa0SIGzZeZONVf24QPhyI1k%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;2562&quot; height=&quot;1638&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF&lt;span&gt; &lt;/span&gt;&lt;/span&gt;익스포트 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;옵션의 binry가 flase이면 JSON 형식으로&lt;span&gt; &lt;/span&gt;&lt;/span&gt;다음과 같이 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;콘솔에&lt;span&gt; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;출력됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698570212468&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// GLTF익스포트 옵션 - JSON 형식으로 추출
const options = {
    binary: false
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eh9l6t/btsyta3Qpl5/0azuMAnUvqtDRiNEQB3r20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eh9l6t/btsyta3Qpl5/0azuMAnUvqtDRiNEQB3r20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eh9l6t/btsyta3Qpl5/0azuMAnUvqtDRiNEQB3r20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feh9l6t%2Fbtsyta3Qpl5%2F0azuMAnUvqtDRiNEQB3r20%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;2562&quot; height=&quot;1638&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&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;3. 파일로 다운로드하기 위해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Blob 객체를&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파라미터로 받는&amp;nbsp;&lt;/span&gt;다운로드 함수를 만듭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 URL를 생성하기 위해서 URL.createObjectURL() 메서드를 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697385718232&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 다운로드
function download(blob) {
    const blobURL = URL.createObjectURL(blob);
    console.log(blobURL);
}&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;기존 downloadBinary()와 downloadJSON()에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다운로드 함수를&lt;span&gt; &lt;/span&gt;&lt;/span&gt;추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1697386227589&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 바이너리 형식으로 변환
function downloadBinary(buffer) {
    const blob = new Blob([buffer], {type: 'application/octet-stream'});
    console.log(&quot;Blob:&quot;, blob);
    download(blob);
}

// JSON 형식으로 변환
function downloadJSON(buffer) {
    const blob = new Blob([JSON.stringify(buffer)], {type: 'application/json'});
    console.log(&quot;Blob:&quot;, blob);
    download(blob);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boFz7h/btszllphTPb/Ch5hAKk1QmT2e6wF06f6u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boFz7h/btszllphTPb/Ch5hAKk1QmT2e6wF06f6u0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boFz7h/btszllphTPb/Ch5hAKk1QmT2e6wF06f6u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboFz7h%2FbtszllphTPb%2FCh5hAKk1QmT2e6wF06f6u0%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Controls에서 &quot;Export&quot; 버튼을 클릭하면 콘솔에 Blob URL이 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/le1jN/btsytKKfQ5M/EcUnNK8HGn3IhmeQ9kLk7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/le1jN/btsytKKfQ5M/EcUnNK8HGn3IhmeQ9kLk7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/le1jN/btsytKKfQ5M/EcUnNK8HGn3IhmeQ9kLk7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fle1jN%2FbtsytKKfQ5M%2FEcUnNK8HGn3IhmeQ9kLk7k%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;2562&quot; height=&quot;1638&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1697386749440&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;blob:http://localhost:5173/b8c1b2f5-f4ee-4a9d-b286-7aed8af4dd47&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF&lt;span&gt; &lt;/span&gt;&lt;/span&gt;익스포트 옵션의 binry가 flase이면 JSON 형식으로 다음과 같이&lt;span&gt; Blob URL이 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;콘솔에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;출력됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698570283494&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// GLTF익스포트 옵션 - JSON 형식으로 추출
const options = {
    binary: false
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1gjWv/btsyCgOEEqJ/yIEKdSuWGIHZsKpKScnvDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1gjWv/btsyCgOEEqJ/yIEKdSuWGIHZsKpKScnvDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1gjWv/btsyCgOEEqJ/yIEKdSuWGIHZsKpKScnvDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1gjWv%2FbtsyCgOEEqJ%2FyIEKdSuWGIHZsKpKScnvDK%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;2562&quot; height=&quot;1638&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1697386621410&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;blob:http://localhost:5173/b86e8950-8d45-4b8c-8822-16703dc678c2&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;4. 생성된 Blob URL로 다운로드하기 위해서 A 태그를 생성하고 href 속성 값으로 Blob URL를 설정합니다. 그리고 생성된 A 태그를 페이지에 추가하고 click() 메서드로 A 태그를 클릭하여 다운로드하게 합니다. 다운로드 후 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;생성된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Blob URL를 해제하고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;페이지에&lt;span&gt; 추가된 A 태그를 삭제합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1697387146415&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 다운로드
function download(blob) {
    const blobURL = URL.createObjectURL(blob);
    console.log(blobURL);
    // 다운로드를 하기위해 Blob URL로 A 태그 생성
    const link = document.createElement('a');
    link.href = blobURL;
    // 다운로드 파일 명
    link.download = &quot;test.glb&quot;;
    // A 태그 추가
    document.body.appendChild(link);
    // A 태그를 클릭하여 다운로드
    link.click();
    // 다운로드 후 Blob URL 해제
    URL.revokeObjectURL(blobURL);
    // A 태그 삭제
    document.body.removeChild(link);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7cG9N/btszkQ39LgL/SurG2xUcKUblIXWKHOzTK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7cG9N/btszkQ39LgL/SurG2xUcKUblIXWKHOzTK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7cG9N/btszkQ39LgL/SurG2xUcKUblIXWKHOzTK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7cG9N%2FbtszkQ39LgL%2FSurG2xUcKUblIXWKHOzTK0%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Controls에서 &quot;Export&quot; 버튼을 클릭하면 콘솔에 glTF 파일이 다운로드됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW4WeG/btsywgV1ZSO/ZEh6pMuXC2RxXL5ZvLKkrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW4WeG/btsywgV1ZSO/ZEh6pMuXC2RxXL5ZvLKkrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW4WeG/btsywgV1ZSO/ZEh6pMuXC2RxXL5ZvLKkrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW4WeG%2FbtsywgV1ZSO%2FZEh6pMuXC2RxXL5ZvLKkrK%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;2562&quot; height=&quot;1638&quot; data-origin-width=&quot;2562&quot; data-origin-height=&quot;1638&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;익스포트 옵션과 &lt;/span&gt;다운로드되는 파일 명을 변경할 수 있게 처리해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;5. Controls에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;익스포트 옵션을 변경하고 다운로드 파일명을 변경할 수 있게 객체(exporter1)에 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698572655663&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const exporter1 = {
    ExportglTFFileName : 'test.glb',
    ExportglTFFilebinary : true,
    ExportglTFFunction : ExportglTF
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqboPc/btszjzaSxoL/Hjx6x8G7iulkkThFaUhtAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqboPc/btszjzaSxoL/Hjx6x8G7iulkkThFaUhtAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqboPc/btszjzaSxoL/Hjx6x8G7iulkkThFaUhtAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqboPc%2FbtszjzaSxoL%2FHjx6x8G7iulkkThFaUhtAK%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;익스포트 옵션의 binary를&amp;nbsp; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;exporter1의 ExportglTFFilebinary로 설정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698573182253&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExportglTF() {
    // GLTF익스포트 생성
    const exporter = new GLTFExporter();

    // GLTF익스포트 옵션 - 바이너리/JSON 형식으로 추출
    const options = {
        binary: exporter1.ExportglTFFilebinary
    };

    exporter.parse(
        box2,
        function (gltf) {
            if (gltf instanceof ArrayBuffer) {
                console.log(&quot;export gltf:&quot;, gltf);
                downloadBinary(gltf);
            } else {
                console.log(&quot;export gltf:&quot;, gltf);
                downloadJSON(gltf);
            }
        },
        function (error) {
            console.error(&quot;exporter error:&quot;, error);
        },
        options
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7eDx8/btszoik3kyW/XKJgcwOhW1N8YKbSNPw88k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7eDx8/btszoik3kyW/XKJgcwOhW1N8YKbSNPw88k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7eDx8/btszoik3kyW/XKJgcwOhW1N8YKbSNPw88k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7eDx8%2Fbtszoik3kyW%2FXKJgcwOhW1N8YKbSNPw88k%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;exporter1의&lt;span&gt; ExportglTFFileName으&lt;/span&gt;로 설정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698573363036&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 다운로드
function download(blob) {
    const blobURL = URL.createObjectURL(blob);
    console.log(blobURL);
    // 다운로드를 하기위해 Blob URL로 A 태그 생성
    const link = document.createElement('a');
    link.href = blobURL;
    // 다운로드 파일 명
    link.download = exporter1.ExportglTFFileName;
    // A 태그 추가
    document.body.appendChild(link);
    // A 태그를 클릭하여 다운로드
    link.click();
    // 다운로드 후 Blob URL 해제
    URL.revokeObjectURL(blobURL);
    // A 태그 삭제
    document.body.removeChild(link);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P0FZ0/btszrLtwxrX/Uo9vWbEdUiWFz59dYk7dWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P0FZ0/btszrLtwxrX/Uo9vWbEdUiWFz59dYk7dWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P0FZ0/btszrLtwxrX/Uo9vWbEdUiWFz59dYk7dWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP0FZ0%2FbtszrLtwxrX%2FUo9vWbEdUiWFz59dYk7dWk%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Controls에 추가합니다.&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698572880044&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;folder2.add(exporter1, 'ExportglTFFileName');
folder2.add(exporter1, 'ExportglTFFilebinary');
folder2.add(exporter1, 'ExportglTFFunction').name('Export');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLHki/btszkR23wjK/VjlLiKdJBNNtMuQy3ToWa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLHki/btszkR23wjK/VjlLiKdJBNNtMuQy3ToWa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLHki/btszkR23wjK/VjlLiKdJBNNtMuQy3ToWa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLHki%2FbtszkR23wjK%2FVjlLiKdJBNNtMuQy3ToWa1%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;그리고 Controls에 ExportglTFFileName과 ExportglTFFilebinary가 추가됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uabee/btszqeJqIx9/ey8eGT0ZfYGodXDraEasJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uabee/btszqeJqIx9/ey8eGT0ZfYGodXDraEasJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uabee/btszqeJqIx9/ey8eGT0ZfYGodXDraEasJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuabee%2FbtszqeJqIx9%2Fey8eGT0ZfYGodXDraEasJ0%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;2556&quot; height=&quot;1644&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1644&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;6. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFilebinary가 체크되면 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFileName의 확장자를 &quot;.glb&quot;로 변경시키고 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFilebinary가 체크되지 않으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFileName의 확장자를 &quot;.gltf&quot;로 변경되게 함수를 만듭니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698573987239&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 파일 저장 형식에 따른 파일 확장자 변경
function updatesglTFFileName() {
    let fileName = exporter1.ExportglTFFileName;
    const pos = fileName.lastIndexOf('.');
    if (pos &amp;gt; 0) {
        if (exporter1.ExportglTFFilebinary) {
            exporter1.ExportglTFFileName = fileName.substring(0, pos) + &quot;.glb&quot;;
        } else {
            exporter1.ExportglTFFileName = fileName.substring(0, pos) + &quot;.gltf&quot;;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9B3Qu/btszk24ntwL/f2xRmcPfeEc3g8scexGRKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9B3Qu/btszk24ntwL/f2xRmcPfeEc3g8scexGRKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9B3Qu/btszk24ntwL/f2xRmcPfeEc3g8scexGRKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9B3Qu%2Fbtszk24ntwL%2Ff2xRmcPfeEc3g8scexGRKk%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;확장자를 변경하는 함수를 ExportglTFFilebinary에서 onChange()로 처리되게 추가하고 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Controls에 있는 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFileName&lt;/span&gt;이&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;변경된 확장로 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;변경되도록 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;listen() 함수를 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698573816208&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;folder2.add(exporter1, 'ExportglTFFileName').listen();
folder2.add(exporter1, 'ExportglTFFilebinary').onChange(updatesglTFFileName);
folder2.add(exporter1, 'ExportglTFFunction').name('Export');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUQiy/btszjDYDkF6/SAPaqZKaDeqGGh9Yz1qzZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUQiy/btszjDYDkF6/SAPaqZKaDeqGGh9Yz1qzZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUQiy/btszjDYDkF6/SAPaqZKaDeqGGh9Yz1qzZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUQiy%2FbtszjDYDkF6%2FSAPaqZKaDeqGGh9Yz1qzZk%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;2668&quot; height=&quot;1660&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1660&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Controls&lt;/span&gt;에서&amp;nbsp;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFilebinary를 선택할 때마다 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;ExportglTFFileName의 확장자가 변경되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nnCwe/btszjz2WHkf/TiAMiYcR0evwR0mNBrPjw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nnCwe/btszjz2WHkf/TiAMiYcR0evwR0mNBrPjw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nnCwe/btszjz2WHkf/TiAMiYcR0evwR0mNBrPjw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnnCwe%2Fbtszjz2WHkf%2FTiAMiYcR0evwR0mNBrPjw1%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;2556&quot; height=&quot;1644&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1644&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;그리고 Controls에서 &quot;Export&quot; 버튼을 클릭하면 변경된 확장자로 다운로드되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cutaR0/btszkbngh4A/WHvn0Om3yX8rVqir0PvAn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cutaR0/btszkbngh4A/WHvn0Om3yX8rVqir0PvAn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cutaR0/btszkbngh4A/WHvn0Om3yX8rVqir0PvAn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcutaR0%2Fbtszkbngh4A%2FWHvn0Om3yX8rVqir0PvAn1%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;2556&quot; height=&quot;1644&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>BLOB</category>
      <category>GLTFExporter</category>
      <category>Three.js</category>
      <category>URL.createObjectURL</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/304</guid>
      <comments>https://carrotweb.tistory.com/304#entry304comment</comments>
      <pubDate>Sun, 29 Oct 2023 19:44:33 +0900</pubDate>
    </item>
    <item>
      <title>three.js 3D 모델 추출하기(glTF JSON or Binary) - GLTFExporter</title>
      <link>https://carrotweb.tistory.com/303</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 우리가 만든 Object(객체, 3D 모델)을 glTF 포맷으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;추출&lt;/span&gt;해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1. import를 통해 GLTFExporter(GLTF익스포트) 모듈을 가져옵니다. GLTFExporter(GLTF&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;익스포트)&lt;/span&gt;는 Scence(씬, 장면)이나 Scence(씬, 장면)에 있는 Object(객체)들을 glTF 포맷으로 추출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696833302687&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN7lha/btsxqsYL3Xa/qgi4YpIoq5KY9LzUgwfyT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN7lha/btsxqsYL3Xa/qgi4YpIoq5KY9LzUgwfyT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN7lha/btsxqsYL3Xa/qgi4YpIoq5KY9LzUgwfyT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN7lha%2FbtsxqsYL3Xa%2Fqgi4YpIoq5KY9LzUgwfyT1%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;GLTFExporter(GLTF익스포트) 모듈의 실제 위치는 &quot;\node_modules\three\examples\jsm\exporters\GLTFExporter.js&quot; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ECQyb/btsxsRQ3r9i/6wqnlppOPyfkGCRBE31zL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ECQyb/btsxsRQ3r9i/6wqnlppOPyfkGCRBE31zL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ECQyb/btsxsRQ3r9i/6wqnlppOPyfkGCRBE31zL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FECQyb%2FbtsxsRQ3r9i%2F6wqnlppOPyfkGCRBE31zL0%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Scence(씬, 장면)이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Scence(씬, 장면)에 있는 Object(객체)들을 glTF 포맷으로 추출하기 위한 함수를 만듭니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696861154364&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExportglTF() {
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbJIxE/btsxkESQWQK/pqA5qsONWCz5Zn5BGebQ70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbJIxE/btsxkESQWQK/pqA5qsONWCz5Zn5BGebQ70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbJIxE/btsxkESQWQK/pqA5qsONWCz5Zn5BGebQ70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbJIxE%2FbtsxkESQWQK%2FpqA5qsONWCz5Zn5BGebQ70%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;3. glTF 포맷으로 추출하기 위해 함수에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;GLTFExporter(GLTF익스포트)&lt;/span&gt;를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696834593586&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GLTFExporter()&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;GLTFExporter(GLTF익스포트)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696834708809&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExportglTF() {
    // GLTF익스포트 생성
    const exporter = new GLTFExporter();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsa6K6/btsxH1SLMb0/FiKkrKwzdEkG0OsN6ReFJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsa6K6/btsxH1SLMb0/FiKkrKwzdEkG0OsN6ReFJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsa6K6/btsxH1SLMb0/FiKkrKwzdEkG0OsN6ReFJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbsa6K6%2FbtsxH1SLMb0%2FFiKkrKwzdEkG0OsN6ReFJk%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Scence(씬, 장면)이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Scence(씬, 장면)에 있는 Object(객체)들을 GLTFExporter(GLTF익스포트)의 parse(파서) 함수로 추출합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696834939482&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.parse (input : Object3D, onCompleted : Function, onError : Function, options : Object)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;input: 추출할 Scence(씬, 장면) 또는 Scence(씬, 장면)에 있는 Object(객체)입니다.&lt;/li&gt;
&lt;li&gt;onCompleted: glTF 포맷으로 추출된 후 호출되는 함수입니다. (함수 파라미터로 &amp;nbsp;glTF JSON 또는 바이너리(ArrayBuffer)를 넘겨줍니다.)&lt;/li&gt;
&lt;li&gt;onError: glTF 생성 중에 오류가 발생하면 호출되는 함수입니다. (함수 파라미터로 에러 정보를 넘겨줍니다.)&lt;/li&gt;
&lt;li&gt;options:&amp;nbsp;추출할&amp;nbsp;때&amp;nbsp;사용되는&amp;nbsp;옵션입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input은 다음과 같이 설정할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;Scence(씬, 장면)를 추출할 경우&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1696836255982&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 하나의 Scence(씬, 장면)를 추출할 경우
exporter.parse(scene1, ...)
// 여러 개의 Scence(씬, 장면)를 추출할 경우 (배열로 추가)
exporter.parse([scene1, scene2], ...)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scence(씬, 장면)에 있는 Object(객체)를 추출할 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1696836444820&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 하나의 객체(3D 모델)를 추출할 경우
exporter.parse(object1, ...)
// 여러 개의 객체(3D 모델)를 추출할 경우 (배열로 추가)
exporter.parse([object1, object2], ...)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scence(씬, 장면)과 Object(객체)를 썩어서 추출할 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1696836630538&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 하나 또는 여러개의 Scence(씬, 장면)과 객체(3D 모델)를 썩어서 추출할 경우
exporter.parse([scene1, object1, object2, scene2], ...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object(객체)나 Scence(씬, 장면)과 객체를 썩어서 추출할 경우에는 새로운 Scence(씬, 장면)을&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt; 생성하여 glTF 포맷으로 추출됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;options은 다음과 같이 설정할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;trs: 추출되는 로드마다 Matrix 정보 대신 Position(위치), Rotation(회전), Scale(크기) 정보로 내보낼지 여부입니다. 기본값 false&lt;/li&gt;
&lt;li&gt;onlyVisible:&amp;nbsp;보이는&amp;nbsp;Object(객체)만&amp;nbsp;추출할지&amp;nbsp;여부입니다.&amp;nbsp;기본값&amp;nbsp;true&lt;/li&gt;
&lt;li&gt;binary:&amp;nbsp;바이너리(.glb)&amp;nbsp;형식으로&amp;nbsp;추출할지&amp;nbsp;여부입니다.&amp;nbsp;기본값&amp;nbsp;false&lt;/li&gt;
&lt;li&gt;maxTextureSize: 텍스처(이미지)의 최대 크기(너비와 높이를 곱한 값)를 지정된 값으로 제한합니다. 기본값 Infinity(무한대)&lt;/li&gt;
&lt;li&gt;animations:&amp;nbsp;추출할&amp;nbsp;애니메이션&amp;nbsp;목록입니다.&lt;/li&gt;
&lt;li&gt;includeCustomExtensions: userData.gltfExtensions 속성으로 정의된 사용자 정보를 내보낼지 여부입니다. 기본값 false&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Object(객체, 3D 모델)을&amp;nbsp;&lt;/span&gt;바이너리(.glb) 형식으로 추출하기 위해서 options에 binary를 true로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696859109064&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExportglTF() {
    // GLTF익스포트 생성
    const exporter = new GLTFExporter();

    // GLTF익스포트 옵션 - 바이너리 형식으로 추출
    const options = {
        binary: true
    };
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkiIpe/btsxqtDlKXs/HXYsx3t91Sn2Kd34qws02k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkiIpe/btsxqtDlKXs/HXYsx3t91Sn2Kd34qws02k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkiIpe/btsxqtDlKXs/HXYsx3t91Sn2Kd34qws02k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkiIpe%2FbtsxqtDlKXs%2FHXYsx3t91Sn2Kd34qws02k%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;parse 함수로 주사위 객체를 glTF 포맷으로 추출하게 input에 box2를 설정하고 onCompleted에서는 생성된 glTF 포맷 정보를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;콘솔 로그로&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;출력되게 함수를 설정하고&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;onError에서는 오류 정보가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;콘솔 로그로&amp;nbsp;&lt;/span&gt;출력되게 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1696861605556&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExportglTF() {
    // GLTF익스포트 생성
    const exporter = new GLTFExporter();

    // GLTF익스포트 옵션 - 바이너리 형식으로 추출
    const options = {
        binary: true
    };

    exporter.parse(
        box2,
        function (gltf) {
            if (gltf instanceof ArrayBuffer) {
                console.log(&quot;export gltf:&quot;, gltf);
            } else {
                console.log(&quot;export gltf:&quot;, gltf);
            }
        },
        function (error) {
            console.error(&quot;exporter error:&quot;, error);
        },
        options
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6ou4/btsxkB9EDeI/rx0foEKOVpkOTdkizxR9Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6ou4/btsxkB9EDeI/rx0foEKOVpkOTdkizxR9Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6ou4/btsxkB9EDeI/rx0foEKOVpkOTdkizxR9Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6ou4%2FbtsxkB9EDeI%2Frx0foEKOVpkOTdkizxR9Uk%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;5. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF 추출 함수를 호출하기 위해서 Controls&lt;/span&gt;에 별도의 Folder(폴더)를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696862170654&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤러에 glTF 포맷으로 추출하기 위한 Folder(폴더) 추가
const folder2 = gui.addFolder('GLTFExporter');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clmGaw/btsxkEL4qpy/FUSAXxl9sD6ut2Q2DktAo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clmGaw/btsxkEL4qpy/FUSAXxl9sD6ut2Q2DktAo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clmGaw/btsxkEL4qpy/FUSAXxl9sD6ut2Q2DktAo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclmGaw%2FbtsxkEL4qpy%2FFUSAXxl9sD6ut2Q2DktAo0%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;Controls에서 버튼을 생성하기 위해서는 객체의 parameters(파라미터)를 값을 function으로 선언하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696863059621&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const myObject = {
	myFunction: function() { ... }
};&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;우리는 위에서 만든 ExportglTF() 함수로 객체를 생성하고 Folder(폴더)에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696862411349&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const exporter1 = {
    ExportglTFFunction : ExportglTF
};

folder2.add(exporter1, 'ExportglTFFunction').name('Export');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m4GND/btsxsoOSDOf/uiH4hkfKQtolqUaN4lUba0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m4GND/btsxsoOSDOf/uiH4hkfKQtolqUaN4lUba0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m4GND/btsxsoOSDOf/uiH4hkfKQtolqUaN4lUba0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm4GND%2FbtsxsoOSDOf%2FuiH4hkfKQtolqUaN4lUba0%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;2668&quot; height=&quot;1656&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1656&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;2580&quot; data-origin-height=&quot;1646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xmyq/btsxrjNST2I/KmNYSukUANYxvaoCULyRyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xmyq/btsxrjNST2I/KmNYSukUANYxvaoCULyRyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xmyq/btsxrjNST2I/KmNYSukUANYxvaoCULyRyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xmyq%2FbtsxrjNST2I%2FKmNYSukUANYxvaoCULyRyk%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;2580&quot; height=&quot;1646&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1646&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;6. Controls에서 &quot;Export&quot; 버튼을 클릭하면 콘솔에 바이너리(ArrayBuffer)로 추출된 glTF 정보가 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L1X9N/btsxsmcu49r/BRUf6g7TNyavmuVA3TRJQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L1X9N/btsxsmcu49r/BRUf6g7TNyavmuVA3TRJQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L1X9N/btsxsmcu49r/BRUf6g7TNyavmuVA3TRJQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL1X9N%2Fbtsxsmcu49r%2FBRUf6g7TNyavmuVA3TRJQ1%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;2580&quot; height=&quot;1646&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1646&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;만약 JSON 형식으로 추출하고 싶다면 options에서 binary를 false로 설정하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1696864607388&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// GLTF익스포트 옵션 - JSON 형식으로 추출
const options = {
    binary: false
};&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;그리면 콘솔에 JSON 형식으로 추출된 glTF 정보가 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCAxb/btsxUauWsQ3/wbYhCNQTgKa3NMu99nAEgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCAxb/btsxUauWsQ3/wbYhCNQTgKa3NMu99nAEgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCAxb/btsxUauWsQ3/wbYhCNQTgKa3NMu99nAEgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCAxb%2FbtsxUauWsQ3%2FwbYhCNQTgKa3NMu99nAEgK%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;2580&quot; height=&quot;1646&quot; data-origin-width=&quot;2580&quot; data-origin-height=&quot;1646&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;이어서 추출된 glTF 정보를 .gltf 파일과 .glb 파일로 다운로드해 보겠습니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>glTF</category>
      <category>GLTFExporter</category>
      <category>parse</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/303</guid>
      <comments>https://carrotweb.tistory.com/303#entry303comment</comments>
      <pubDate>Tue, 10 Oct 2023 00:10:02 +0900</pubDate>
    </item>
    <item>
      <title>three.js 3D 모델 불러오기(glTF 파일 로드) - GLTFLoader</title>
      <link>https://carrotweb.tistory.com/302</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 외부에서 만들어진 3D 모델을 로드하여 Scence(씬, 장면)에 추가해 보도록 하겠습니다.&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;3D 모델들은 다양한 파일 포맷으로 저장됩니다.&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;대표적인 3D 파일 포맷으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;OBJ, FBX, glTF, USD가 있습니다.&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;다양한 파일 포맷 중에서 three.js에서는 glTF 파일 포맷을 사용하는 것을 추천하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;1032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csDZSm/btsnZJ12OLE/FkDogOPDrFfjguu3mkQFDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csDZSm/btsnZJ12OLE/FkDogOPDrFfjguu3mkQFDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csDZSm/btsnZJ12OLE/FkDogOPDrFfjguu3mkQFDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsDZSm%2FbtsnZJ12OLE%2FFkDogOPDrFfjguu3mkQFDK%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;1766&quot; height=&quot;1032&quot; data-origin-width=&quot;1766&quot; data-origin-height=&quot;1032&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF(GL Transmission Format, GL 트랜스미션 포맷)는 응용프로그램에서 3D 장면과 3D 모델을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;효율적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;전송하고 로드시키는 방법에 대한 사양(규격, 명세)으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;로열티가 없는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;오픈 소스 파일 포맷입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;glTF는 3D Assets(3D 에셋, 3D 자산(모델 정보, 텍스처, 바이너리 데이터))의 파일 크기를 최소화하였습니다. 그리고 3D Assets(3D 에셋)을 사용하기 위해 압축을 풀고 처리하는 런타임 프로세싱을 최소화하였습니다. (이것은 .glb 파일에 적용되는 내용입니다.)&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;glTF는 제작 작업 절차를 간소화하고 산업 전반에서 콘텐츠가 서로 호환되어 사용(상호운용)이 가능하게 3D 콘텐츠 도구 및 서비스를 위한 확장 가능한 공통 배포 포맷을 정의하였습니다.&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;자세한 설명은 glTF(&lt;a href=&quot;https://github.com/KhronosGroup/glTF&quot;&gt;https://github.com/KhronosGroup/glTF&lt;/a&gt;)를 참조하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 glTF는 어떤 구조로 되어 있을까요?&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;glTF&amp;nbsp;2.0&amp;nbsp;Specification(&lt;a href=&quot;https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html&lt;/a&gt;)를 보면 다음과 같이 glTF의 Asset(에셋)에 대해 설명하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d86YPz/btsnYZkjNiY/gCJfZTV2hawIh7IBfNu0s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d86YPz/btsnYZkjNiY/gCJfZTV2hawIh7IBfNu0s1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d86YPz/btsnYZkjNiY/gCJfZTV2hawIh7IBfNu0s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd86YPz%2FbtsnYZkjNiY%2FgCJfZTV2hawIh7IBfNu0s1%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;1784&quot; height=&quot;534&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;534&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;glTF Asset(에셋, 자산)은 다음과 같이 표현됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scence(씬, 장면)에 대한 전체 설명이 담긴&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;JSON 포맷 파일 (.gltf) : 노드 계층 구조, 머티리얼, 카메라 정보뿐만 아니라 메시, 애니메이션 그리고 기타 구성에 대한 설명자 정보도 포함됩니다.&lt;/li&gt;
&lt;li&gt;지오메트리, 애니메이션 그리고 기타 버퍼 기반 데이터가 담긴 바이너리 파일 (.bin)&lt;/li&gt;
&lt;li&gt;텍스처 이미지가 담긴 이미지 파일 (.jpg, .png, 등등)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;즉, 아래 샘플(&lt;a href=&quot;https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/BoomBox/glTF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/BoomBox/glTF&lt;/a&gt;)처럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Asset(에셋,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;자산)은&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;3개의 유형으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;JSON 포맷 파일 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;(.gltf)&lt;/span&gt;, 데이터 파일 (.bin), 이미지 파일 (.jpg, .png, 등등)로 구성됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2546&quot; data-origin-height=&quot;898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diYj7G/btson1HWn1a/lDCRFKOXAJ0FC08vmSm420/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diYj7G/btson1HWn1a/lDCRFKOXAJ0FC08vmSm420/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diYj7G/btson1HWn1a/lDCRFKOXAJ0FC08vmSm420/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiYj7G%2Fbtson1HWn1a%2FlDCRFKOXAJ0FC08vmSm420%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;2546&quot; height=&quot;898&quot; data-origin-width=&quot;2546&quot; data-origin-height=&quot;898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;3D 모델에 대한 정보는&lt;span&gt;&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;JSON 포맷으로 .gltf 파일로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;저장되고 3D 모델의 지오메트리, 애니메이션, 스킨 정보들은 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;.bin 파일로 저장되고 3D 모델&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;의&lt;span&gt; 머티리얼에서 사용되는 이미지들은 각각의 이미지 파일(.jpg, .png, 등등)로 저장됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 JSON 포맷 파일(.gltf)에는 &lt;/span&gt;데이터가 담긴&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;바이너리 파일 (.bin)과 이미지 파일 (.jpg, .png)들이 연결되어 있습니다.&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;또는 JSON 포맷 파일, 데이터 파일, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;모든 이미지 파일&lt;/span&gt;들이 하나의 바이너리 파일 (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;.glb&lt;/span&gt;)로 결합되어 저장됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2552&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duzPbT/btsorkPuVED/kduXsr2hbyHga22YXIBF0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duzPbT/btsorkPuVED/kduXsr2hbyHga22YXIBF0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duzPbT/btsorkPuVED/kduXsr2hbyHga22YXIBF0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduzPbT%2FbtsorkPuVED%2FkduXsr2hbyHga22YXIBF0K%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;2552&quot; height=&quot;504&quot; data-origin-width=&quot;2552&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;glTF는&lt;/span&gt; .glb 파일로 저장되고 배포됩니다. 그 이유는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;데이터 파일 (.bin)과&amp;nbsp;&lt;/span&gt;이미지 파일 (.jpg, .png, 등등)를 함께 배포하는 것보다 배포가 용이하기 때문입니다.&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;그럼 glTF 파일을 로드해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. import를 통해 GLTFLoader(GLTF로더) 모듈을 가져옵니다. GLTFLoader(GLTF로더)는 glTF 파일을 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694326745407&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LWoQ1/btstxlomfvh/1g7tNpkxdYSMVKwztuWxM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LWoQ1/btstxlomfvh/1g7tNpkxdYSMVKwztuWxM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LWoQ1/btstxlomfvh/1g7tNpkxdYSMVKwztuWxM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLWoQ1%2Fbtstxlomfvh%2F1g7tNpkxdYSMVKwztuWxM0%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&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;GLTFLoader(GLTF로더) 모듈의 실제 위치는 &quot;\node_modules\three\examples\jsm\loaders\GLTFLoader.js&quot; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvUIBD/btstywJD7Xm/nKP127GTkXXLtFqTG7QGF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvUIBD/btstywJD7Xm/nKP127GTkXXLtFqTG7QGF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvUIBD/btstywJD7Xm/nKP127GTkXXLtFqTG7QGF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvUIBD%2FbtstywJD7Xm%2FnKP127GTkXXLtFqTG7QGF0%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&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;2. GLTF로더로 로드할 모델을 glTF-Sample-Models(&lt;a href=&quot;https://github.com/KhronosGroup/glTF-Sample-Models/blob/master/2.0/BoomBox/glTF-Binary/BoomBox.glb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/KhronosGroup/glTF-Sample-Models/blob/master/2.0/BoomBox/glTF-Binary/BoomBox.glb&lt;/a&gt;)에서 다운로드합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc0tJd/btstwZTnjBO/nCwtVaxMNZj1qMD5pio1DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc0tJd/btstwZTnjBO/nCwtVaxMNZj1qMD5pio1DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc0tJd/btstwZTnjBO/nCwtVaxMNZj1qMD5pio1DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc0tJd%2FbtstwZTnjBO%2FnCwtVaxMNZj1qMD5pio1DK%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;2532&quot; height=&quot;1598&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&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;그리고 프로젝트에 resources \ textures 폴더 다운로드한 BoomBox 파일(BoomBox.glb)을 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbGmhG/btsts5Nmooh/JfLBxr2cvCt41UWgnLiPS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbGmhG/btsts5Nmooh/JfLBxr2cvCt41UWgnLiPS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbGmhG/btsts5Nmooh/JfLBxr2cvCt41UWgnLiPS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbGmhG%2Fbtsts5Nmooh%2FJfLBxr2cvCt41UWgnLiPS1%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VSCode에서는 glTF 파일을 볼 수 없습니다.&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;3. GLTFLoader(GLTF로더)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694338137882&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GLTFLoader(manager : LoadingManager)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;manager(매니저) : GLTF로더가 사용할 LoadingManager(로딩 매니저)입니다. 기본값 THREE.DefaultLoadingManager&lt;/li&gt;
&lt;/ul&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;기본 로딩 매니저로 GLTFLoader(GLTF로더)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694338159737&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// GLTF로더 생성
const loader = new GLTFLoader();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzQZws/btstxlomhmN/soCdrBoAul12vfvIZxGe9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzQZws/btstxlomhmN/soCdrBoAul12vfvIZxGe9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzQZws/btstxlomhmN/soCdrBoAul12vfvIZxGe9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzQZws%2FbtstxlomhmN%2FsoCdrBoAul12vfvIZxGe9k%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&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;4. resources \ textures 폴더에 있는 BoomBox 파일(BoomBox.glb)을 GLTFLoader(GLTF로더)로 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694331908174&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.load (url : String, onLoad : Function, onProgress : Function, onError : Function)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url: .glb 파일 또는 .gltf 파일의 웹 주소입니다.&lt;/li&gt;
&lt;li&gt;onLoad: 로딩이 성공적으로 완료된 후 호출되는 함수입니다. (함수 파라메타로&amp;nbsp;&amp;nbsp;glTF JSON를 넘겨줍니다.)&lt;/li&gt;
&lt;li&gt;onProgress: 로딩이 진행되는 동안 호출될 함수입니다. (함수 파라메타로 로드 정보를 넘겨줍니다. - 옵션)&lt;/li&gt;
&lt;li&gt;onError: 로딩 중 오류가 발생하면 호출되는 함수입니다. ( 함수 파라메타로 에러 정보를 넘겨줍니다. - 옵션)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onLoad 함수에서는 콘솔 로그로 로드한 glTF의 JSON 정보를 출력하고 onProgress 함수에서는 콘솔 로그로 로딩 프로세스를 출력하고 onError 함수에서는 콘솔 로그로 오류 정보를 출력하게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694330991939&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// glTF 파일 로드
loader.load('resources/textures/BoomBox.glb', 
    function (gltf) {
        console.log(gltf);
    },
    function (xhr) {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded');
	}, 
    function (error) {
        console.error(error);
    })
;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oonzN/btstG8H0EaD/X3iCEfPYu25svHpqNLuf00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oonzN/btstG8H0EaD/X3iCEfPYu25svHpqNLuf00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oonzN/btstG8H0EaD/X3iCEfPYu25svHpqNLuf00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoonzN%2FbtstG8H0EaD%2FX3iCEfPYu25svHpqNLuf00%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;콘솔 로그에 로딩 프로세스가 출력되고 glTF의 JSON 정보가 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kxFAa/btstCXGHq5M/DKEy6oQjAE2rWDcDUJNRsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kxFAa/btstCXGHq5M/DKEy6oQjAE2rWDcDUJNRsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kxFAa/btstCXGHq5M/DKEy6oQjAE2rWDcDUJNRsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkxFAa%2FbtstCXGHq5M%2FDKEy6oQjAE2rWDcDUJNRsK%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;2532&quot; height=&quot;1598&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&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;5. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Scence(씬, 장면)에&lt;span&gt; 로드한 모델을 추가하기 위해 onLoad 함수에 glt의 scene를 추가하고 로드한 모델을 보기 위해 Camera(카메라)의 Focus Point(포커스 포인트, 초점)과 Position(포지션, 위치)를 변경합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694333038619&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// glTF 파일 로드
loader.load('resources/textures/BoomBox.glb', 
    function (gltf) {
        console.log(gltf);
        scene.add(gltf.scene);
        // 육면체 옆으로 위치 변경
        gltf.scene.position.set(-2, 0, 0);
        // 카메라 초점 변경
        controls.target.copy(gltf.scene.position);
        // 카메라 위치 변경
        camera.position.set(-2, 1, 2);
    },
    function (xhr) {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded');
	}, 
    function (error) {
        console.error(error);
    })
;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewJS0Z/btstxpqLBFk/DFW5TmYAVtvXhWNkYoBf2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewJS0Z/btstxpqLBFk/DFW5TmYAVtvXhWNkYoBf2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewJS0Z/btstxpqLBFk/DFW5TmYAVtvXhWNkYoBf2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FewJS0Z%2FbtstxpqLBFk%2FDFW5TmYAVtvXhWNkYoBf2k%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&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;2532&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHFqd/btstCH41LLj/dsXWoqisrCnTH6eAMAqd2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHFqd/btstCH41LLj/dsXWoqisrCnTH6eAMAqd2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHFqd/btstCH41LLj/dsXWoqisrCnTH6eAMAqd2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHFqd%2FbtstCH41LLj%2FdsXWoqisrCnTH6eAMAqd2K%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;2532&quot; height=&quot;1598&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&quot;/&gt;&lt;/span&gt;&lt;/figure&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;그럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;로드된&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델의 크기가 어떻게 되는지 확인해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;onLoad 함수에서 로드된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;모델의 객체를 가져옵니다. 그리고 객체의 크기를 가져와서 콘솔 로그로 출력합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1694335481823&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 로드된 모델의 크기 확인
var gltfObject = new THREE.Box3().setFromObject(gltf.scene);
var gltfObjectSize = gltfObject.getSize(new THREE.Vector3());
console.log(gltfObjectSize);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl4yXd/btstG7h19l5/cu9loPrtlMvOIPMmLwsvkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl4yXd/btstG7h19l5/cu9loPrtlMvOIPMmLwsvkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl4yXd/btstG7h19l5/cu9loPrtlMvOIPMmLwsvkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl4yXd%2FbtstG7h19l5%2Fcu9loPrtlMvOIPMmLwsvkK%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&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;2532&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TR8HV/btstwWPR8hz/OGDTzSTZgKVMQAD2S5CCY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TR8HV/btstwWPR8hz/OGDTzSTZgKVMQAD2S5CCY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TR8HV/btstwWPR8hz/OGDTzSTZgKVMQAD2S5CCY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTR8HV%2FbtstwWPR8hz%2FOGDTzSTZgKVMQAD2S5CCY1%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;2532&quot; height=&quot;1598&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔 로그에 보면 크기가 매우 작은 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694335903591&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
    &quot;x&quot;: 0.019842308,
    &quot;y&quot;: 0.01954326,
    &quot;z&quot;: 0.0201524906
}&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;모델의 크기를 키우기 위해 전체 Scale(스케일)의 크기를 변경합니다. 크기를 100배 정도 크게 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1694335779445&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// glTF 파일 로드
loader.load('resources/textures/BoomBox.glb', 
    function (gltf) {
        console.log(gltf);

        // 로드된 모델의 크기 확인
        var gltfObject = new THREE.Box3().setFromObject(gltf.scene);
        var gltfObjectSize = gltfObject.getSize(new THREE.Vector3());
        console.log(gltfObjectSize);

        // 모델의 스케일 변경
        gltf.scene.scale.x = 100;
        gltf.scene.scale.y = 100;
        gltf.scene.scale.z = 100;

        scene.add(gltf.scene);
        // 육면체 옆으로 위치 변경
        gltf.scene.position.set(-2, 0, 0);
        // 카메라 초점 변경
        controls.target.copy(gltf.scene.position);
        // 카메라 위치 변경
        camera.position.set(-2, 1, 2);
    },
    function (xhr) {
        console.log((xhr.loaded / xhr.total * 100) + '% loaded');
	}, 
    function (error) {
        console.error(error);
    })
;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgTnIC/btstvPwYRxi/bsV5VTQZjfAgoGTjTQjVq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgTnIC/btstvPwYRxi/bsV5VTQZjfAgoGTjTQjVq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgTnIC/btstvPwYRxi/bsV5VTQZjfAgoGTjTQjVq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgTnIC%2FbtstvPwYRxi%2FbsV5VTQZjfAgoGTjTQjVq0%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;2668&quot; height=&quot;1664&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1664&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;2532&quot; data-origin-height=&quot;1598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUU6bR/btstsM8oHhl/kGxFtNrpNKI4Vp80TH5wx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUU6bR/btstsM8oHhl/kGxFtNrpNKI4Vp80TH5wx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUU6bR/btstsM8oHhl/kGxFtNrpNKI4Vp80TH5wx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUU6bR%2FbtstsM8oHhl%2FkGxFtNrpNKI4Vp80TH5wx1%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;2532&quot; height=&quot;1598&quot; data-origin-width=&quot;2532&quot; data-origin-height=&quot;1598&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;모델의 Scale(스케일)을 크게 하니 적당한 크기로 보입니다.&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>Three.js/기초튼튼</category>
      <category>glb</category>
      <category>glTF</category>
      <category>GLTFLoader</category>
      <category>scale</category>
      <category>setFromObject</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/302</guid>
      <comments>https://carrotweb.tistory.com/302#entry302comment</comments>
      <pubDate>Sun, 10 Sep 2023 18:35:01 +0900</pubDate>
    </item>
    <item>
      <title>three.js GUI Controls - lil-gui, addFolder, geometry.dispose</title>
      <link>https://carrotweb.tistory.com/301</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 만든 Controls에 아래의 three.js 사이트의 doc 처럼 SphereGeometry(스피어 지오메트리, 구 기하 도형)에 대한 속성들을 추가해 보겠습니다. (&lt;a href=&quot;https://threejs.org/docs/index.html#api/en/geometries/SphereGeometry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://threejs.org/docs/index.html#api/en/geometries/SphereGeometry&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img1.png&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buiAqr/btsrH6Tb71k/MIdHO47TlcRuIW9Y98tyEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buiAqr/btsrH6Tb71k/MIdHO47TlcRuIW9Y98tyEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buiAqr/btsrH6Tb71k/MIdHO47TlcRuIW9Y98tyEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuiAqr%2FbtsrH6Tb71k%2FMIdHO47TlcRuIW9Y98tyEk%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;1568&quot; height=&quot;1054&quot; data-filename=&quot;img1.png&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1054&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;우선 Camera(카메라)의 위치(position)를 구 객체(sphere1) 앞으로 이동시키겠습니다.&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;현재 OrbitControls(오빗 컨트롤, 궤도 컨트롤)를 사용하고 있습니다. 그래서 항상 Camera(카메라)의 Focus Point(포커스 포인트, 초점)가 {x: 0, y: 0, z: 0} 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692540237136&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(controls.target);
--&amp;gt; Vector3&amp;nbsp;{x: 0, y: 0, z: 0}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(OrbitControls(오빗 컨트롤, 궤도 컨트롤)를 사용하면 Camera(카메라)의 lookAt 함수를 사용해도 적용되지 않습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)의&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Focus Point(포커스 포인트,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;초점)을 구 객체(sphere1)의 위치로 조정하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692540440096&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(sphere1.position);
--&amp;gt; Vector3&amp;nbsp;{x: 2, y: 1, z: -2}&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;OrbitControls(오빗 컨트롤, 궤도 컨트롤)의 target에 구 객체(sphere1)의 위치 값을 복사하거나 Vector3(백터)로 위치 값을 생성하여 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692540497481&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 초점 변경
controls.target.copy(sphere1.position);

또는

// 카메라 초점 변경
controls.target = new THREE.Vector3(2, 1, -2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBUY7K/btssgsoIOhQ/hrHKUiZoMQHJY607fxMvyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBUY7K/btssgsoIOhQ/hrHKUiZoMQHJY607fxMvyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBUY7K/btssgsoIOhQ/hrHKUiZoMQHJY607fxMvyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBUY7K%2FbtssgsoIOhQ%2FhrHKUiZoMQHJY607fxMvyK%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&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;그러면 Camera(카메라)의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Focus Point(포커스 포인트,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;초점)가 구 객체(sphere1)의 위치로 변경됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czpiQ6/btsrBMPtZUS/tOqkSxg1VK3kqYAfsRWdlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czpiQ6/btsrBMPtZUS/tOqkSxg1VK3kqYAfsRWdlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czpiQ6/btsrBMPtZUS/tOqkSxg1VK3kqYAfsRWdlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczpiQ6%2FbtsrBMPtZUS%2FtOqkSxg1VK3kqYAfsRWdlK%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;2498&quot; height=&quot;1606&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1606&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약, OrbitControls(오빗 컨트롤, 궤도 컨트롤)의 target에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;구 객체(sphere1)의 위치 값을 바로 사용하면 OrbitControls(오빗 컨트롤, 궤도 컨트롤)에서 오른쪽 마우스로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)의&lt;span&gt; &lt;/span&gt;&lt;/span&gt;위치를 변경하면 구 객체(sphere1)가 항상 중앙에 위치하게 되어 라인 세그먼트즈&amp;nbsp; 객체와 분리되는 문제가 발생합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692541044687&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;controls.target = sphere1.position;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4SmYz/btsrB2xL3dX/0pzs0eUjBnGPmwIqjm72s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4SmYz/btsrB2xL3dX/0pzs0eUjBnGPmwIqjm72s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4SmYz/btsrB2xL3dX/0pzs0eUjBnGPmwIqjm72s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4SmYz%2FbtsrB2xL3dX%2F0pzs0eUjBnGPmwIqjm72s0%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;2498&quot; height=&quot;1606&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1606&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;화면에 구 객체(sphere1)가 크게 보이도록 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)의 위치(position)를&lt;span&gt; 조정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692541947497&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 위치 변경
camera.position.set(2, 2.5, -1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btPYjJ/btsshtHuYB3/8XKZTlmpCG932fiQI7wLDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btPYjJ/btsshtHuYB3/8XKZTlmpCG932fiQI7wLDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btPYjJ/btsshtHuYB3/8XKZTlmpCG932fiQI7wLDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtPYjJ%2FbtsshtHuYB3%2F8XKZTlmpCG932fiQI7wLDK%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&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;2498&quot; data-origin-height=&quot;1606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc2hft/btsryswXpAT/eS1lc5PNsiJzSEMXn8Vz8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc2hft/btsryswXpAT/eS1lc5PNsiJzSEMXn8Vz8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc2hft/btsryswXpAT/eS1lc5PNsiJzSEMXn8Vz8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc2hft%2FbtsryswXpAT%2FeS1lc5PNsiJzSEMXn8Vz8k%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;2498&quot; height=&quot;1606&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1606&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;구 객체(sphere1)와 라인 세그먼트즈 객체(sphere1WireframeLine)는 구 그룹(sphere1Group)으로 구성되어 있습니다.&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;구 그룹(sphere1Group)의 첫 번째 자식은 구 객체(sphere1)이고 두 번째 자식은 와이어프레임을 선으로 그린 세그먼트즈 객체(sphere1WireframeLine)입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692542161539&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(sphere1Group.children);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boI6ZQ/btsrARKiXHy/QEl2QMI0e9kvOBWvCUbXhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boI6ZQ/btsrARKiXHy/QEl2QMI0e9kvOBWvCUbXhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boI6ZQ/btsrARKiXHy/QEl2QMI0e9kvOBWvCUbXhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboI6ZQ%2FbtsrARKiXHy%2FQEl2QMI0e9kvOBWvCUbXhk%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;2498&quot; height=&quot;1608&quot; data-origin-width=&quot;2498&quot; data-origin-height=&quot;1608&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;라인 세그먼트즈 객체(sphere1WireframeLine)는 와이어프레임 지오메트리(sphere1WireframeGeometry)를 parameters(파라미터)로 전달받아 선으로 그립니다. 그리고&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;와이어프레임&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;지오메트리(sphere1WireframeGeometry)는 parameters(파라미터)로 구 지오메트리(sphere1Geometry)를 전달받아 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;와이어프레임을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 말한 것처럼 parameters(파라미터) 값으로 전달받기 때문에 값을 변경하여도 생성된 객체는 변경되지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692544965823&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(sphere1Group.children[1].geometry.parameters.geometry.parameters.heightSegments);
--&amp;gt; 32

sphere1Group.children[1].geometry.parameters.geometry.parameters.heightSegments = 4;

console.log(sphere1Group.children[1].geometry.parameters.geometry.parameters.heightSegments);
--&amp;gt; 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 객체를 생성할 때 사용된 정보들은 객체 생성 후 변경되어도 다시 Rendering(렌더링)되지 않습니다.&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;그래서 Scence(씬, 장면)에 객체를 제거하고 객체를 폐기(Dispose)하고 다시 생성해서 Scence(씬, 장면)에 객체를 추가하면 됩니다. 그러나 너무 번거롭습니다.&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;그래서 쉽게 처리하는 방법으로 객체의 Geometry(지오메트리, 기하 도형)만 폐기(Dispose)하고 변경되는 정보로 생성하여 객체의 Geometry(지오메트리, 기하 도형)에 적용하는 겁니다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. 구&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그룹(sphere1Group)에 있는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구 객체(sphere1)와 라인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세그먼트즈&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;객체(sphere1WireframeLine)의 Geometry(지오메트리, 기하 도형)를 폐기(Dispose)합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692602683999&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 적용된 지오메트리 폐기
sphere1Group.children[0].geometry.dispose();
sphere1Group.children[1].geometry.dispose();&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;2. 새로운 SphereGeometry(스피어 지오메트리, 구 기하 도형)의&amp;nbsp;radius(반지름, 반경)는 기존과 동일하게 1로 하고 widthSegments(수평 세그먼트, 가로 분절 수)와 heightSegments(수직 세그먼트, 세로 분절 수)는 10으로 설정하여 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692602418536&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 새로운 지오메트리 생성
const sphere2Geometry = new THREE.SphereGeometry(1, 10, 10);&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;3. 새롭게 생성된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;지오메트리(sphere2Geometry)를 구 객체(sphere1)의 Geometry(지오메트리, 기하 도형)에 적용시키고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;라인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세그먼트즈&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;객체(sphere1WireframeLine)의 Geometry(지오메트리, 기하 도형)에는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;지오메트리(sphere2Geometry)로 새로운 WireframeGeometry(와이어프레임&amp;nbsp;지오메트리)를 생성하여 적용시킵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692602844208&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 새로운 지오메트리 적용
sphere1Group.children[0].geometry = sphere2Geometry;
sphere1Group.children[1].geometry = new THREE.WireframeGeometry(sphere2Geometry);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c34rpj/btssc9ctCL7/kO2xhkiKVCcZ9aBS48R20K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c34rpj/btssc9ctCL7/kO2xhkiKVCcZ9aBS48R20K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c34rpj/btssc9ctCL7/kO2xhkiKVCcZ9aBS48R20K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc34rpj%2Fbtssc9ctCL7%2FkO2xhkiKVCcZ9aBS48R20K%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&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;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDE8cp/btsrIbnjaJv/FsJ6kmcEgAaMegtHSQkaeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDE8cp/btsrIbnjaJv/FsJ6kmcEgAaMegtHSQkaeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDE8cp/btsrIbnjaJv/FsJ6kmcEgAaMegtHSQkaeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDE8cp%2FbtsrIbnjaJv%2FFsJ6kmcEgAaMegtHSQkaeK%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;구&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그룹(sphere1Group)에&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구 객체(sphere1)의&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Geometry(지오메트리, 기하 도형)&lt;/span&gt;는 변경하지 않고 라인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세그먼트즈&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;객체(sphere1WireframeLine)의&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Geometry(지오메트리, 기하 도형)만 변경한다면 구의 객체의 모양과 와이어프레임 모양이 다르기 때문에 와이어프레임 선들이 구의 객체 안으로 들어가게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692603744905&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 적용된 지오메트리 폐기
//sphere1Group.children[0].geometry.dispose();
sphere1Group.children[1].geometry.dispose();

// 새로운 지오메트리 생성
const sphere2Geometry = new THREE.SphereGeometry(1, 10, 10);

// 새로운 지오메트리 적용
//sphere1Group.children[0].geometry = sphere2Geometry;
sphere1Group.children[1].geometry = new THREE.WireframeGeometry(sphere2Geometry);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGQUR2/btsrDf46Qcu/5kqO2WfwbyEmFBkAIgmzg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGQUR2/btsrDf46Qcu/5kqO2WfwbyEmFBkAIgmzg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGQUR2/btsrDf46Qcu/5kqO2WfwbyEmFBkAIgmzg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGQUR2%2FbtsrDf46Qcu%2F5kqO2WfwbyEmFBkAIgmzg1%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&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;그럼 Controls에 SphereGeometry(스피어 지오메트리, 구 기하 도형)의 속성들을 컨트롤러로 추가해 보겠습니다.&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;위에서 테스트한 것처럼 매번 새로운 SphereGeometry(스피어 지오메트리, 구 기하 도형)를 생성해야 하기 때문에 parameters(파라미터)들을 별도의 객체로 관리해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. SphereGeometry(스피어 지오메트리, 구 기하 도형)를 생성할 때 사용되는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;parameters(파라미터)들로 객체(dataSphere1)를 만듭니다. (기본값으로 설정했습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692604573598&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const dataSphere1 = {
    radius: 1,
    widthSegments: 32,
    heightSegments: 16,
    phiStart: 0,
    phiLength: Math.PI * 2,
    thetaStart: 0,
    thetaLength: Math.PI
};&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;2. SphereGeometry(스피어 지오메트리, 구 기하 도형)의 parameters(파라미터)를 객체(dataSphere1)로 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692604807443&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const sphere1Geometry = new THREE.SphereGeometry(dataSphere1.radius, dataSphere1.widthSegments, dataSphere1.heightSegments, dataSphere1.phiStart, dataSphere1.phiLength, dataSphere1.thetaStart, dataSphere1.thetaLength);&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;3. Material(머티리얼)에서 구 객체의 안쪽에도 렌더링 되도록 side 속성을 THREE.DoubleSide로 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692607335331&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const sphere1Material = new THREE.MeshStandardMaterial({color: 0x0000ff, side: THREE.DoubleSide});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUw9A/btssgLBEO5h/XcmJUgekJY4o1BZ3ZTijaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUw9A/btssgLBEO5h/XcmJUgekJY4o1BZ3ZTijaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUw9A/btssgLBEO5h/XcmJUgekJY4o1BZ3ZTijaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUw9A%2FbtssgLBEO5h%2FXcmJUgekJY4o1BZ3ZTijaK%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&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;4. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그룹(sphere1Group)에&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;구 객체(sphere1)와 라인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세그먼트즈&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;객체(sphere1WireframeLine)의&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Geometry(지오메트리, 기하 도형)를 폐기(Dispose)하고 새로운 SphereGeometry(스피어 지오메트리, 구 기하 도형)를 생성하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;적용시키는 함수를 만듭니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692605427717&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구 그룹 지오메트리 변경 함수
function updatesShereGroupGeometry() {

    sphere1Group.children[0].geometry.dispose();
    sphere1Group.children[1].geometry.dispose();

    const newSphereGeometry = new THREE.SphereGeometry(dataSphere1.radius, dataSphere1.widthSegments, dataSphere1.heightSegments, dataSphere1.phiStart, dataSphere1.phiLength, dataSphere1.thetaStart, dataSphere1.thetaLength);

    sphere1Group.children[0].geometry = newSphereGeometry;
    sphere1Group.children[1].geometry = new THREE.WireframeGeometry(newSphereGeometry);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4dRDI/btsshoGaAdS/9s98yZ2tkqvUpGUiD2I5Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4dRDI/btsshoGaAdS/9s98yZ2tkqvUpGUiD2I5Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4dRDI/btsshoGaAdS/9s98yZ2tkqvUpGUiD2I5Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4dRDI%2FbtsshoGaAdS%2F9s98yZ2tkqvUpGUiD2I5Z1%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예제처럼 구 객체에 있는 속성들 컨트롤러로 추가해 보겠습니다.&lt;/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;5. 구 객체에 있는 속성들을 별도의 그룹으로 분리하기 위해서 Controls에 Folder(폴더)를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692605923549&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gui.addFolder(title)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;title(타이틀) : 폴더의 제목 표시줄에 표시할 이름입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제처럼 동일하게 폴더에 표시할 이름을 &quot;THREE.SphereGeometry&quot;으로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692605906840&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤러에 구 그룹 객체를 위한 Folder(폴더) 추가
const folder1 = gui.addFolder('THREE.SphereGeometry');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XqjVX/btsshkX6lYN/X0ewHnqS7tGUJ51qrn0vb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XqjVX/btsshkX6lYN/X0ewHnqS7tGUJ51qrn0vb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XqjVX/btsshkX6lYN/X0ewHnqS7tGUJ51qrn0vb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXqjVX%2FbtsshkX6lYN%2FX0ewHnqS7tGUJ51qrn0vb1%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&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;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQDYz4/btsrEqynJOQ/d7fvcGkTKZUZD5Avl2lmSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQDYz4/btsrEqynJOQ/d7fvcGkTKZUZD5Avl2lmSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQDYz4/btsrEqynJOQ/d7fvcGkTKZUZD5Avl2lmSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQDYz4%2FbtsrEqynJOQ%2Fd7fvcGkTKZUZD5Avl2lmSk%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&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;6. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;객체(dataSphere1)로 컨트롤러에 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각각의 컨트롤러에 $1(최소 값, 선택 값), max(최대 값)은 SphereGeometry(스피어 지오메트리, 구 기하 도형)의 기본값으로 설정합니다.&lt;/li&gt;
&lt;li&gt;컨트롤러가 변경될 때마다 구 그룹 지오메트리 변경 함수(updatesShereGroupGeometry)가 호출되도록 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1692606437210&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤러 추가
// 구 지오메트리의 파라미터들로 추가
folder1.add(dataSphere1, 'radius', 1, 30).onChange(updatesShereGroupGeometry);
folder1.add(dataSphere1, 'widthSegments', 3, 64).step(1).onChange(updatesShereGroupGeometry);
folder1.add(dataSphere1, 'heightSegments', 2, 32).step(1).onChange(updatesShereGroupGeometry);
folder1.add(dataSphere1, 'phiStart', 0, Math.PI * 2).onChange(updatesShereGroupGeometry);
folder1.add(dataSphere1, 'phiLength', 0, Math.PI * 2).onChange(updatesShereGroupGeometry);
folder1.add(dataSphere1, 'thetaStart', 0, Math.PI * 2).onChange(updatesShereGroupGeometry);
folder1.add(dataSphere1, 'thetaLength', 0, Math.PI * 2).onChange(updatesShereGroupGeometry);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNcxBc/btssfzaYslK/YjZil6qT1Gn7mnnr2JSKq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNcxBc/btssfzaYslK/YjZil6qT1Gn7mnnr2JSKq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNcxBc/btssfzaYslK/YjZil6qT1Gn7mnnr2JSKq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNcxBc%2FbtssfzaYslK%2FYjZil6qT1Gn7mnnr2JSKq0%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;2652&quot; height=&quot;1668&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;1668&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;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boaCX5/btsrEqyofC0/gGRyw02Z14f8C3FBg0b1dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boaCX5/btsrEqyofC0/gGRyw02Z14f8C3FBg0b1dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boaCX5/btsrEqyofC0/gGRyw02Z14f8C3FBg0b1dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboaCX5%2FbtsrEqyofC0%2FgGRyw02Z14f8C3FBg0b1dk%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;다양하게 컨트롤러의 값들을 변경시켜서 구 객체가 변경되는 것을 확인해 보시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJmLCc/btsrErxmVSk/yyI1PL5RHbwJyZw3i8v4wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJmLCc/btsrErxmVSk/yyI1PL5RHbwJyZw3i8v4wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJmLCc/btsrErxmVSk/yyI1PL5RHbwJyZw3i8v4wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJmLCc%2FbtsrErxmVSk%2FyyI1PL5RHbwJyZw3i8v4wk%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&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;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EBH7N/btsrB5Wez6X/VpOkxua4gLIhs4e6rJ7kvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EBH7N/btsrB5Wez6X/VpOkxua4gLIhs4e6rJ7kvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EBH7N/btsrB5Wez6X/VpOkxua4gLIhs4e6rJ7kvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEBH7N%2FbtsrB5Wez6X%2FVpOkxua4gLIhs4e6rJ7kvK%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&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;2548&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmwmMs/btsrTQCo5Lc/5P4eoYU7oNeKWGDkpMSKS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmwmMs/btsrTQCo5Lc/5P4eoYU7oNeKWGDkpMSKS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmwmMs/btsrTQCo5Lc/5P4eoYU7oNeKWGDkpMSKS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmwmMs%2FbtsrTQCo5Lc%2F5P4eoYU7oNeKWGDkpMSKS1%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;2548&quot; height=&quot;1618&quot; data-origin-width=&quot;2548&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>addFolder</category>
      <category>Controls</category>
      <category>geometry.dispose</category>
      <category>GUI</category>
      <category>lil-gui</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/301</guid>
      <comments>https://carrotweb.tistory.com/301#entry301comment</comments>
      <pubDate>Sun, 27 Aug 2023 20:40:13 +0900</pubDate>
    </item>
    <item>
      <title>three.js GUI Controls - lil-gui, gui.add</title>
      <link>https://carrotweb.tistory.com/300</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;three.js 사이트의 doc에서 Geometry(지오메트리, 기하 도형)들의 설명을 보면 오른쪽 상단에 Controls가 있습니다.&amp;nbsp; (&lt;a href=&quot;https://threejs.org/docs/index.html#api/en/geometries/SphereGeometry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://threejs.org/docs/index.html#api/en/geometries/SphereGeometry&lt;/a&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qFN0B/btsrcrdumCh/bReSatuk3iVVViG96vynCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qFN0B/btsrcrdumCh/bReSatuk3iVVViG96vynCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qFN0B/btsrcrdumCh/bReSatuk3iVVViG96vynCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqFN0B%2FbtsrcrdumCh%2FbReSatuk3iVVViG96vynCK%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;1568&quot; height=&quot;1054&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;1054&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Controls에는 객체의 속성 값들이 표시되고 속성 값을 변경하면 객체가 변경됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이번에 위의 예제 화면처럼 Controls를 만들어 주사위 객체의 Material(머티리얼)에 있는 alphaTest(알파&amp;nbsp;테스트) 속성을 변경해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이전에는 Controls를 만들기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;dat.GUI를 사용하였으나 최근에는 lil-gui를 대체하여 사용하고 있습니다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;three.js에서도 lil-gui를 모듈에 포함하여 배포하고 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controls를 만들기 위해서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;lil-gui(릴 지유아이&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;릴&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그래픽 사용자 인터페이스) 모듈을 가져와야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;lil-gui(릴 지유아이,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;릴&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그래픽 사용자 인터페이스)는 사용자가 웹 페이지에서 객체의 속성 값들을 변경할 수 있게 플로팅 패널(Floating Panel, 떠 있는 패널)로 컨트롤러(Controller) UI를 만들어 줍니다.&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;자세한 설명은 lil-gui 사이트(&lt;a href=&quot;https://lil-gui.georgealways.com/&quot;&gt;https://lil-gui.georgealways.com/&lt;/a&gt;)를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. import를 통해 lil-gui(릴 지유아이&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;릴&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그래픽 사용자 인터페이스) 모듈을 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692103012834&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { GUI } from 'three/addons/libs/lil-gui.module.min.js';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UBF83/btsrH4OwJua/fQK2SGD1UeYF3HtEHQXk91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UBF83/btsrH4OwJua/fQK2SGD1UeYF3HtEHQXk91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UBF83/btsrH4OwJua/fQK2SGD1UeYF3HtEHQXk91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUBF83%2FbtsrH4OwJua%2FfQK2SGD1UeYF3HtEHQXk91%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;2676&quot; height=&quot;1664&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&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;lil-gui 모듈의 실제 위치는 &quot;\node_modules\three\examples\jsm\libs\lil-gui.module.min.js&quot; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVR3N3/btsrf5HYtEG/yMyfzFqyWrUtmLkCXQ2X31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVR3N3/btsrf5HYtEG/yMyfzFqyWrUtmLkCXQ2X31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVR3N3/btsrf5HYtEG/yMyfzFqyWrUtmLkCXQ2X31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVR3N3%2Fbtsrf5HYtEG%2FyMyfzFqyWrUtmLkCXQ2X31%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;2676&quot; height=&quot;1660&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1660&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;2. lil-gui(릴&amp;nbsp;지유아이,&amp;nbsp;릴&amp;nbsp;그래픽&amp;nbsp;사용자&amp;nbsp;인터페이스)를&amp;nbsp;생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692111348277&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// GUI 생성
const gui = new GUI();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcP4IU/btsrB3XFmxO/hmyJYu2OGNZzLEswbvvKT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcP4IU/btsrB3XFmxO/hmyJYu2OGNZzLEswbvvKT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcP4IU/btsrB3XFmxO/hmyJYu2OGNZzLEswbvvKT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcP4IU%2FbtsrB3XFmxO%2FhmyJYu2OGNZzLEswbvvKT0%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;2676&quot; height=&quot;1664&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&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;그러면 오른쪽 상단에 Controls가 생성되어 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QOCU8/btsrjsCcsvH/QkvjTqKkSJcBCgaIS7EMEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QOCU8/btsrjsCcsvH/QkvjTqKkSJcBCgaIS7EMEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QOCU8/btsrjsCcsvH/QkvjTqKkSJcBCgaIS7EMEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQOCU8%2FbtsrjsCcsvH%2FQkvjTqKkSJcBCgaIS7EMEK%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&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;3. Controls에 컨트롤러를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692112497450&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gui.add(object, property, [$1], [max], [step])&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;object(객체) : 컨트롤러가 제어할 객체입니다.&lt;/li&gt;
&lt;li&gt;property(프로퍼티, 속성) : 객체에서 제어할 속성 이름입니다.&lt;/li&gt;
&lt;li&gt;$1(최소 값, 선택 값) : 숫자 컨트롤러의 최소 값이거나 드롭다운에서 선택 가능한 값입니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;max(최대 값) : 숫자 컨트롤러의 최대 값입니다.&lt;/li&gt;
&lt;li&gt;step(스탭, 간격) : 숫자 컨트롤러의 간격 값입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;object(객체)는 주사위 육면체 객체에 적용되어 있는 Material(머티리얼) 배열에서 첫 번째 배열을 설정하고 property(프로퍼티, 속성)는 alphaTest(알파 테스트)로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692112445788&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤러 추가
// 주사위 육면체 객체에 적용되어 있는 머티리얼 객체, 프로퍼티는 alphaTest로 설정
gui.add(box2Materials[0], 'alphaTest');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pp3An/btsrEpZJ4t7/OriSH9deVYxIHtm0alAUM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pp3An/btsrEpZJ4t7/OriSH9deVYxIHtm0alAUM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pp3An/btsrEpZJ4t7/OriSH9deVYxIHtm0alAUM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPp3An%2FbtsrEpZJ4t7%2FOriSH9deVYxIHtm0alAUM1%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;2676&quot; height=&quot;1664&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&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;그러면 오른쪽 상단에 있는 Controls에 alphaTest라는 이름(속성 이름)으로 숫자 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;컨트롤러가 추가됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q4A83/btsrgjMNLkr/ABEGalpqcqsc3RbDQ4gEj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q4A83/btsrgjMNLkr/ABEGalpqcqsc3RbDQ4gEj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q4A83/btsrgjMNLkr/ABEGalpqcqsc3RbDQ4gEj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq4A83%2FbtsrgjMNLkr%2FABEGalpqcqsc3RbDQ4gEj1%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alphaTest 숫자 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;컨트롤러에는 현재 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt; 속성 값이 나타납니다. (현재 속성 값은 0.1입니다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;속성 값을 입력하거나 상/하 화살표 키보드를 눌러 값을 변경할 수 있습니다. (상/하 화살표 키보드를 누르면 1 간격으로 변경됩니다.)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;맨 위의 예제 화면처럼&lt;span&gt; 숫자 컨트롤러에 슬라이더(Sliders)를 추가하기 위해서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;$1(최소 값)과&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;max(최대 값)를 추가하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alphaTest(알파 테스트) 속성 값인 알파 값(0 ~ 1)으로&amp;nbsp;$1(최소 값)과 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;max(최대 값)를 설정하고 step(스탭, 간격)으로 0.01로 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692113628352&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤러 추가
// 주사위 육면체 객체에 적용되어 있는 머티리얼 객체, 프로퍼티는 alphaTest로 설정
// 최소 값은 0, 최대 값은 1, 간격은 0.01로 설정
gui.add(box2Materials[0], 'alphaTest', 0, 1, 0.01);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clsv4d/btsrCxxqEZn/ulTvF8xrUksnJRaGghbgG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clsv4d/btsrCxxqEZn/ulTvF8xrUksnJRaGghbgG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clsv4d/btsrCxxqEZn/ulTvF8xrUksnJRaGghbgG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclsv4d%2FbtsrCxxqEZn%2FulTvF8xrUksnJRaGghbgG1%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;2676&quot; height=&quot;1664&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&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;또는 min(), max(), step() 메서드를 사용하여 설정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692114750342&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;gui.add(box2Materials[0], 'alphaTest').min(0).max(1).step(0.01);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest 숫자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컨트롤러에 슬라이더(Sliders)가 추가됩니다. 그리고 슬라이더(Sliders)를 마우스로 이동시키면 step(스탭, 간격) 값만큼 변경됩니다. (상/하 화살표 키보드를 눌러도 step 값만큼 변경됩니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkOUdn/btsq51foO7F/rQSjI1PFMeKLieyAeN49Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkOUdn/btsq51foO7F/rQSjI1PFMeKLieyAeN49Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkOUdn/btsq51foO7F/rQSjI1PFMeKLieyAeN49Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkOUdn%2Fbtsq51foO7F%2FrQSjI1PFMeKLieyAeN49Lk%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest 숫자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컨트롤러의 이름은 name() 메서드로 변경할 수 있습니다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest 숫자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컨트롤러의 이름을 &quot;알파 테스트&quot;로 변경하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1692115256661&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤러 추가
// 주사위 육면체 객체에 적용되어 있는 머티리얼 객체, 프로퍼티는 alphaTest로 설정
// 최소 값은 0, 최대 값은 1, 간격은 0.01로 설정
// 칸트롤러의 이름을 '알파 테스트'로 변경
gui.add(box2Materials[0], 'alphaTest', 0, 1, 0.01).name('알파 테스트');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/15Ifr/btsrCR3xgz5/zcpnobetyJk1brjSh7O2y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/15Ifr/btsrCR3xgz5/zcpnobetyJk1brjSh7O2y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/15Ifr/btsrCR3xgz5/zcpnobetyJk1brjSh7O2y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F15Ifr%2FbtsrCR3xgz5%2FzcpnobetyJk1brjSh7O2y0%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;2676&quot; height=&quot;1664&quot; data-origin-width=&quot;2676&quot; data-origin-height=&quot;1664&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest 숫자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컨트롤러의 이름이 &quot;알파 테스트&quot;로 변경됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P81Sg/btsrgUzcNOo/krrhZKxEAKkqhOvnBToRE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P81Sg/btsrgUzcNOo/krrhZKxEAKkqhOvnBToRE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P81Sg/btsrgUzcNOo/krrhZKxEAKkqhOvnBToRE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP81Sg%2FbtsrgUzcNOo%2FkrrhZKxEAKkqhOvnBToRE1%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest 숫자&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;컨트롤러의 슬라이더(Sliders)를 마우스로 이동시켜 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt; &lt;/span&gt;&lt;/span&gt;속성 값을 0으로 변경시키면 5번 주사위 이미지가 투명하지 않게 되고 그림자도 투명하지 않게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh8yHQ/btsq5b3DYoG/Olz5IzMCJiUVkVuxWtGDs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh8yHQ/btsq5b3DYoG/Olz5IzMCJiUVkVuxWtGDs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh8yHQ/btsq5b3DYoG/Olz5IzMCJiUVkVuxWtGDs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh8yHQ%2Fbtsq5b3DYoG%2FOlz5IzMCJiUVkVuxWtGDs0%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;속성 값을 1로 변경시키면 5번 주사위 이미지가 투명해지지만 Aliasing(앨리어싱)이 발생되어 5번 주사위 이미지가 각지게 되고 그림자는 없어지게 됩니다. (alphaTest&amp;nbsp;속성이&amp;nbsp;1이&amp;nbsp;되면&amp;nbsp;흰색까지&amp;nbsp;투과되지&amp;nbsp;않습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l8XSw/btsrcq6LuNK/hSOCJMf2Zr36Axyzvmx6N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l8XSw/btsrcq6LuNK/hSOCJMf2Zr36Axyzvmx6N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l8XSw/btsrcq6LuNK/hSOCJMf2Zr36Axyzvmx6N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl8XSw%2Fbtsrcq6LuNK%2FhSOCJMf2Zr36Axyzvmx6N1%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;속성&lt;span&gt; 값의 변화에 따라 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;주사위 이미지와 그림자가 변화되는 것을&lt;span&gt; &lt;/span&gt;&lt;/span&gt;좀 더 명확하게 확인하기 위해서 주사위 육면체 객체에 적용되어 있는 Material(머티리얼) 배열에서 첫 번째 배열에 있는 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;alphaMap(알파 맵)을 이전에 추가한 그라데이션된 이미지 파일(dicemap.png)로 변경하여 테스트 헤보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1692525982832&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5.png&quot;), alphaMap: box2TextureLoader.load(&quot;resources/textures/dicemap.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[alphaTest&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;속성 값을 0.1로 변경할 경우]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpfLhK/btsq2i9IpK2/fNHuEtFsNUP1uvEZLiFh0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpfLhK/btsq2i9IpK2/fNHuEtFsNUP1uvEZLiFh0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpfLhK/btsq2i9IpK2/fNHuEtFsNUP1uvEZLiFh0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpfLhK%2Fbtsq2i9IpK2%2FfNHuEtFsNUP1uvEZLiFh0K%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;[alphaTest&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;속성 값을 0.54로 변경할 경우]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GpHkW/btsrf3XHKM0/zF4D7sC7vkADWzS9SOOD30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GpHkW/btsrf3XHKM0/zF4D7sC7vkADWzS9SOOD30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GpHkW/btsrf3XHKM0/zF4D7sC7vkADWzS9SOOD30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGpHkW%2Fbtsrf3XHKM0%2FzF4D7sC7vkADWzS9SOOD30%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;[alphaTest&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;속성 값을 0.9로 변경할 경우]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GLYyG/btsrgpzwP1k/T3AKil0Lio3UbLdarEpRGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GLYyG/btsrgpzwP1k/T3AKil0Lio3UbLdarEpRGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GLYyG/btsrgpzwP1k/T3AKil0Lio3UbLdarEpRGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGLYyG%2FbtsrgpzwP1k%2FT3AKil0Lio3UbLdarEpRGk%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;2540&quot; height=&quot;1624&quot; data-origin-width=&quot;2540&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>Controls</category>
      <category>GUI</category>
      <category>lil-gui</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/300</guid>
      <comments>https://carrotweb.tistory.com/300#entry300comment</comments>
      <pubDate>Sun, 20 Aug 2023 19:10:37 +0900</pubDate>
    </item>
    <item>
      <title>three.js 텍스처 매핑, 알파 맵과 알파 테스트로 이미지 자르기와 그림자 처리 - alphaMap, alphaTest</title>
      <link>https://carrotweb.tistory.com/299</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 배경이 투명하지 않는 주사위 이미지를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Material(머티리얼)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;alphaMap(알파 맵) 속성을 사용하여 이미지를 자르고 반투명하게 처리해 보겠습니다. 그리고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest(알파 테스트)&lt;span&gt; 속성을 사용하여 처리되는 범위를 조정해 보겠습니다. (&lt;/span&gt;&lt;/span&gt;그림자는 자동으로 이미지에 맞게 처리됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 alphaMap(알파 맵) 속성에 대해 간단하게 알아보고 진행하겠습니다.&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;alphaMap(알파 맵)은 흰색과 검은색 그리고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;흰색과 검은색 사이의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;회색(밝은 회색부터 어두운 회색까지)으로 구성된 이미지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alphaMap(알파 맵)에 있는 흰색은 이미지 처리 시 원본 이미지가 그대로 투과됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaMap(알파 맵)에 있는&amp;nbsp;&lt;/span&gt;검은색은 이미지 처리 시 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;원본 이미지가&lt;span&gt; 투과되지 않습니다. (검은색과 같은 위치에 있는 이미지는 삭제 처리됩니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alphaMap(알파 맵)에 있는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;흰색과 검은색 사이의 &lt;/span&gt;&lt;/span&gt;회색(밝은 회색부터 어두운 회색까지)은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이미지 처리 시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;반투명하게 투과됩니다. (회색이 어두울 수 록 투명해집니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, alphaMap(알파 맵)은 검은색의 농도에 따라 이미지 처리 시 삭제(검은색)하거나 반투명(밝은 회색부터 어두운 회색까지 농도에 따라 투명도가 달라짐)으로 처리됩니다.&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;그리고 alphaTest(알파 테스트) 속성 값인 알파 값(0.1 ~ 0.9)에 따라 회색(밝은 회색부터 어두운 회색까지)의 처리되는 범위가 넓어집니다. (기본적으로 alphaTest 속성은 0입니다. 그리고 alphaTest 속성이 1이 되면 흰색까지 투과되지 않습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 알파 값이 작을수록 alphaMap(알파 맵)에서 어두운 회색들은 투과되지 않습니다. 반대로 알파 값이 클수록 밝은 회색까지도 투과되지 않습니다.&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;PPT로 alphaMap(알파 맵)으로 사용할 이미지를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;간단하게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;만들어 보겠습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;주사위 이미지와 같은 크기(가로/세로는 3cm)의 도형(직사각형)을 생성합니다.&lt;/li&gt;
&lt;li&gt;도형 윤곽선은 &quot;윤곽선 없음&quot;으로 설정합니다.&lt;/li&gt;
&lt;li&gt;도형을 선택하고 콘텍스트 메뉴에서 &quot;도형 서식&quot;을 클릭합니다.&lt;/li&gt;
&lt;li&gt;도형 서식에서 &quot;그라데이션 채우기&quot;를 선택하고 그라데이션 중지점에서 첫 번째 중지점을 선택하고 색은 검은색으로 선택합니다. 그리고 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;그라데이션 중지점에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세 번째 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;중지점을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;선택하고&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;색은&lt;span&gt;&amp;nbsp;흰색&lt;/span&gt;&lt;/span&gt;으로 선택합니다.&lt;/li&gt;
&lt;li&gt;도형을 PNG 파일로 저장합니다. (저는 dicemap.png으로 저장하였습니다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lopl8/btsq1b2CBLc/9mHc5gZ5VQzfvVKkRwIWYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lopl8/btsq1b2CBLc/9mHc5gZ5VQzfvVKkRwIWYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lopl8/btsq1b2CBLc/9mHc5gZ5VQzfvVKkRwIWYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flopl8%2Fbtsq1b2CBLc%2F9mHc5gZ5VQzfvVKkRwIWYK%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;500&quot; height=&quot;556&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;1050&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;프로젝트의 resources \ textures 폴더에 alphaMap(알파 맵)으로 사용할 이미지(dicemap.png) 파일을 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjQUX1/btsrdjLWLNV/ye2xjysFPREUJk9iGaQfV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjQUX1/btsrdjLWLNV/ye2xjysFPREUJk9iGaQfV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjQUX1/btsrdjLWLNV/ye2xjysFPREUJk9iGaQfV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjQUX1%2FbtsrdjLWLNV%2Fye2xjysFPREUJk9iGaQfV0%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;2672&quot; height=&quot;1656&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&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;테스트를 위해 Material(머티리얼) 배열에서 5번 주사위 이미지를 배경이 투명하지 않는 주사위 이미지(dice5.png)로 변경하고 추가된 이미지 파일(dicemap.png)을 TextureLoader(텍스처로더)로 로드하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaMap 속성 값으로&lt;span&gt; 설정합니다. 그리고 alphaTest 속성 값을 0으로 설정합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691936378127&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5.png&quot;), alphaMap: box2TextureLoader.load(&quot;resources/textures/dicemap.png&quot;), side: THREE.DoubleSide, alphaTest: 0, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BcbqN/btsq1av7Je5/qfklETxve6BZFHe0CACwnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BcbqN/btsq1av7Je5/qfklETxve6BZFHe0CACwnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BcbqN/btsq1av7Je5/qfklETxve6BZFHe0CACwnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBcbqN%2Fbtsq1av7Je5%2FqfklETxve6BZFHe0CACwnk%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;2672&quot; height=&quot;1656&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&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;마우스로 이동해서 보시면 5번 주사위 이미지가 alphaMap(알파 맵)으로 이미지 처리가 되어서 alphaMap(알파 맵)에서 검은색 영역은 삭제처리되고 회색(밝은 회색부터 어두운 회색까지) 영역은 반투명하게 처리되어 나오는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sURLe/btsq0vm1oMh/yksvSANV6ThV4ZrRFpA4A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sURLe/btsq0vm1oMh/yksvSANV6ThV4ZrRFpA4A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sURLe/btsq0vm1oMh/yksvSANV6ThV4ZrRFpA4A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsURLe%2Fbtsq0vm1oMh%2FyksvSANV6ThV4ZrRFpA4A1%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;2560&quot; height=&quot;1632&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1632&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;alphaTest(알파 테스트) 속성 값인 알파 값(0.1 ~ 0.9)에 따라 다음처럼 처리됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ouxuk/btsq0xrzsUK/8F9hKABGbhsiHwIcsNLO41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ouxuk/btsq0xrzsUK/8F9hKABGbhsiHwIcsNLO41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ouxuk/btsq0xrzsUK/8F9hKABGbhsiHwIcsNLO41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fouxuk%2Fbtsq0xrzsUK%2F8F9hKABGbhsiHwIcsNLO41%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;1410&quot; height=&quot;636&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림자도 처리된 이미지에 맞게 나타납니다. (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaMap(알파 맵) 이미지가 그라데이션으로 되어있어 처리된 이미지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;크기만큼&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;그림자가 나오게 됩니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그럼 5번 주사위 이미지(dice5.png)에 맞게 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaMap(알파 맵) 이미지를 만들어 처리해 보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;5번 주사위 이미지를 만든 PPT에서 도형의 윤곽선 색을 흰색으로 변경합니다. (윤관선 색이 검은색이면 원본 이미지에 있는 윤관선이 투과되지 않기 때문입니다.)&lt;/li&gt;
&lt;li&gt;검은색 점 도형은 흰색으로 흰색 배경은 검은색으로 변경합니다. (흰색만 투과되기 때문입니다.)&lt;/li&gt;
&lt;li&gt;도형을 PNG 파일로 저장합니다. (기존 파일명에 'm'를 추가하여 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;dice5m&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;.png으로 저장하였습니다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;178&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4bCdx/btsq8Ik4a9d/NAIomSbXFlzDYG4jsLKABK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4bCdx/btsq8Ik4a9d/NAIomSbXFlzDYG4jsLKABK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4bCdx/btsq8Ik4a9d/NAIomSbXFlzDYG4jsLKABK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4bCdx%2Fbtsq8Ik4a9d%2FNAIomSbXFlzDYG4jsLKABK%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;100&quot; height=&quot;137&quot; data-origin-width=&quot;178&quot; data-origin-height=&quot;243&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;프로젝트의 resources \ textures 폴더에 alphaMap(알파 맵)으로 사용할 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;5번 주사위 이미지&lt;/span&gt;(dice5m.png) 파일을 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3V5fW/btsq1JE3MD8/Llhm9csQUYWVM4zqLiEHJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3V5fW/btsq1JE3MD8/Llhm9csQUYWVM4zqLiEHJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3V5fW/btsq1JE3MD8/Llhm9csQUYWVM4zqLiEHJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3V5fW%2Fbtsq1JE3MD8%2FLlhm9csQUYWVM4zqLiEHJ0%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;2672&quot; height=&quot;1656&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Material(머티리얼) 배열에서 추가된 이미지 파일(dice5m.png)로 alphaMap 속성의 값을 변경합니다. 그리고 alphaTest 속성 값을 0.1로 설정합니다. (alphaTest 속성 값을 0으로 설정하면 투명처리가 되지 않습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691940322541&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5.png&quot;), alphaMap: box2TextureLoader.load(&quot;resources/textures/dice5m.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W8Oa3/btsrdjrFOCv/nvd0qiU9tUoqjodUDH8rV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W8Oa3/btsrdjrFOCv/nvd0qiU9tUoqjodUDH8rV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W8Oa3/btsrdjrFOCv/nvd0qiU9tUoqjodUDH8rV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW8Oa3%2FbtsrdjrFOCv%2Fnvd0qiU9tUoqjodUDH8rV1%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;2672&quot; height=&quot;1656&quot; data-origin-width=&quot;2672&quot; data-origin-height=&quot;1656&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면 5번 주사위 이미지가 투명하게 처리되어 보이게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGrcMD/btsq5cfORHG/k2eSuoQdodvFnIVqyKT1SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGrcMD/btsq5cfORHG/k2eSuoQdodvFnIVqyKT1SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGrcMD/btsq5cfORHG/k2eSuoQdodvFnIVqyKT1SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGrcMD%2Fbtsq5cfORHG%2Fk2eSuoQdodvFnIVqyKT1SK%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;2560&quot; height=&quot;1632&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1632&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;참고로, 어도비 포토샵(Photoshop)에서도 alphaMap(알파 맵)과 같은 방식으로 이미지의 배경을 투명하게 하거나 반투명하게 처리하여 여러 이미지들을 겹칠 때 사용합니다. 이런 방식을 alpha channel(알파 채널)이라고 합니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>AlphaMap</category>
      <category>AlphaTest</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/299</guid>
      <comments>https://carrotweb.tistory.com/299#entry299comment</comments>
      <pubDate>Mon, 14 Aug 2023 00:55:48 +0900</pubDate>
    </item>
    <item>
      <title>three.js 텍스처 매핑, 이미지 투명처리, 투명한 그림자 처리 - transparent, alphaTest, THREE.DoubleSide</title>
      <link>https://carrotweb.tistory.com/298</link>
      <description>&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;주사위 이미지를 만든 PPT에서 주사위 틀의 도형 채우기를 &quot;채우기 없음&quot;으로 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 각각을 PNG 파일로 저장합니다. (기존 파일명에 't'를 추가했습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nCLjO/btsoyaFQ2E0/l3ajIy0xQOjKkAgEkwsB91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nCLjO/btsoyaFQ2E0/l3ajIy0xQOjKkAgEkwsB91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nCLjO/btsoyaFQ2E0/l3ajIy0xQOjKkAgEkwsB91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnCLjO%2FbtsoyaFQ2E0%2Fl3ajIy0xQOjKkAgEkwsB91%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;139&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;245&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;프로젝트의 resources \ textures 폴더에 주사위 이미지 파일을 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckOAnM/btsozknG5Bw/nSUjKMywuax1bdTkUEMUT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckOAnM/btsozknG5Bw/nSUjKMywuax1bdTkUEMUT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckOAnM/btsozknG5Bw/nSUjKMywuax1bdTkUEMUT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckOAnM%2FbtsozknG5Bw%2FnSUjKMywuax1bdTkUEMUT1%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;2668&quot; height=&quot;1648&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&quot;/&gt;&lt;/span&gt;&lt;/figure&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;Material(머티리얼) 배열에서 기존 이미지를 추가된 주사위 이미지로 변경하고 주사위 이미지의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;체크무늬 부분이&lt;/span&gt;&amp;nbsp;투명하게 처리되도록 transparent 속성을 true로 추가합니다. (기본적으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;transparent&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;속성은 false입니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1690117660407&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5t.png&quot;), transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2t.png&quot;), transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1t.png&quot;), transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6t.png&quot;), transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3t.png&quot;), transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4t.png&quot;), transparent: true})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/du1ghx/btsp3nRmjLo/Tsnyw1e9LJXHozo3JwXVeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/du1ghx/btsp3nRmjLo/Tsnyw1e9LJXHozo3JwXVeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/du1ghx/btsp3nRmjLo/Tsnyw1e9LJXHozo3JwXVeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdu1ghx%2Fbtsp3nRmjLo%2FTsnyw1e9LJXHozo3JwXVeK%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;2668&quot; height=&quot;1652&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1652&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;2626&quot; data-origin-height=&quot;1642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTQph/btsoxE1xJQE/d3ex8Fiok3jQojqqf8bZjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTQph/btsoxE1xJQE/d3ex8Fiok3jQojqqf8bZjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTQph/btsoxE1xJQE/d3ex8Fiok3jQojqqf8bZjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTQph%2FbtsoxE1xJQE%2Fd3ex8Fiok3jQojqqf8bZjk%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;2626&quot; height=&quot;1642&quot; data-origin-width=&quot;2626&quot; data-origin-height=&quot;1642&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;2626&quot; data-origin-height=&quot;1642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3AuL8/btsoxdbYeAk/qW4ArqAeFPNY5CUNTUYaqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3AuL8/btsoxdbYeAk/qW4ArqAeFPNY5CUNTUYaqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3AuL8/btsoxdbYeAk/qW4ArqAeFPNY5CUNTUYaqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3AuL8%2FbtsoxdbYeAk%2FqW4ArqAeFPNY5CUNTUYaqk%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;2626&quot; height=&quot;1642&quot; data-origin-width=&quot;2626&quot; data-origin-height=&quot;1642&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;그렇지만, 2가지가 투명하게 처리되지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째, 주사위의 그림자가 투명하지 않게 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째, 주사위안이 투명하지 않게 나옵니다. (위를 보면 3번 주사위 왼쪽에 있는 2번, 바닥에 있는 6번, 뒤에 있는 4번 이미지가 보이지 않습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼, 첫 번째 문제인 그림자가 투명한 주사위 이미지에 맞게 투과되어 나오게 하려면 어떻게 해야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림자를 처리하는 방법이 여러 가지 있지만&amp;nbsp;여기서는 텍스처를 사용하는 Material(머티리얼)에서 처리할 수 있는 방법에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 투명하지 않는 텍스처와 alphaMap(알파 맵), alphaTest(알파 테스트)를 사용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 투명한 텍스처와 alphaTest(알파 테스트)를 사용하는 방법&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번째 방법으로 alphaTest(알파 테스트) 속성을 추가하면 간단하게 처리할 수 있습니다.&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;간단하게 alphaTest(알파 테스트) 속성에 대해 알아보고 진행하겠습니다.&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;Material(머티리얼)의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest 속성은 알파 테스트를 실행할 때 사용할 알파 값으로&lt;/span&gt; 0.0부터 1.0까지 값을 가질 수 있습니다. (주의할 점은 Material(머티리얼)의 opacity 속성을 사용하고 있다면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;opacity&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;값이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;값 보다 작으면 렌더링이 되지 않습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;알파 테스트)는 이미지 조각(픽셀)의 알파 값을 비교하여 조각(픽셀)을 삭제처리 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alphaTest(알파 테스트)를 위해 주사위 이미지 보다 복잡한 나무 이미지를 사용하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;값에 따라 어떻게 이미지가 삭제 처리되는지 확인해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alphaTest(알파 테스트)할 나무 이미지(배경이 투명)입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ZAsN/btsp7U8AeJP/mKXHLaf2mlbDtKOv4bumCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ZAsN/btsp7U8AeJP/mKXHLaf2mlbDtKOv4bumCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ZAsN/btsp7U8AeJP/mKXHLaf2mlbDtKOv4bumCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0ZAsN%2Fbtsp7U8AeJP%2FmKXHLaf2mlbDtKOv4bumCK%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;400&quot; height=&quot;236&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;182&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Material(머티리얼)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;alphaTest 값을 각각 0.1, 0.5, 0.9로 설정하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1691242320592&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new THREE.MeshStandardMaterial({map: textureLoader.load(&quot;resources/textures/tree1.png&quot;), alphaTest: 0.1, transparent: true});

new THREE.MeshStandardMaterial({map: textureLoader.load(&quot;resources/textures/tree1.png&quot;), alphaTest: 0.5, transparent: true});

new THREE.MeshStandardMaterial({map: textureLoader.load(&quot;resources/textures/tree1.png&quot;), alphaTest: 0.9, transparent: true});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clYpq6/btsqfA819cS/E8DDiQCkCxtwoHxRdl1v01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clYpq6/btsqfA819cS/E8DDiQCkCxtwoHxRdl1v01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clYpq6/btsqfA819cS/E8DDiQCkCxtwoHxRdl1v01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclYpq6%2FbtsqfA819cS%2FE8DDiQCkCxtwoHxRdl1v01%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;1298&quot; height=&quot;315&quot; data-origin-width=&quot;1298&quot; data-origin-height=&quot;315&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위의 결과처럼 alphaTest&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;값이 높을수록 더 많은 부분이 삭제가 되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 계단 현상인 Aliasing(앨리어싱)이 발생되어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이미지가 각지게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래서 이미지에 맞게&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;alphaTest&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;값을&lt;span&gt; &lt;/span&gt;&lt;/span&gt;설정해야 합니다.&amp;nbsp;일반적으로 0.1에서 0.5 이하로 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각각의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Material(머티리얼)&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에 &lt;/span&gt;&lt;/span&gt;alphaTest&lt;span&gt; 속성&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;을&lt;span&gt; 0.1로 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690724971004&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5t.png&quot;), alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2t.png&quot;), alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1t.png&quot;), alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6t.png&quot;), alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3t.png&quot;), alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4t.png&quot;), alphaTest: 0.1, transparent: true})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjvPKK/btsp35wh9rY/FwrcabyxNqveZImLa6lCW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjvPKK/btsp35wh9rY/FwrcabyxNqveZImLa6lCW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjvPKK/btsp35wh9rY/FwrcabyxNqveZImLa6lCW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjvPKK%2Fbtsp35wh9rY%2FFwrcabyxNqveZImLa6lCW1%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;2668&quot; height=&quot;1652&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1652&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;2576&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q4uFO/btsp9YJfxH7/9PUd1DBk76r4keQKeR8TzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q4uFO/btsp9YJfxH7/9PUd1DBk76r4keQKeR8TzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q4uFO/btsp9YJfxH7/9PUd1DBk76r4keQKeR8TzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ4uFO%2Fbtsp9YJfxH7%2F9PUd1DBk76r4keQKeR8TzK%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;2576&quot; height=&quot;1630&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;1630&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;2576&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duAgEf/btsqfzI4ycj/A549hFNoLVUocb4W9ztiLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duAgEf/btsqfzI4ycj/A549hFNoLVUocb4W9ztiLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duAgEf/btsqfzI4ycj/A549hFNoLVUocb4W9ztiLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduAgEf%2FbtsqfzI4ycj%2FA549hFNoLVUocb4W9ztiLk%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;2576&quot; height=&quot;1630&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;1630&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;그러나 자세히 보면 투과된 그림자의 주사위 이미지는 오른쪽에 있는 5번, 바닥에 있는 6번, 뒤에 있는 4번 이미지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주사위의 1번, 2번, 3번은 왜 투과되어 나오지 않는 걸까요?&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;기본적으로 Material(머티리얼)에서는 텍스처를 렌더링 할 때 앞면(THREE.FrontSide)만 처리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래서 우리가 사용한 육면체는 전부 앞면만 렌더링 된 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그렇기 때문에 뒷면(THREE.BackSide)이 없는 주사위의 1번(위), 2번(왼쪽), 3번(앞쪽)은 그림자로 투과되지 않았습니다. &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고&amp;nbsp; 주사위의 4번(뒤), 5번(오른쪽), 6번(바닥)도 뒷면(THREE.BackSide)이 없어 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;주사위안에서&lt;span&gt;&amp;nbsp;보이지 않았던 겁니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래서 Material(머티리얼)에서 렌더링 할&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 면을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;앞면과 뒷면 둘 다 되게 처리하면 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;각각의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Material(머티리얼)에서 주사위 이미지가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;앞면과 뒷면에서 &lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;렌더링 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;되도록 side 속성을 THREE.DoubleSide로 추가합니다. (기본적으로&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;side&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;속성은 THREE.FrontSide입니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1691246108449&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4t.png&quot;), side: THREE.DoubleSide, alphaTest: 0.1, transparent: true})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwUYwT/btsqd3pZXiz/knRIv5TSamHHtH7bG9Yl30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwUYwT/btsqd3pZXiz/knRIv5TSamHHtH7bG9Yl30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwUYwT/btsqd3pZXiz/knRIv5TSamHHtH7bG9Yl30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwUYwT%2Fbtsqd3pZXiz%2FknRIv5TSamHHtH7bG9Yl30%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;2668&quot; height=&quot;1652&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1652&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;2576&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGL4pe/btsp7JsyUPq/5Gj5bkN17kUIWSJD71vA01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGL4pe/btsp7JsyUPq/5Gj5bkN17kUIWSJD71vA01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGL4pe/btsp7JsyUPq/5Gj5bkN17kUIWSJD71vA01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGL4pe%2Fbtsp7JsyUPq%2F5Gj5bkN17kUIWSJD71vA01%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;2576&quot; height=&quot;1630&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;1630&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;2576&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCzi8B/btsp7BakHS6/e9pIJfHKKth1ebI3RzYtp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCzi8B/btsp7BakHS6/e9pIJfHKKth1ebI3RzYtp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCzi8B/btsp7BakHS6/e9pIJfHKKth1ebI3RzYtp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCzi8B%2Fbtsp7BakHS6%2Fe9pIJfHKKth1ebI3RzYtp0%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;2576&quot; height=&quot;1630&quot; data-origin-width=&quot;2576&quot; data-origin-height=&quot;1630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>AlphaTest</category>
      <category>THREE.BackSide</category>
      <category>THREE.DoubleSide</category>
      <category>THREE.FrontSide</category>
      <category>Three.js</category>
      <category>transparent</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/298</guid>
      <comments>https://carrotweb.tistory.com/298#entry298comment</comments>
      <pubDate>Sat, 5 Aug 2023 23:49:41 +0900</pubDate>
    </item>
    <item>
      <title>three.js 텍스처 매핑, 이미지 입히기  - TextureLoader</title>
      <link>https://carrotweb.tistory.com/297</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Texture(텍스처)란 객체의 색상과 질감을 표현하는 Material(머티리얼)에서 사용되는 이미지나 비디오를 말합니다.&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;Texture Mapping(텍스처 매핑)이란 객체의 표면에 색을 칠하거나 이미지를 입히는 것입니다.&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;객체에 Texture Mapping(텍스처 매핑)하기 위해서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Texture(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;텍스처&lt;span&gt;)를 로드해야 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;three.js에서는 TextureLoader(텍스처로더)로 Texture(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;텍스처&lt;span&gt;)를 로드합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TextureLoader(텍스처로더)는 이미지 (PNG, JPG, GIF, DDS) 또는 비디오 (MP4, OGG/OGV)를 로드합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1689002207476&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TextureLoader(manager : LoadingManager)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;manager(매니저) : 로딩매니저입니다. 기본값 THREE.DefaultLoadingManage&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 두 번째 육면체 객체에 Texture Mapping(텍스처 매핑)을 해보겠습니다.&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;육면체 객체에 Texture(텍스처 매핑)할 나무 바닥 이미지를 다운로드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 나무 바닥 이미지를 &lt;a href=&quot;https://www.freepik.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Freepik 사이트&lt;/a&gt;에서 무료로 다운로드하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;1636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FLVec/btsm4C43CH4/H5u6g61pYZg7u0HCzTAB3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FLVec/btsm4C43CH4/H5u6g61pYZg7u0HCzTAB3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FLVec/btsm4C43CH4/H5u6g61pYZg7u0HCzTAB3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFLVec%2Fbtsm4C43CH4%2FH5u6g61pYZg7u0HCzTAB3k%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;2488&quot; height=&quot;1636&quot; data-origin-width=&quot;2488&quot; data-origin-height=&quot;1636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;다운로드한&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;나무 바닥 이미지의 크기가 크기 때문에 이미지 크기를 넓이 150px, 높이 100px으로 조정하였습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 프로젝트에 resources \ textures 폴더를 생성하고 다운로드한 나무 바닥 이미지 파일(wood1.jpg)을 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOW1io/btsnalADRHG/LoAWWAEM2SuJQEH1lIViF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOW1io/btsnalADRHG/LoAWWAEM2SuJQEH1lIViF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOW1io/btsnalADRHG/LoAWWAEM2SuJQEH1lIViF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOW1io%2FbtsnalADRHG%2FLoAWWAEM2SuJQEH1lIViF1%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;2668&quot; height=&quot;1648&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&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;span style=&quot;color: #333333; text-align: left;&quot;&gt;2. resources \ textures&lt;span&gt; 폴더에 있는 나무 바닥 이미지 파일(wood1.jpg)을 TextureLoader(텍스처로더)로 로드합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688987678269&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 텍스처 매핑할 텍스처를 로드
const box2Texture = new THREE.TextureLoader().load('resources/textures/wood1.jpg');&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;3. 로드한 Texture(텍스처)를 Material(머티리얼)의 map 속성에 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688995525062&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체에 사용할 색상과 질감의 데이터를 생성
const box2Material = new THREE.MeshStandardMaterial({map:box2Texture});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;기존에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;color 속성은 삭제합니다. 그 이유는 Texture(텍스처)의 map color가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;color&lt;span&gt; 속성 값과 결합되어 변경되기 때문입니다. 글 끝부분에서 테스트로 color&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성과 같이 사용해 보도록 하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 두 번째 육면체 객체가 보이도록 Camera(카메라)의 위치를 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688996724479&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 위치 변경
camera.position.set(0, 2, 8);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ct8R1G/btsnak2VjRC/ryJIBg7oytXDsd6l3apG10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ct8R1G/btsnak2VjRC/ryJIBg7oytXDsd6l3apG10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ct8R1G/btsnak2VjRC/ryJIBg7oytXDsd6l3apG10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fct8R1G%2Fbtsnak2VjRC%2FryJIBg7oytXDsd6l3apG10%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;2668&quot; height=&quot;1648&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&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;2568&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBHpdw/btsnaTcUEvo/ArKPvFksnqeDNxysAs8Ay1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBHpdw/btsnaTcUEvo/ArKPvFksnqeDNxysAs8Ay1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBHpdw/btsnaTcUEvo/ArKPvFksnqeDNxysAs8Ay1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBHpdw%2FbtsnaTcUEvo%2FArKPvFksnqeDNxysAs8Ay1%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;2568&quot; height=&quot;1640&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1640&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;2568&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI4NOy/btsm5sushTI/6LVgj3UgKtkBSQUI8hJEnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI4NOy/btsm5sushTI/6LVgj3UgKtkBSQUI8hJEnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI4NOy/btsm5sushTI/6LVgj3UgKtkBSQUI8hJEnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI4NOy%2Fbtsm5sushTI%2F6LVgj3UgKtkBSQUI8hJEnK%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;2568&quot; height=&quot;1640&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1640&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;이번에는 주사위 이미지를 만들어서 두 번째 육면체 객체에 Texture Mapping(텍스처 매핑)을 해보겠습니다.&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;주사위 이미지를 간단하게 PPT로 만들었습니다.&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;틀은 직사각형으로 가로/세로는 3cm, 도형 채우기는 흰색, 도형 윤곽선은 검은색입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점은 원형으로 가로/가로는 0.6cm, 도형 채우기와 도형 윤곽선은 검은색입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직사각형안의 점선은 중앙을 맞추기 위해서 사용했습니다. 저장하기 전에 점선은 삭제합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sIT9l/btsm4CKHiHo/JixYQL1UDDYOfKo9RORhGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sIT9l/btsm4CKHiHo/JixYQL1UDDYOfKo9RORhGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sIT9l/btsm4CKHiHo/JixYQL1UDDYOfKo9RORhGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsIT9l%2Fbtsm4CKHiHo%2FJixYQL1UDDYOfKo9RORhGk%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;102&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;180&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;각각을 PNG 파일로 저장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Onh3X/btsm92nzjKl/3NuzdnByansOh9UbF60KG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Onh3X/btsm92nzjKl/3NuzdnByansOh9UbF60KG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Onh3X/btsm92nzjKl/3NuzdnByansOh9UbF60KG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOnh3X%2Fbtsm92nzjKl%2F3NuzdnByansOh9UbF60KG1%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;139&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;245&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;그리고 프로젝트에 resources \ textures 폴더에 주사위 이미지 파일을 추가합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxrVHz/btsm8hlQCwp/Z0fIM9SS3qZn9KlCOQmLl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxrVHz/btsm8hlQCwp/Z0fIM9SS3qZn9KlCOQmLl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxrVHz/btsm8hlQCwp/Z0fIM9SS3qZn9KlCOQmLl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxrVHz%2Fbtsm8hlQCwp%2FZ0fIM9SS3qZn9KlCOQmLl0%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;2668&quot; height=&quot;1648&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&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;여러 Texture(텍스처)들을 여러 번 로드하기 위해서 TextureLoader(텍스처로더)를 분리하여 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1689000257364&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 텍스처 로드 생성
const box2TextureLoader = new THREE.TextureLoader();&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;육면체 면마다 텍스처가 다른 Material(머티리얼)을 설정해줘야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 6개의 Material(머티리얼)을 생성해서 배열로 전달해야 합니다.&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;6개의 Material(머티리얼)이 육면체에 매핑되는 순서는 오른쪽(1), 왼쪽(2), 위(3), 아래(4), 앞(5), 뒤(6)입니다. (전개도 모양은 다를 수 있습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBGs1/btsnE9HOTVd/Ipv9xjdT3PzucpCNd0d681/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBGs1/btsnE9HOTVd/Ipv9xjdT3PzucpCNd0d681/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBGs1/btsnE9HOTVd/Ipv9xjdT3PzucpCNd0d681/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBGs1%2FbtsnE9HOTVd%2FIpv9xjdT3PzucpCNd0d681%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;300&quot; height=&quot;225&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;533&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;그러나 대부분의 주사위는 1을 기준(1이 위에 있을 경우)으로 다음과 같이 되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndoeL/btsm9hlkq6u/UKvsAcRk60nKzWzdk0psT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndoeL/btsm9hlkq6u/UKvsAcRk60nKzWzdk0psT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndoeL/btsm9hlkq6u/UKvsAcRk60nKzWzdk0psT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FndoeL%2Fbtsm9hlkq6u%2FUKvsAcRk60nKzWzdk0psT1%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;300&quot; height=&quot;225&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;533&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;그래서 6개의 Material(머티리얼)로 배열을 만들 때 주사위 위치에 맞게 텍스처(주사위 이미지)를 로드해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688998742550&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5.png&quot;)}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2.png&quot;)}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1.png&quot;)}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6.png&quot;)}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3.png&quot;)}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4.png&quot;)})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6개의 면이 다른 텍스처(주사위 이미지)가 되기 위해서 Material(머티리얼) 배열로 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1689000608508&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체와 색상과 질감의 데이터 배열을 결합하여 육면체 객체 생성
const box2 = new THREE.Mesh(box2Geometry, box2Materials);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds2xFS/btsm1S1uH4R/yQYkv2q59jSXzMa2EuNb21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds2xFS/btsm1S1uH4R/yQYkv2q59jSXzMa2EuNb21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds2xFS/btsm1S1uH4R/yQYkv2q59jSXzMa2EuNb21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds2xFS%2Fbtsm1S1uH4R%2FyQYkv2q59jSXzMa2EuNb21%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;2668&quot; height=&quot;1648&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1648&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;두 번째&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;육면체 객체의 모든 면이 주사위 이미지로 변경됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k4XUK/btsm2H6uhyC/5dy42qkVgRkPlVr4AKwpZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k4XUK/btsm2H6uhyC/5dy42qkVgRkPlVr4AKwpZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k4XUK/btsm2H6uhyC/5dy42qkVgRkPlVr4AKwpZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk4XUK%2Fbtsm2H6uhyC%2F5dy42qkVgRkPlVr4AKwpZK%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;2568&quot; height=&quot;1640&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1640&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;2568&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnxpy/btsm8I4PKHr/WNlpakCz6sIF7Oum3K1uU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnxpy/btsm8I4PKHr/WNlpakCz6sIF7Oum3K1uU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnxpy/btsm8I4PKHr/WNlpakCz6sIF7Oum3K1uU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frnxpy%2Fbtsm8I4PKHr%2FWNlpakCz6sIF7Oum3K1uU1%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;2568&quot; height=&quot;1640&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1640&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;2568&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b47u8u/btsm9wCz2Aa/iDnJWZmfX57nhicixbxcj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b47u8u/btsm9wCz2Aa/iDnJWZmfX57nhicixbxcj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b47u8u/btsm9wCz2Aa/iDnJWZmfX57nhicixbxcj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb47u8u%2Fbtsm9wCz2Aa%2FiDnJWZmfX57nhicixbxcj0%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;2568&quot; height=&quot;1640&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1640&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;위에서 말한 것처럼 Material(머티리얼)의 map 속성과 color 속성이 같이 사용하게 되면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Texture(텍스처)의 map color가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;color&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성 값과 결합되어 색이 변경됩니다. map color가 흰색인 경우 color&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성 값이 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Material(머티리얼)에 &lt;/span&gt;기존 color 속성을 추가합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689054251965&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 머티리얼 배열
const box2Materials = [
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice5.png&quot;), color:box2Color}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice2.png&quot;), color:box2Color}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice1.png&quot;), color:box2Color}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice6.png&quot;), color:box2Color}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice3.png&quot;), color:box2Color}),
    new THREE.MeshStandardMaterial({map: box2TextureLoader.load(&quot;resources/textures/dice4.png&quot;), color:box2Color})
];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 새로고침 할 때마다 주사위의 색상이 변경되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2604&quot; data-origin-height=&quot;1722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl6VZZ/btsnalhKChF/9rQA14izq5eBSAvww6kPkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl6VZZ/btsnalhKChF/9rQA14izq5eBSAvww6kPkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl6VZZ/btsnalhKChF/9rQA14izq5eBSAvww6kPkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl6VZZ%2FbtsnalhKChF%2F9rQA14izq5eBSAvww6kPkk%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;2604&quot; height=&quot;1722&quot; data-origin-width=&quot;2604&quot; data-origin-height=&quot;1722&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J6FhX/btsngMZha4t/e4t8WBgDggbQnEck1BGGSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J6FhX/btsngMZha4t/e4t8WBgDggbQnEck1BGGSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J6FhX/btsngMZha4t/e4t8WBgDggbQnEck1BGGSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ6FhX%2FbtsngMZha4t%2Fe4t8WBgDggbQnEck1BGGSK%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;300&quot; height=&quot;77&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흰색이 아닌 다른 색상일 경우 색이 변경되어 보일 겁니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>Dice</category>
      <category>Texture</category>
      <category>texture mapping</category>
      <category>TextureLoader</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/297</guid>
      <comments>https://carrotweb.tistory.com/297#entry297comment</comments>
      <pubDate>Sun, 16 Jul 2023 21:48:42 +0900</pubDate>
    </item>
    <item>
      <title>three.js 객체 결합 - Group</title>
      <link>https://carrotweb.tistory.com/296</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 만든 육면체 객체의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;와이어프레임을 선으로 그린&lt;span&gt; &lt;/span&gt;&lt;/span&gt;라인 세그먼트즈 객체를 육면체 객체와 결합해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체들을 결합하기 위해서 Group(그룹)을 사용하면 됩니다.&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;Group(그룹)은 객체들을 결합시켜 하나의 객체(Object3D)를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 객체를 합치기 전에 육면체 객체(box1)와 라인 세그먼트즈 객체(box1WireframeLine)를 Scence(씬, 장면)에 추가되지 않게 주석처리합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688901341847&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 장면에 육면체 객체 추가
//scene.add(box1);&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1688901351162&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 장면에 라인 세그먼트즈 객체 추가
//scene.add(box1WireframeLine);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LIODe/btsmRMsMjGk/B2FKlwkbIrvsQ9fcmNtbNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LIODe/btsmRMsMjGk/B2FKlwkbIrvsQ9fcmNtbNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LIODe/btsmRMsMjGk/B2FKlwkbIrvsQ9fcmNtbNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLIODe%2FbtsmRMsMjGk%2FB2FKlwkbIrvsQ9fcmNtbNK%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2. 라인 세그먼트즈 객체(box1WireframeLine)의 라인 색상을 붉은색에서 짙은 녹색으로 변경하고 위치(position)를 육면체 객체와 동일하게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688902507596&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 선 색상을 짙은 녹색으로 변경
box1WireframeLine.material.color = new THREE.Color(0x006400);
// 육면체 객체와 결합하기 위해 육면체 객체의 위치를 복사하여 라인 세그먼트즈 객체의 위치 설정
box1WireframeLine.position.copy(box1.position);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lVpMh/btsmQPQ0TlT/oM7kyhKywFUj3WGQdQGn4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lVpMh/btsmQPQ0TlT/oM7kyhKywFUj3WGQdQGn4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lVpMh/btsmQPQ0TlT/oM7kyhKywFUj3WGQdQGn4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlVpMh%2FbtsmQPQ0TlT%2FoM7kyhKywFUj3WGQdQGn4k%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;3. 객체들을 결합하기 위해 Group(그룹)을 생성하고 Group(그룹)에 육면체 객체(box1)와 라인 세그먼트즈 객체(box1WireframeLine)를 추가합니다. 그리고 생성된 Group(그룹)를 Scence(씬, 장면)에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688899778777&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체 객체와 라인 세그먼트즈 객체를 결합하기 위한 육면체 그룹 생성
const box1Group = new THREE.Group();
// 그룹에 육면체 객체 추가
box1Group.add(box1);
// 그룹에 라인 세그먼트즈 객체 추가
box1Group.add(box1WireframeLine);
// 장면에 육면체 그룹 추가
scene.add(box1Group);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2WnWr/btsmQQWJMyn/BfboK9Yzf4GxcbZXw0Rph1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2WnWr/btsmQQWJMyn/BfboK9Yzf4GxcbZXw0Rph1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2WnWr/btsmQQWJMyn/BfboK9Yzf4GxcbZXw0Rph1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2WnWr%2FbtsmQQWJMyn%2FBfboK9Yzf4GxcbZXw0Rph1%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2438&quot; data-origin-height=&quot;1622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/083yq/btsmRrB1zsq/RPKxfLPfZDkVKq75MPh9y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/083yq/btsmRrB1zsq/RPKxfLPfZDkVKq75MPh9y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/083yq/btsmRrB1zsq/RPKxfLPfZDkVKq75MPh9y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F083yq%2FbtsmRrB1zsq%2FRPKxfLPfZDkVKq75MPh9y0%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;2438&quot; height=&quot;1622&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1622&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;4. 라인 세그먼트즈 객체(box1WireframeLine)가 육면체 객체와 결합될 때 투명하게 결합되게 설정을 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Material(머티리얼)의 opacity은 0.0에서 부터 1.0까지 값을 가질 수 있습니다. opacity 값이 낮을수록 더 투명해집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688905008007&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 선이 투명해지게 설정
box1WireframeLine.material.transparent = true;
// 선의 불투명도를 낮게 설정
box1WireframeLine.material.opacity = 0.3;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1cgBI/btsmWkvu0B2/zDAFzkr2MkxuEKewGKmM40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1cgBI/btsmWkvu0B2/zDAFzkr2MkxuEKewGKmM40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1cgBI/btsmWkvu0B2/zDAFzkr2MkxuEKewGKmM40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1cgBI%2FbtsmWkvu0B2%2FzDAFzkr2MkxuEKewGKmM40%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2438&quot; data-origin-height=&quot;1622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNnCAv/btsmWl8WVyT/IZwwQ2rt3LWPFdZsBNTIyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNnCAv/btsmWl8WVyT/IZwwQ2rt3LWPFdZsBNTIyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNnCAv/btsmWl8WVyT/IZwwQ2rt3LWPFdZsBNTIyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNnCAv%2FbtsmWl8WVyT%2FIZwwQ2rt3LWPFdZsBNTIyk%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;2438&quot; height=&quot;1622&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1622&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;5. 육면체 그룹 객체가 회전되게 주석처리된 육면체 객체를 육면체 그룹 객체로 변경하고 주석을 해제시킵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688909302149&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 애니메이팅
function animate() {
    box1Group.rotation.x += 0.01;
    box1Group.rotation.y += 0.01;
    box1Group.rotation.z += 0.01;
    controls.update();
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7EvCF/btsmQCDTb3r/wEtIA49zfjY50KZkBjJHDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7EvCF/btsmQCDTb3r/wEtIA49zfjY50KZkBjJHDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7EvCF/btsmQCDTb3r/wEtIA49zfjY50KZkBjJHDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7EvCF%2FbtsmQCDTb3r%2FwEtIA49zfjY50KZkBjJHDK%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2438&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btCRup/btsmRoSTrTs/bnT7Vy38ziINlkPZeFi2V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btCRup/btsmRoSTrTs/bnT7Vy38ziINlkPZeFi2V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btCRup/btsmRoSTrTs/bnT7Vy38ziINlkPZeFi2V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtCRup%2FbtsmRoSTrTs%2FbnT7Vy38ziINlkPZeFi2V1%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;2438&quot; height=&quot;1620&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&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;구 객체(sphere1)도 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;라인 세그먼트즈&amp;nbsp;&lt;/span&gt;객체(sphere1WireframeLine)와 결합되도록 처리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 구 객체(sphere1)를 Scence(씬, 장면)에 추가되지 않게 주석처리합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688910050059&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 장면에 구 객체 추가
//scene.add(sphere1);&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;2. 라인 세그먼트즈 객체(sphere1WireframeLine)의 라인 색상을 붉은색에서 흰색으로 변경하고 위치(position)를 구 객체와 동일하게 하고 투명하게 결합되게 설정을 추가합니다. 그리고 라인 세그먼트즈 객체(sphere1WireframeLine)를 Scence(씬, 장면)에 추가되지 않게 주석처리합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688910058953&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 선 색상을 짙은 흰색으로 변경
sphere1WireframeLine.material.color = new THREE.Color(0xffffff);
// 선이 투명해지게 설정
sphere1WireframeLine.material.transparent = true;
// 선의 불투명도를 낮게 설정
sphere1WireframeLine.material.opacity = 0.3;
// 구 객체와 결합하기 위해 구 객체의 위치를 복사하여 라인 세그먼트즈 객체의 위치 설정
sphere1WireframeLine.position.copy(sphere1.position);
// 장면에 라인 세그먼트즈 객체 추가
//scene.add(sphere1WireframeLine);&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;3. 객체들을 결합하기 위해 Group(그룹)을 생성하고 Group(그룹)에 구 객체(sphere1)와 라인 세그먼트즈 객체(sphere1WireframeLine)를 추가합니다. 그리고 생성된 Group(그룹)를 Scence(씬, 장면)에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688910233092&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구 객체와 라인 세그먼트즈 객체를 결합하기 위한 구 그룹 생성
const sphere1Group = new THREE.Group();
// 그룹에 구 객체 추가
sphere1Group.add(sphere1);
// 그룹에 라인 세그먼트즈 객체 추가
sphere1Group.add(sphere1WireframeLine);
// 장면에 구 그룹 추가
scene.add(sphere1Group);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldRaC/btsmRpqJXyG/OEkCxGzhWi0kaUFo1RRcT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldRaC/btsmRpqJXyG/OEkCxGzhWi0kaUFo1RRcT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldRaC/btsmRpqJXyG/OEkCxGzhWi0kaUFo1RRcT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FldRaC%2FbtsmRpqJXyG%2FOEkCxGzhWi0kaUFo1RRcT1%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;이제 three.js 사이트의 doc에 있는 예제처럼 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YLBzB/btsmWkWzGaf/MtwRIpAfVSEzQjB9VyBjG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YLBzB/btsmWkWzGaf/MtwRIpAfVSEzQjB9VyBjG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YLBzB/btsmWkWzGaf/MtwRIpAfVSEzQjB9VyBjG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYLBzB%2FbtsmWkWzGaf%2FMtwRIpAfVSEzQjB9VyBjG0%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;2438&quot; height=&quot;1620&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&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;각 객체의 Segments(세그먼트, 분절 수)를 변경시켜 변화되는 모습을 보시기 바랍니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>group</category>
      <category>Object3D</category>
      <category>opacity</category>
      <category>Three.js</category>
      <category>transparent</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/296</guid>
      <comments>https://carrotweb.tistory.com/296#entry296comment</comments>
      <pubDate>Sun, 9 Jul 2023 22:58:12 +0900</pubDate>
    </item>
    <item>
      <title>three.js 와이어 프레임 - WireFrame, WireframeGeometry, LineSegments</title>
      <link>https://carrotweb.tistory.com/295</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;three.js 사이트의 doc에서 Geometry(지오메트리, 기하 도형)들의 설명을 보면 생선 된 객체에 선이 포함되어 있는 것을 볼 수 있습니다. (&lt;a href=&quot;https://threejs.org/docs/index.html#api/en/geometries/BoxGeometry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://threejs.org/docs/index.html#api/en/geometries/BoxGeometry&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;1602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G3YcH/btsmBwvLDXF/5SMwxRtyaqwBGlrDjh5Yf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G3YcH/btsmBwvLDXF/5SMwxRtyaqwBGlrDjh5Yf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G3YcH/btsmBwvLDXF/5SMwxRtyaqwBGlrDjh5Yf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG3YcH%2FbtsmBwvLDXF%2F5SMwxRtyaqwBGlrDjh5Yf1%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;1666&quot; height=&quot;1602&quot; data-origin-width=&quot;1666&quot; data-origin-height=&quot;1602&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 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;2664&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9HYs3/btsmBidmmS0/9ZKQwquTx6GcbycsoLJgkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9HYs3/btsmBidmmS0/9ZKQwquTx6GcbycsoLJgkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9HYs3/btsmBidmmS0/9ZKQwquTx6GcbycsoLJgkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9HYs3%2FbtsmBidmmS0%2F9ZKQwquTx6GcbycsoLJgkk%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;2664&quot; height=&quot;1644&quot; data-origin-width=&quot;2664&quot; data-origin-height=&quot;1644&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것은 바로 WireFrame(와이어프레임)이 객체와 같이 표현된 겁니다.&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;WireFrame(와이어프레임)이란 객체의 모양(구조)을 철사(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Wire, 와이어)를&lt;/span&gt; 사용하여 동일한 모양(Frame, 프레임 - 틀, 구조)으로 만든 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzlVfh/btsplpCkxlt/Ular9oR8NPYNlB3jx4oKUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzlVfh/btsplpCkxlt/Ular9oR8NPYNlB3jx4oKUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzlVfh/btsplpCkxlt/Ular9oR8NPYNlB3jx4oKUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzlVfh%2FbtsplpCkxlt%2FUlar9oR8NPYNlB3jx4oKUK%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;400&quot; height=&quot;218&quot; data-origin-width=&quot;708&quot; data-origin-height=&quot;385&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;여기서 WireFrame(와이어프레임)은 Geometry(지오메트리, 기하 도형)를 구성하는 분할된 면들을 선(Wire)으로 구성한 겁니다.&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;대부분의 Geometry(지오메트리, 기하 도형)는 생성할 때 파라미터 값으로 Segments(세그먼트, 분절 수)를 사용하고 있습니다.&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;BoxGeometry(박스 지오메트리, 육면체)는 widthSegments(수평 세그먼트, 가로 분절 수), heightSegments(수직 세그먼트, 세로 분절 수), depthSegments(깊이 세그먼트, 깊이 분절 수)를 파라미터 값으로 받아 면을 분할합니다.&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;SphereGeometry(스피어 지오메트리, 구) widthSegments(수평&amp;nbsp;세그먼트,&amp;nbsp;가로&amp;nbsp;분절&amp;nbsp;수),&amp;nbsp;heightSegments(수직&amp;nbsp;세그먼트,&amp;nbsp;세로&amp;nbsp;분절&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;그 이유는 WebGLRenderer(렌더러)가 객체를 렌더링 할 때 삼각형을 사용하여 만들기 때문입니다.&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;분할되는 수가 많을수록 부드럽게 구현할 수 있지만 CPU나 GPU의 연산이 많아지기 때문에 성능에 문제가 발생합니다.&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;그럼 이전 육면체 객체와 구 객체를 WireFrame(와이어프레임)으로 보이게 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;객체가 사용하는 &lt;/span&gt;Material(머티리얼)의 wireframe 속성을 true로 설정합니다. (기본적으로 wireframe 속성은 false입니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1688565307245&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const box1Material = new THREE.MeshStandardMaterial({color: 0x00ff00});
box1Material.wireframe = true;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OBUnV/btsmRoyss6p/N2KNAk2fb172161jPITSg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OBUnV/btsmRoyss6p/N2KNAk2fb172161jPITSg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OBUnV/btsmRoyss6p/N2KNAk2fb172161jPITSg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOBUnV%2FbtsmRoyss6p%2FN2KNAk2fb172161jPITSg1%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;pre id=&quot;code_1688566889321&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const sphere1Material = new THREE.MeshStandardMaterial({color: 0x0000ff});
sphere1Material.wireframe = true;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9VbUo/btsmRrop0Ry/LOoO9u6fDWeP3w7haYipk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9VbUo/btsmRrop0Ry/LOoO9u6fDWeP3w7haYipk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9VbUo/btsmRrop0Ry/LOoO9u6fDWeP3w7haYipk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9VbUo%2FbtsmRrop0Ry%2FLOoO9u6fDWeP3w7haYipk0%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;WireFrame(와이어프레임)을 확인하기 위해서 Camera(카메라)의 위치를 육면체 객체에 가깝게 변경합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688565711937&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 위치 변경
//camera.position.set(4, 8, 20);
camera.position.set(1, 2, 3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX72XX/btsm1UplyuC/Lvzb8lH7ZrCKi7LNLzM68K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX72XX/btsm1UplyuC/Lvzb8lH7ZrCKi7LNLzM68K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX72XX/btsm1UplyuC/Lvzb8lH7ZrCKi7LNLzM68K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX72XX%2Fbtsm1UplyuC%2FLvzb8lH7ZrCKi7LNLzM68K%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;pre id=&quot;code_1688565793553&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 애니메이팅
function animate() {
    //box1.rotation.x += 0.01;
    //box1.rotation.y += 0.01;
    //box1.rotation.z += 0.01;
    controls.update();
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrnyw/btsmRpD9AGP/VsWakWDIVkWwwEz1WFbc50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrnyw/btsmRpD9AGP/VsWakWDIVkWwwEz1WFbc50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrnyw/btsmRpD9AGP/VsWakWDIVkWwwEz1WFbc50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwrnyw%2FbtsmRpD9AGP%2FVsWakWDIVkWwwEz1WFbc50%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;그러면 육면체 객체와 구 객체가 WireFrame(와이어프레임)으로 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2462&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhIl7O/btsmyUSzkvm/YD3NW1ehQFWhSeUJDjQOm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhIl7O/btsmyUSzkvm/YD3NW1ehQFWhSeUJDjQOm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhIl7O/btsmyUSzkvm/YD3NW1ehQFWhSeUJDjQOm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhIl7O%2FbtsmyUSzkvm%2FYD3NW1ehQFWhSeUJDjQOm1%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;2462&quot; height=&quot;1630&quot; data-origin-width=&quot;2462&quot; data-origin-height=&quot;1630&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;육면체 객체와 구 객체는 Segments(세그먼트, 분절 수)를 기본값으로 하여 생성하였습니다. 그래서 육면체는 1번이라 분절되지 않았고 구는 가로로 32번, 세로로 16번 분절되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 육면체의 전체 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Segments(세그먼트, 분절 수)를 2번으로 증가시켜 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688567319828&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const box1Geometry = new THREE.BoxGeometry(1, 1, 1, 2, 2, 2);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OCjTq/btsm2HcowSY/btF2wBg4omQ0FfQVfcDp41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OCjTq/btsm2HcowSY/btF2wBg4omQ0FfQVfcDp41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OCjTq/btsm2HcowSY/btF2wBg4omQ0FfQVfcDp41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOCjTq%2Fbtsm2HcowSY%2FbtF2wBg4omQ0FfQVfcDp41%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2462&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKwXpg/btsmzcekQJ4/FzL0kmxrgBG5ta39DVg10k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKwXpg/btsmzcekQJ4/FzL0kmxrgBG5ta39DVg10k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKwXpg/btsmzcekQJ4/FzL0kmxrgBG5ta39DVg10k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKwXpg%2FbtsmzcekQJ4%2FFzL0kmxrgBG5ta39DVg10k%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;2462&quot; height=&quot;1630&quot; data-origin-width=&quot;2462&quot; data-origin-height=&quot;1630&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;육면체의&lt;span&gt; 가로 &lt;/span&gt;&lt;/span&gt;Segments(세그먼트, 분절 수)를 증가시키면 다음처럼 분절됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q62S4/btsmzJ30Rqy/MzEyFKKl06y1cDSRhTXm20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q62S4/btsmzJ30Rqy/MzEyFKKl06y1cDSRhTXm20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q62S4/btsmzJ30Rqy/MzEyFKKl06y1cDSRhTXm20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq62S4%2FbtsmzJ30Rqy%2FMzEyFKKl06y1cDSRhTXm20%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;600&quot; height=&quot;214&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;305&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;육면체의&lt;span&gt; 가로와 세로 &lt;/span&gt;&lt;/span&gt;Segments(세그먼트, 분절 수)를 증가시키면 다음처럼 분절됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yIBSa/btsmAp49L6S/oOqkuLBMqTF1inFTkker00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yIBSa/btsmAp49L6S/oOqkuLBMqTF1inFTkker00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yIBSa/btsmAp49L6S/oOqkuLBMqTF1inFTkker00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyIBSa%2FbtsmAp49L6S%2FoOqkuLBMqTF1inFTkker00%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;600&quot; height=&quot;215&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;306&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 Material(머티리얼)의 wireframe 속성을 true로 설정하면 색상과 질감이 없어집니다.&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;그럼 three.js 사이트의 doc에 있는 예제처럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;색상과 질감이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;유지되면서 WireFrame(와이어프레임)이 보이게 하려면 어떻게 해야 할까요?&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;바로 Geometry(지오메트리, 기하 도형)를 WireFrame(와이어프레임)으로 만들어 주는 WireframeGeometry(와이어프레임 지오메트리)를 사용하면 됩니다.&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;WireframeGeometry(와이어프레임 지오메트리)는 Geometry(지오메트리, 기하 도형)를 WireFrame(와이어프레임)으로 만들어 줍니다. 즉 Geometry(지오메트리, 기하 도형)로 부터 프레임을 만들 정보들을 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688570995494&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WireframeGeometry(geometry : BufferGeometry)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;geometry(지오메트리) : WireFrame(와이어프레임)으로 만들 Geometry(지오메트리, 기하 도형)의 BufferGeometry(버퍼 지오메트리)입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BufferGeometry(버퍼 지오메트리)는 모든 Geometry(지오메트리, 기하 도형) 부모로서 메쉬(Mesh), 선(Line), 점(Point)에 대한 정보를 가지고 있습니다. (다음에 좀 더 알아보겠습니다.)&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;1. 육면체 객체의 Geometry(지오메트리, 기하 도형)를 사용하여 WireframeGeometry(와이어프레임 지오메트리)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688571795711&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체 지오메트리로 와이어프레임 지오메트리 생성
const box1WireframeGeometry = new THREE.WireframeGeometry(box1Geometry);&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;WireframeGeometry(와이어프레임 지오메트리)를 선으로 그리기 위해서는 LineSegments(라인 세그먼트즈)를 사용해야 합니다.&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;LineSegments(라인 세그먼트즈)는 Vertex(버텍스, 꼭짓점, 정점) 정보들로 선을 그려줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688572267228&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;LineSegments(geometry : BufferGeometry, material : Material)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;geometry(지오메트리) : 선을 그릴 Vertex(버텍스, 꼭짓점, 정점) 정보들이 있는 Geometry(지오메트리, 기하 도형)의 BufferGeometry(버퍼 지오메트리)입니다.&lt;/li&gt;
&lt;li&gt;materia(머티리얼) : 선을&amp;nbsp;그리기 위한 머티리얼입니다. 기본값 LineBasicMaterial(라인 베이식 머티리얼) &lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;(입력하지&amp;nbsp;않으면&amp;nbsp;기본값으로&amp;nbsp;설정됩니다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. WireframeGeometry(와이어프레임 지오메트리)를 선으로 그리기 위해 LineSegments(라인 세그먼트즈)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688572101985&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 와이어프레임을 선으로 그리기 위해 라인 세그먼트즈 객체 생성
const box1WireframeLine = new THREE.LineSegments(box1WireframeGeometry);&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;3. LineSegments(라인 세그먼트즈)의 위치를 육면체 객체 오른쪽에 위치시키기 위해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;육면체 객체&lt;span&gt; 위치를 복사한 후 &amp;nbsp;X축에 1을 더해 줍니다. 그리고 Scence(씬,&amp;nbsp;장면)에&amp;nbsp;추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1688572216168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체 객체 오른쪽에 위치 시키기 위해 육면체 위치를 복사하고 X축에 1를 더해 라인 세그먼트즈 객체의 위치 설정
box1WireframeLine.position.copy(box1.position).x += 1;
// 장면에 라인 세그먼트즈 객체 추가
scene.add(box1WireframeLine);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7zaGf/btsmRoLZzuv/DVa3je57d9uKx96JQJzYkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7zaGf/btsmRoLZzuv/DVa3je57d9uKx96JQJzYkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7zaGf/btsmRoLZzuv/DVa3je57d9uKx96JQJzYkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7zaGf%2FbtsmRoLZzuv%2FDVa3je57d9uKx96JQJzYkk%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;그러면 육면체 객체 옆에 WireFrame(와이어프레임)으로 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMac3S/btsmUwitfK1/t3639dK2VKZI9Idsgv3iu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMac3S/btsmUwitfK1/t3639dK2VKZI9Idsgv3iu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMac3S/btsmUwitfK1/t3639dK2VKZI9Idsgv3iu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMac3S%2FbtsmUwitfK1%2Ft3639dK2VKZI9Idsgv3iu1%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;2438&quot; height=&quot;1620&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;육면체 객체와 구 객체의 색상과 질감을 위해 객체가 사용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Material(머티리얼)의 wireframe 속성을 false로 설정하거나 삭제합니다. 저는 삭제하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 &lt;/span&gt;라인의 색상이 흰색(기본값)이라 잘 보이지 않습니다. 그래서 라인의 색상을 붉은색으로 변경하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688575032911&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 선 색상을 붉은색으로 변경
box1WireframeLine.material.color = new THREE.Color(0xff0000);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xEKe5/btsmRqXmiQ9/NRz0m5xdOEckbloWV70H10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xEKe5/btsmRqXmiQ9/NRz0m5xdOEckbloWV70H10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xEKe5/btsmRqXmiQ9/NRz0m5xdOEckbloWV70H10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxEKe5%2FbtsmRqXmiQ9%2FNRz0m5xdOEckbloWV70H10%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2438&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDYTx/btsm1UXcWJh/7bZwPoorP7gfb42nLlMIy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDYTx/btsm1UXcWJh/7bZwPoorP7gfb42nLlMIy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDYTx/btsm1UXcWJh/7bZwPoorP7gfb42nLlMIy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDYTx%2Fbtsm1UXcWJh%2F7bZwPoorP7gfb42nLlMIy1%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;2438&quot; height=&quot;1620&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&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;4. 구 객체도 WireframeGeometry(와이어프레임 지오메트리)으로 LineSegments(라인 세그먼트즈)를 생성하여 구 객체 옆에 위치하도록 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688894165233&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구 지오메트리로 와이어프레임 지오메트리 생성
const sphere1WireframeGeometry = new THREE.WireframeGeometry(sphere1Geometry);
// 와이어프레임을 선으로 그리기 위해 라인 세그먼트즈 객체 생성
const sphere1WireframeLine = new THREE.LineSegments(sphere1WireframeGeometry);
// 선 색상을 붉은색으로 변경
sphere1WireframeLine.material.color = new THREE.Color(0xff0000);
// 구 객체 오른쪽에 위치 시키기 위해 구 위치를 복사하고 X축에 2를 더해 라인 세그먼트즈 객체의 위치 설정
sphere1WireframeLine.position.copy(sphere1.position).x += 2;
// 장면에 라인 세그먼트즈 객체 추가
scene.add(sphere1WireframeLine);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQvLKp/btsm1T43AIZ/KtpohkcaHouYKhQnyxgsc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQvLKp/btsm1T43AIZ/KtpohkcaHouYKhQnyxgsc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQvLKp/btsm1T43AIZ/KtpohkcaHouYKhQnyxgsc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQvLKp%2Fbtsm1T43AIZ%2FKtpohkcaHouYKhQnyxgsc1%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;2668&quot; height=&quot;1644&quot; data-origin-width=&quot;2668&quot; data-origin-height=&quot;1644&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;2438&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s0Brd/btsmQDo8UXv/5RYQAkskrGPKIhti2hxRSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s0Brd/btsmQDo8UXv/5RYQAkskrGPKIhti2hxRSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s0Brd/btsmQDo8UXv/5RYQAkskrGPKIhti2hxRSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs0Brd%2FbtsmQDo8UXv%2F5RYQAkskrGPKIhti2hxRSk%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;2438&quot; height=&quot;1620&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&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;마우스로 이동해서 보시면 WireframeGeometry(와이어프레임 지오메트리)를 입체적으로 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPUWWu/btsmUHRSu1Q/c8rfkvEN4byxW5Rf0lsrgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPUWWu/btsmUHRSu1Q/c8rfkvEN4byxW5Rf0lsrgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPUWWu/btsmUHRSu1Q/c8rfkvEN4byxW5Rf0lsrgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPUWWu%2FbtsmUHRSu1Q%2Fc8rfkvEN4byxW5Rf0lsrgk%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;2438&quot; height=&quot;1620&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1620&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;이어서 객체와 WireframeGeometry(와이어프레임 지오메트리)를 합쳐보겠습니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>LineSegments</category>
      <category>Three.js</category>
      <category>WireFrame</category>
      <category>WireframeGeometry</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/295</guid>
      <comments>https://carrotweb.tistory.com/295#entry295comment</comments>
      <pubDate>Sun, 9 Jul 2023 18:51:46 +0900</pubDate>
    </item>
    <item>
      <title>three.js 조명 시각화, 그림자 잘림 해결 - DirectionalLightHelper, DirectionalLightShadow, OrthographicCamera, CameraHelper</title>
      <link>https://carrotweb.tistory.com/294</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 방향성 조명인 DirectionalLight(디렉셔널 라이트)를 사용하여 객체를 비추도록 하였습니다.&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;가끔씩 DirectionalLight(디렉셔널 라이트)가 어디에 있는지 헷갈릴 때가 있습니다. 그래서 DirectionalLight(디렉셔널 라이트)를 시각화를 해주는 DirectionalLightHelper(디렉셔널 라이트 헬퍼)를 사용하여 어느 위치에서 어느 방향으로 빛의 비추어지는지 확인해 보겠습니다.&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;DirectionalLightHelper(디렉셔널 라이트 헬퍼)는 빛의 위치를 평면으로 빛의 방향을 선으로 구성하여 시각화를 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687685984520&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DirectionalLightHelper(light : DirectionalLight, size : Number, color : Hex)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;light(조명) : 시각화할 조명 객체입니다.&lt;/li&gt;
&lt;li&gt;size(크기) : 평면의 치수(조명의 크기)입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;color(색상) : 시각화에 사용할 색상입니다. 기본값 조명의 색상 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. DirectionalLight(디렉셔널 라이트)를&lt;span&gt; 붉은색으로&amp;nbsp;&lt;/span&gt;&lt;/span&gt;시각화하기 위해서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLightHelper(디렉셔널 라이트 헬퍼)를&lt;/span&gt; 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687686485423&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명을 시각화하여 장면에 표시 
const light1Helper = new THREE.DirectionalLightHelper(light1, 1, 0xff0000);
// 장면에 조명 시각화 객체 추가
scene.add(light1Helper);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duEOec/btslaJdRao7/8GNeSR1gN8r7YwPyP6xfIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duEOec/btslaJdRao7/8GNeSR1gN8r7YwPyP6xfIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duEOec/btslaJdRao7/8GNeSR1gN8r7YwPyP6xfIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduEOec%2FbtslaJdRao7%2F8GNeSR1gN8r7YwPyP6xfIK%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;2660&quot; height=&quot;1640&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&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;그러면 DirectionalLight(디렉셔널 라이트)가 시각화되어 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXA94/btslaIeN6CW/zEnflRmths7vhZ77VfdKi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXA94/btslaIeN6CW/zEnflRmths7vhZ77VfdKi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXA94/btslaIeN6CW/zEnflRmths7vhZ77VfdKi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXA94%2FbtslaIeN6CW%2FzEnflRmths7vhZ77VfdKi0%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;현재 DirectionalLight(디렉셔널 라이트)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;위치(position)가 X축 -1, Y축 1, Z축 1이기 때문에 객체 가까이에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스 왼쪽 버튼을 클릭하고 마우스를 이동해서 보시면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLight(디렉셔널 라이트)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;위치(position)를 입체적으로 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpdrUo/btslaR3UKJN/UsuaCck4yqPLSVY9RVbMU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpdrUo/btslaR3UKJN/UsuaCck4yqPLSVY9RVbMU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpdrUo/btslaR3UKJN/UsuaCck4yqPLSVY9RVbMU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpdrUo%2FbtslaR3UKJN%2FUsuaCck4yqPLSVY9RVbMU1%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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. 색상이 랜덤인 새로운 육면체 객체를 생성하여 Scence(씬,&amp;nbsp;장면)에&amp;nbsp;추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687696893111&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체 지오메트리 생성
const box2Geometry = new THREE.BoxGeometry(1, 1, 1);
// 색상 랜덤
const box2Color = THREE.MathUtils.randInt(0, 0xffffff);
// 육면체에 사용할 색상과 질감의 데이터를 생성
const box2Material = new THREE.MeshStandardMaterial({color: box2Color});
// 육면체와 색상과 질감의 데이터를 결합하여 육면체 객체 생성
const box2 = new THREE.Mesh(box2Geometry, box2Material);
// 육면체에 그림자 생성 활성화
box2.castShadow = true;
// 육면체 위치 변경
box2.position.set(2, 0, 5);
// 장면에 육면체 객체 추가
scene.add(box2);&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;그리고 Camera(카메라)의 위치(position)를 조금 멀어지게 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687697001165&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 위치 변경
camera.position.set(4, 8, 10);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbSKC5/btslbxcYoOb/klKB1poTpf6q14bngSqorK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbSKC5/btslbxcYoOb/klKB1poTpf6q14bngSqorK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbSKC5/btslbxcYoOb/klKB1poTpf6q14bngSqorK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbSKC5%2FbtslbxcYoOb%2FklKB1poTpf6q14bngSqorK%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;2660&quot; height=&quot;1640&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3wzs0/btslbQQ4RGI/9C7dHkb3EjNgniHkqE4uo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3wzs0/btslbQQ4RGI/9C7dHkb3EjNgniHkqE4uo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3wzs0/btslbQQ4RGI/9C7dHkb3EjNgniHkqE4uo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3wzs0%2FbtslbQQ4RGI%2F9C7dHkb3EjNgniHkqE4uo0%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;마우스 왼쪽 버튼을 클릭하고 마우스를 이동해서 봐도 그림자가 잘려 보이는 것을 &lt;/span&gt;확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFwe81/btslboNX03R/TJUGs4zPNlkzUkWDUgusUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFwe81/btslboNX03R/TJUGs4zPNlkzUkWDUgusUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFwe81/btslboNX03R/TJUGs4zPNlkzUkWDUgusUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFwe81%2FbtslboNX03R%2FTJUGs4zPNlkzUkWDUgusUk%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;DirectionalLight(디렉셔널 라이트)의 위치(position)가 객체와 너무 가까이에 있어서 그런 걸까요?&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;DirectionalLight(디렉셔널 라이트)의 위치(position)를 객체로부터 조금 멀어지게 하겠습니다. 그리고 Camera(카메라)의 위치(position)도 변경하여 DirectionalLightHelper(디렉셔널 라이트 헬퍼)가 나오게 하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687697728843&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명 위치 변경
light1.position.set(-10, 10, 10);

// 카메라 위치 변경
camera.position.set(4, 8, 20);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWT0t/btsljTsvlG3/KRkx4KC8XN8wU40AvtUvG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWT0t/btsljTsvlG3/KRkx4KC8XN8wU40AvtUvG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWT0t/btsljTsvlG3/KRkx4KC8XN8wU40AvtUvG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWT0t%2FbtsljTsvlG3%2FKRkx4KC8XN8wU40AvtUvG0%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;2660&quot; height=&quot;1640&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLight(디렉셔널 라이트)의 위치(position)가 멀어져도 &lt;/span&gt;추가된 육면제의 그림자가 잘려서 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OY10U/btslaSokl4q/NiJTreKye01hRXqKadfpOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OY10U/btslaSokl4q/NiJTreKye01hRXqKadfpOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OY10U/btslaSokl4q/NiJTreKye01hRXqKadfpOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOY10U%2FbtslaSokl4q%2FNiJTreKye01hRXqKadfpOk%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8C5Jg/btslbo8kibc/uxEDd0Cmk2CmyoJMsXe5H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8C5Jg/btslbo8kibc/uxEDd0Cmk2CmyoJMsXe5H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8C5Jg/btslbo8kibc/uxEDd0Cmk2CmyoJMsXe5H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8C5Jg%2Fbtslbo8kibc%2FuxEDd0Cmk2CmyoJMsXe5H1%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 조명의 그림자를 계산하는 데 사용되는 DirectionalLightShadow(디렉셔널 라이트 쉐도우)에서 사용하는&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라) &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;영역의&lt;/span&gt;&amp;nbsp;크기가 작기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLightShadow(디렉셔널 라이트 쉐도우)&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Camera(카메라)는 OrthographicCamera(오쏘그래픽 카메라)를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OrthographicCamera(오쏘그래픽 카메라)는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;원근법이 적용되지 않는&lt;span&gt; 카메라입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687702880792&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;OrthographicCamera(left : Number, right : Number, top : Number, bottom : Number, near : Number, far : Number)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;left(왼쪽) : 카메라 프러스텀 평면 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;왼쪽 위치입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;right(오른쪽) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;카메라&lt;span&gt;&amp;nbsp;&lt;/span&gt;프러스텀 평면&lt;span&gt; 오른쪽 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;위치입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;top(위쪽) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;카메라&lt;span&gt;&amp;nbsp;&lt;/span&gt;프러스텀 평면&lt;span&gt; 위쪽 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;위치입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;bottom(아래쪽) :&lt;span&gt;&amp;nbsp;&lt;/span&gt;카메라&lt;span&gt;&amp;nbsp;&lt;/span&gt;프러스텀 평면&lt;span&gt; 아래쪽 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;위치입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;near(니어) : &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;카메라부터&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;가까운&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;카메라&lt;span&gt;&amp;nbsp;&lt;/span&gt;프러스텀 평면&lt;span&gt;&lt;span&gt; 거리입니&lt;/span&gt;&lt;/span&gt;다. 기본값&amp;nbsp;0.1&amp;nbsp;(입력하지&amp;nbsp;않으면&amp;nbsp;기본값으로&amp;nbsp;설정됩니다.)&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;far(파) : 카메라부터 먼 &lt;/span&gt;카메라&lt;span&gt;&amp;nbsp;&lt;/span&gt;프러스텀 평면&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;거리입니&lt;/span&gt;&lt;/span&gt;다. 기본값 2000 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nOeDK/btsmUJIWm6k/UyLLWEZBsFIA3ZpOjCF071/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nOeDK/btsmUJIWm6k/UyLLWEZBsFIA3ZpOjCF071/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nOeDK/btsmUJIWm6k/UyLLWEZBsFIA3ZpOjCF071/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnOeDK%2FbtsmUJIWm6k%2FUyLLWEZBsFIA3ZpOjCF071%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;500&quot; height=&quot;327&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;398&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;투영된 형태(정사영)로 촬영할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원근법이 적용되지 않는 OrthographicCamera(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오쏘그래픽&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;카메라)를 사용하는 이유는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;DirectionalLight(디렉셔널 라이트)의 빛이 평행하게 비추기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;기본적으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLightShadow(디렉셔널 라이트 쉐도우)에서 사용하는&amp;nbsp;&lt;/span&gt;Camera(카메라)의 영역은 카메라의 중앙을 기준으로&lt;span&gt; l&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;eft(왼쪽)은 -5, Right(오른쪽)은 5, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Top(위쪽)은 5,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Bottom(아래쪽)은 -5,&lt;span&gt;&amp;nbsp;&lt;/span&gt;near(니어)는 0.5,&lt;span&gt;&amp;nbsp;&lt;/span&gt;far(파)는 500입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvpycm/btsmUuLJxWu/V4QjEdv5NyYkDlaQmh8KXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvpycm/btsmUuLJxWu/V4QjEdv5NyYkDlaQmh8KXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvpycm/btsmUuLJxWu/V4QjEdv5NyYkDlaQmh8KXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvpycm%2FbtsmUuLJxWu%2FV4QjEdv5NyYkDlaQmh8KXk%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;400&quot; height=&quot;257&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;391&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;DirectionalLightShadow(디렉셔널 라이트 쉐도우)는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLight(디렉셔널 라이트)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Shadow(쉐도우) 속성으로 콘솔 로그로 확인해 보면 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687701033563&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(light1.shadow);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chKpee/btslaGg7fLs/D9swsi6ifqehhw75tk1ywk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chKpee/btslaGg7fLs/D9swsi6ifqehhw75tk1ywk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chKpee/btslaGg7fLs/D9swsi6ifqehhw75tk1ywk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchKpee%2FbtslaGg7fLs%2FD9swsi6ifqehhw75tk1ywk%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLightShadow(디렉셔널 라이트 쉐도우)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)를 시각화하여 그림자가 그려지는 &lt;/span&gt;영역의 크기를 확인해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CameraHelper(카메라 헬퍼)는 카메라의 위치를 평면으로 영역은 선으로 구성하여 시각화를 해줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687701547107&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CameraHelper(camera : Camera)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;camera(카메라) : 시각화할 카메라 객체입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. Camera(카메라)를&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;시각화하기 위해서&lt;span&gt;&amp;nbsp;CameraHelper(카메라 헬퍼)&lt;/span&gt;&lt;/span&gt;를&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687701688305&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명의 그림자 카메라를 시각화하여 장면에 표시 
const light1ShadowCameraHelper = new THREE.CameraHelper(light1.shadow.camera);
// 장면에 조명의 그림자 카메라 시각화 객체 추가
scene.add(light1ShadowCameraHelper);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmY0PD/btslqh7pux1/BLQT8DasDxArwDK5iykFc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmY0PD/btslqh7pux1/BLQT8DasDxArwDK5iykFc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmY0PD/btslqh7pux1/BLQT8DasDxArwDK5iykFc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmY0PD%2Fbtslqh7pux1%2FBLQT8DasDxArwDK5iykFc1%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;2660&quot; height=&quot;1640&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면 DirectionalLight(디렉셔널 라이트)의 위치(position)에&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Camera(카메라)가 시각화되어 나타나고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)의&lt;span&gt; &lt;/span&gt;&lt;/span&gt;영역이 선으로 표시됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sE6Gp/btsla00LeAl/mGYgNarEkgfjQEdZ7HZQB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sE6Gp/btsla00LeAl/mGYgNarEkgfjQEdZ7HZQB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sE6Gp/btsla00LeAl/mGYgNarEkgfjQEdZ7HZQB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsE6Gp%2Fbtsla00LeAl%2FmGYgNarEkgfjQEdZ7HZQB1%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;마우스 왼쪽 버튼을 클릭하고 마우스를 이동해서 보면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)의&lt;span&gt; &lt;/span&gt;&lt;/span&gt;영역 안에만 그림자가 나타나는 것을 &lt;/span&gt;확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bACzd1/btslffCOYWt/VQsXKNcVV214PRYi9D63TK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bACzd1/btslffCOYWt/VQsXKNcVV214PRYi9D63TK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bACzd1/btslffCOYWt/VQsXKNcVV214PRYi9D63TK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbACzd1%2FbtslffCOYWt%2FVQsXKNcVV214PRYi9D63TK%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;DirectionalLightShadow(디렉셔널 라이트 쉐도우)에서 사용하는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)&lt;span&gt;&amp;nbsp;&lt;/span&gt;영역의 크기가 작아 그림자가 생성되는 부분도 작아져서 그림자가 잘린 겁니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그럼 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DirectionalLightShadow(디렉셔널 라이트 쉐도우)에서 사용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)&lt;span&gt;&amp;nbsp;&lt;/span&gt;영역의 크기를 조절하여 그림자가 나오도록 하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;4. Camera(카메라)&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;영역을 변경합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687705945499&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명의 그림자 카메라 영역 크기 변경
light1.shadow.camera.left = -60;
light1.shadow.camera.right = 60;
light1.shadow.camera.top = 60;
light1.shadow.camera.bottom = -60;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkAbJU/btslffCRYE2/rIAp7QDsPKQAuZKy7EH1Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkAbJU/btslffCRYE2/rIAp7QDsPKQAuZKy7EH1Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkAbJU/btslffCRYE2/rIAp7QDsPKQAuZKy7EH1Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkAbJU%2FbtslffCRYE2%2FrIAp7QDsPKQAuZKy7EH1Jk%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;2660&quot; height=&quot;1640&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면 DirectionalLightShadow(디렉셔널 라이트 쉐도우)에서 사용하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Camera(카메라)&lt;span&gt;&amp;nbsp;&lt;/span&gt;영역이 커져서 나타나고 객채의 그림자가 나타납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBwIiC/btslneJUwOW/vHQ1kGnhkTrj07YfV2ict0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBwIiC/btslneJUwOW/vHQ1kGnhkTrj07YfV2ict0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBwIiC/btslneJUwOW/vHQ1kGnhkTrj07YfV2ict0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBwIiC%2FbtslneJUwOW%2FvHQ1kGnhkTrj07YfV2ict0%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFWchD/btslaRQwLiF/1MKPUyu07KJ8GhROlHaRH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFWchD/btslaRQwLiF/1MKPUyu07KJ8GhROlHaRH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFWchD/btslaRQwLiF/1MKPUyu07KJ8GhROlHaRH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFWchD%2FbtslaRQwLiF%2F1MKPUyu07KJ8GhROlHaRH1%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/taEwH/btslbxxeTdR/RjRXi6w5pIeinCTr5LZS90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/taEwH/btslbxxeTdR/RjRXi6w5pIeinCTr5LZS90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/taEwH/btslbxxeTdR/RjRXi6w5pIeinCTr5LZS90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtaEwH%2FbtslbxxeTdR%2FRjRXi6w5pIeinCTr5LZS90%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(Camera(카메라) 영역은 원하시는 크기만큼 변경하시기 바랍니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만 줌(Zoom)하여 객체를 보면 그림자가 흐릿하게 보이는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byp9Ys/btsldOyvC9a/HClg9CBkjKEpjZs285a3r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byp9Ys/btsldOyvC9a/HClg9CBkjKEpjZs285a3r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byp9Ys/btsldOyvC9a/HClg9CBkjKEpjZs285a3r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyp9Ys%2FbtsldOyvC9a%2FHClg9CBkjKEpjZs285a3r1%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&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;그 이유는 그림자 맵의 크기(mapSize)가 작기 때문입니다.&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;기본적인 그림자 맵의 넓이(width)와 높이(height)는 각각 512입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1688297672981&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(light1.shadow.mapSize);

--&amp;gt; Vector2&amp;nbsp;{x: 512, y: 512}&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;5. 그림자가 선명하게 처리되게 DirectionalLightShadow(디렉셔널 라이트 쉐도우)의 맵 크기를 크게 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687707041879&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명의 그림자 맵 크기 변경
light1.shadow.mapSize.width = 3000;
light1.shadow.mapSize.height = 3000;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAMVUo/btslfejD7Jw/cTA3CxxnGjLG3MUNM4vPX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAMVUo/btslfejD7Jw/cTA3CxxnGjLG3MUNM4vPX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAMVUo/btslfejD7Jw/cTA3CxxnGjLG3MUNM4vPX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAMVUo%2FbtslfejD7Jw%2FcTA3CxxnGjLG3MUNM4vPX0%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;2660&quot; height=&quot;1640&quot; data-origin-width=&quot;2660&quot; data-origin-height=&quot;1640&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;2568&quot; data-origin-height=&quot;1652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O4Xyx/btsljSUFkV1/36dqg3pjjTVHp1s7AxtOD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O4Xyx/btsljSUFkV1/36dqg3pjjTVHp1s7AxtOD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O4Xyx/btsljSUFkV1/36dqg3pjjTVHp1s7AxtOD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO4Xyx%2FbtsljSUFkV1%2F36dqg3pjjTVHp1s7AxtOD0%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;2568&quot; height=&quot;1652&quot; data-origin-width=&quot;2568&quot; data-origin-height=&quot;1652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(다만, 맵 크기가 커질수록 랜더링에 필요한 자원이 많이 사용되기 때문에 적절한 크기로 사용하시길 바랍니다.)&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>CameraHelper</category>
      <category>DirectionalLightHelper</category>
      <category>DirectionalLightShadow</category>
      <category>frustum</category>
      <category>OrthographicCamera</category>
      <category>shadow.camera</category>
      <category>shadow.mapSize</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/294</guid>
      <comments>https://carrotweb.tistory.com/294#entry294comment</comments>
      <pubDate>Mon, 26 Jun 2023 00:49:36 +0900</pubDate>
    </item>
    <item>
      <title>three.js 카메라 컨트롤 - OrbitControls</title>
      <link>https://carrotweb.tistory.com/293</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;OrbitControls(오빗&lt;/span&gt; 컨트롤, 궤도 컨트롤)은 Scence(씬, 장면)의 중앙을 기준으로 카메라의 초점(position)에서 수직(상/하), 수평(좌/우)으로 회전&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;확대/축소를 할 수 있습니다. 그리고 카메라의 초점(position)도 이동할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. import를 통해 OrbitControls(오빗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컨트롤,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;궤도 컨트롤) 모듈을 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687073986454&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { OrbitControls } from 'three/addons/controls/OrbitControls.js';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bav3jb/btskgqT3LRj/F7vOy8brod1qwTxSJuhk9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bav3jb/btskgqT3LRj/F7vOy8brod1qwTxSJuhk9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bav3jb/btskgqT3LRj/F7vOy8brod1qwTxSJuhk9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbav3jb%2FbtskgqT3LRj%2FF7vOy8brod1qwTxSJuhk9k%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;2658&quot; height=&quot;1640&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&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;OrbitControls 모듈의 위치는 node_modules에서 three의 package.json 파일을 보면 &quot;./examples/jsm/*&quot;이 &quot;./addons/*&quot;으로도 exports 된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687074426124&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;exports&quot;: {
  &quot;.&quot;: {
    &quot;import&quot;: &quot;./build/three.module.js&quot;,
    &quot;require&quot;: &quot;./build/three.cjs&quot;
  },
  &quot;./examples/fonts/*&quot;: &quot;./examples/fonts/*&quot;,
  &quot;./examples/jsm/*&quot;: &quot;./examples/jsm/*&quot;,
  &quot;./addons/*&quot;: &quot;./examples/jsm/*&quot;,
  &quot;./src/*&quot;: &quot;./src/*&quot;,
  &quot;./nodes&quot;: &quot;./examples/jsm/nodes/Nodes.js&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9ojDO/btskhcgr2v9/KhHSx1SYCjkFKEvzxGffY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9ojDO/btskhcgr2v9/KhHSx1SYCjkFKEvzxGffY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9ojDO/btskhcgr2v9/KhHSx1SYCjkFKEvzxGffY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9ojDO%2Fbtskhcgr2v9%2FKhHSx1SYCjkFKEvzxGffY0%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;2658&quot; height=&quot;1640&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&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;즉, OrbitControls 모듈의 실제 위치는 &quot;\node_modules\three\examples\jsm\controls\OrbitControls.js&quot; 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cplcFz/btskiyDj9p1/MuRqI8W9YKMPKORulKhPS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cplcFz/btskiyDj9p1/MuRqI8W9YKMPKORulKhPS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cplcFz/btskiyDj9p1/MuRqI8W9YKMPKORulKhPS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcplcFz%2FbtskiyDj9p1%2FMuRqI8W9YKMPKORulKhPS0%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;2658&quot; height=&quot;1640&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&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;2. OrbitControls(오빗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컨트롤,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;궤도 컨트롤)을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687078042913&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;OrbitControls(object : Camera, domElement : HTMLDOMElement)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;object(객체) : 제어할 카메라 객체입니다.&lt;/li&gt;
&lt;li&gt;domElement(돔 엘리먼트): 랜더러가 렌더링 한 결과의 HTML&amp;nbsp;엘리먼트입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라 객체와 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;랜더러가 렌더링 한 결과의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;HTML 엘리먼트를 사용하여 OrbitControls을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687077793632&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 컨트롤 생성
const controls = new OrbitControls(camera, renderer.domElement);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfPbi6/btsknPkb61s/ba8BBM5ZEScq8V2kkw3X1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfPbi6/btsknPkb61s/ba8BBM5ZEScq8V2kkw3X1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfPbi6/btsknPkb61s/ba8BBM5ZEScq8V2kkw3X1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfPbi6%2FbtsknPkb61s%2Fba8BBM5ZEScq8V2kkw3X1k%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;2658&quot; height=&quot;1640&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&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;3. OrbitControls(오빗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컨트롤,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;궤도 컨트롤)을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;업데이트합니다. OrbitControls(오빗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컨트롤,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;궤도 컨트롤)은 렌더링 전에 실행되어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687077950774&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 애니메이팅
function animate() {
    box1.rotation.x += 0.01;
    box1.rotation.y += 0.01;
    box1.rotation.z += 0.01;
    controls.update();
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJEy8i/btskigQsaFE/7diLfzwzMU2zx55zi4cYMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJEy8i/btskigQsaFE/7diLfzwzMU2zx55zi4cYMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJEy8i/btskigQsaFE/7diLfzwzMU2zx55zi4cYMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJEy8i%2FbtskigQsaFE%2F7diLfzwzMU2zx55zi4cYMk%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;2658&quot; height=&quot;1640&quot; data-origin-width=&quot;2658&quot; data-origin-height=&quot;1640&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;OrbitControls(오빗&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;컨트롤,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;궤도 컨트롤)은 마우스와 터치로 컨트롤됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Orbit(오빗, 궤도, &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;회전&lt;/span&gt;)은 마우스 왼쪽 버튼을 클릭하고 상/하(수직), 좌/우(수평)로 이동하면 카메라 초점을 중심으로 회전하게 됩니다.&amp;nbsp; 터치는 한 손가락으로 화면을 터치한 후 상/하(수직), 좌/우(수평)로 이동하면 카메라 초점을 중심으로 회전하게 됩니다.&lt;/li&gt;
&lt;li&gt;Zoom(줌, 확대/축소)은 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;마우스의 스크롤 휠을 위로 스크롤하면 카메라 초점을 중심으로 확대되고 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;스크롤 휠을 아래로 스크롤하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;카메라 초점을 중심으로 축소가 됩니다. 터치는 두 손가락으로 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;화면을 터치한 후 손가락 사이를 펼치면 초&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;점을 중심으로 확대되고&lt;span&gt; 손가락 사이를 붙이면 카메라 초점을 중심으로 축소가 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Pan(팬)은 마우스 오른쪽 버튼을 클릭하고 상/하(수직), 좌/우(수평)로 이동하면 카메라 초점이 이동됩니다. 또는 키보드의 Ctrl이나 Shift를 누른 상태에서 마우스 왼쪽 버튼을 클릭하고 상/하(수직), 좌/우(수평)로 이동하면 카메라 초점이 이동됩니다. &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;터치는&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;두 손가락으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;화면을 터치한 후&lt;span&gt; 두 손가락을 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;상/하(수직), 좌/우(수평)로 이동하면 카메라 초점이 이동됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스 왼쪽 버튼을 클릭하고 왼쪽으로 이동하면 카메라가 Y축 중심으로 시계 방향으로 회전합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zSrzJ/btskrmB2BkZ/0UPjDcDV9QOtPEPI3MrziK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zSrzJ/btskrmB2BkZ/0UPjDcDV9QOtPEPI3MrziK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zSrzJ/btskrmB2BkZ/0UPjDcDV9QOtPEPI3MrziK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzSrzJ%2FbtskrmB2BkZ%2F0UPjDcDV9QOtPEPI3MrziK%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;마우스 왼쪽 버튼을 클릭하고 오른쪽으로 이동하면 카메라가 Y축 중심으로 시계 반대 방향으로 회전합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv8mpl/btskgq0TK7j/HvsnjYuhvZIT1naG3E4Z7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv8mpl/btskgq0TK7j/HvsnjYuhvZIT1naG3E4Z7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv8mpl/btskgq0TK7j/HvsnjYuhvZIT1naG3E4Z7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv8mpl%2Fbtskgq0TK7j%2FHvsnjYuhvZIT1naG3E4Z7k%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;마우스 왼쪽 버튼을 클릭하고 위쪽으로 이동하면 카메라가 X축 중심으로 위로 회전합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPcp6H/btskiTAHNRL/JfNPkiLCdtet6xdsVj9Mh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPcp6H/btskiTAHNRL/JfNPkiLCdtet6xdsVj9Mh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPcp6H/btskiTAHNRL/JfNPkiLCdtet6xdsVj9Mh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPcp6H%2FbtskiTAHNRL%2FJfNPkiLCdtet6xdsVj9Mh0%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;마우스 왼쪽 버튼을 클릭하고 아래쪽으로 이동하면 카메라가 X축 중심으로 아래로 회전합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMubOk/btskgeeNWfM/SdJ6RMIGVz3yljKOtnQAKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMubOk/btskgeeNWfM/SdJ6RMIGVz3yljKOtnQAKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMubOk/btskgeeNWfM/SdJ6RMIGVz3yljKOtnQAKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMubOk%2FbtskgeeNWfM%2FSdJ6RMIGVz3yljKOtnQAKK%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ts6eG/btskuOLObXG/ECAkAkPfJNwp2yMB4c7140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ts6eG/btskuOLObXG/ECAkAkPfJNwp2yMB4c7140/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ts6eG/btskuOLObXG/ECAkAkPfJNwp2yMB4c7140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTs6eG%2FbtskuOLObXG%2FECAkAkPfJNwp2yMB4c7140%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FDbLD/btsklnuKXrf/BqjJFbFrtJRlWJDulGHukK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FDbLD/btsklnuKXrf/BqjJFbFrtJRlWJDulGHukK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FDbLD/btsklnuKXrf/BqjJFbFrtJRlWJDulGHukK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFDbLD%2FbtsklnuKXrf%2FBqjJFbFrtJRlWJDulGHukK%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;마우스 오른쪽 버튼을 클릭하고 왼쪽으로 이동하면 카메라의 X 위치가 오른쪽으로 이동됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tB1Ue/btskfsqRG24/nUsmhIMGoMsvgNvegTMOP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tB1Ue/btskfsqRG24/nUsmhIMGoMsvgNvegTMOP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tB1Ue/btskfsqRG24/nUsmhIMGoMsvgNvegTMOP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtB1Ue%2FbtskfsqRG24%2FnUsmhIMGoMsvgNvegTMOP0%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&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;마우스 오른쪽 버튼을 클릭하고 오른쪽으로 이동하면 카메라의 X 위치가 왼쪽으로 이동됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xp21N/btskrmhJBUf/moIYJenD338JVyjsRBbdq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xp21N/btskrmhJBUf/moIYJenD338JVyjsRBbdq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xp21N/btskrmhJBUf/moIYJenD338JVyjsRBbdq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxp21N%2FbtskrmhJBUf%2FmoIYJenD338JVyjsRBbdq1%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;2518&quot; height=&quot;1604&quot; data-origin-width=&quot;2518&quot; data-origin-height=&quot;1604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>Orbit</category>
      <category>OrbitControls</category>
      <category>pan</category>
      <category>Three.js</category>
      <category>zoom</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/293</guid>
      <comments>https://carrotweb.tistory.com/293#entry293comment</comments>
      <pubDate>Sun, 18 Jun 2023 18:18:19 +0900</pubDate>
    </item>
    <item>
      <title>three.js 그림자 만들기 - shadowMap, castShadow, receiveShadow</title>
      <link>https://carrotweb.tistory.com/292</link>
      <description>&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;Scence(씬, 장면)에 추가할 바닥으로 PlaneGeometry(플레인 지오메트리, 평면)을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686997379275&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PlaneGeometry(width : Float, height : Float, widthSegments : Integer, heightSegments : Integer)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;width(가로, 너비, 폭) : 평면의 가로길이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;height(세로, 높이) : 평면의 세로길이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;widthSegments(수평 세그먼트, 가로 분절 수) : 가로를 분할 면의 수입니다. 기본값 1(입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;heightSegments(수직 세그먼트, 세로 분절 수) : 세로를 분할 면의 수입니다.&amp;nbsp; 기본값 1(입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가로, 세로가 10인 PlaneGeometry(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;플레인 지오메트리,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;평면)를 생성하고 색상이 흰색인 Material(머티리얼)을 생성하여 평면 객체를 생성하고 Scence(씬, 장면)에 추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeshLambertMaterial(메쉬 램버트 머티리얼)은 반사 하이라이트가 없는 재질로 렌더링 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686997157446&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 평면 지오메트리 생성
const plane1Geometry = new THREE.PlaneGeometry(10, 10);
// 반사 하이라이트가 없는 재질
const plane1Material = new THREE.MeshLambertMaterial({color:0xffffff});
// 평면 지오메트리와 메쉬 램버트 머티리얼을 결합하여 평면 객체 생성
const plane1 = new THREE.Mesh(plane1Geometry, plane1Material);
// 장면에 평면 객체 추가
scene.add(plane1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btbxmo/btskha3F8SW/0ZPvsfItffRvn5KhVttN9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btbxmo/btskha3F8SW/0ZPvsfItffRvn5KhVttN9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btbxmo/btskha3F8SW/0ZPvsfItffRvn5KhVttN9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbtbxmo%2Fbtskha3F8SW%2F0ZPvsfItffRvn5KhVttN9k%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;2650&quot; height=&quot;1636&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1636&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;2618&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjBT9a/btskguuAQbu/z33HQahevSwVp1Xcww987k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjBT9a/btskguuAQbu/z33HQahevSwVp1Xcww987k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjBT9a/btskguuAQbu/z33HQahevSwVp1Xcww987k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjBT9a%2FbtskguuAQbu%2Fz33HQahevSwVp1Xcww987k%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;2618&quot; height=&quot;1616&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&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;그래서 평면 객체의 X축을 -90도 회전시켜 눕힙니다. 그리고 평면 객체의 위치(position)를 아래로 이동시킵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687002734436&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 평면 객체를 바닥처럼 눕히기 위해 X축을 90도 회전 시킵니다.
plane1.rotation.x = Math.PI * -0.5; // (Math.PI/180) * -90;
// 평면 객체를 중앙에서 아래로 위치 설정
plane1.position.set(0, -1, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8bmZ/btskge6CcQl/QED86jOkMNs8jdsbAzlxzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8bmZ/btskge6CcQl/QED86jOkMNs8jdsbAzlxzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8bmZ/btskge6CcQl/QED86jOkMNs8jdsbAzlxzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8bmZ%2Fbtskge6CcQl%2FQED86jOkMNs8jdsbAzlxzK%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;2650&quot; height=&quot;1636&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1636&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;2618&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6pcGP/btskiSIbCTW/OSzcXv9npdxkmVT40mU6sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6pcGP/btskiSIbCTW/OSzcXv9npdxkmVT40mU6sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6pcGP/btskiSIbCTW/OSzcXv9npdxkmVT40mU6sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6pcGP%2FbtskiSIbCTW%2FOSzcXv9npdxkmVT40mU6sk%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;2618&quot; height=&quot;1616&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;그림자(Shadow) 기능 활성화 하기&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;그림자를 만들기 위해서는 렌더러(Renderer)와 조명, 생선 된 객체에 그림자 생성 기능이 활성화되어야 합니다. 그리고 그림자가 표현될 객체에 그림자 받기 기능이 활성화되어야 합니다.&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;렌더러(Renderer)에서 그림자를 만들기 위해서는 shadowMap 속성이 활성화(shadowMap.enabled = true) 되어야 합니다. 기본적으로 비활성화되어 있습니다. (shadowMap.enabled = false)&lt;/p&gt;
&lt;pre id=&quot;code_1687004918985&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 렌더러에 그림자 맵 활성화
renderer.shadowMap.enabled = true;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더러(Renderer)는 기본적으로 PCFShadowMap를 사용하여 그림자를 랜더링 합니다.&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;렌더러(Renderer)의 그림자 타입&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BasicShadowMap : 필터링이 적용되지 않은 그림자 맵 (빠르지만 품질이 가장 낮습니다.)&lt;/li&gt;
&lt;li&gt;PCFShadowMap : Percentage-Closer Filtering(PCF, 퍼센티지-클로저 필터링)을 사용한 그림자 맵 (그림자 경계에서 보이는 에일리어싱(Aliasing, 일그러짐) 문제를 해결)&lt;/li&gt;
&lt;li&gt;PCFSoftShadowMap : PCF에서 발전된 기능을 사용한 그림자 맵 (반그림자(penumbra) 영역을 좀 더 부드럽게 처리, 그림자가 생성될 객체와 그림자가 표현될 객체의 거리에 따른 그림자 처리)&lt;/li&gt;
&lt;li&gt;VSMShadowMap : Variance Shadow Map(VSM)을 사용한 그림자 맵&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터의 크기가 커질수록에 계산 속도가 느려지기 단점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부드러운 그림자를 만들기 위해 렌더러(Renderer)의 그림자 타입을 PCFSoftShadowMap으로 설정하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687009561215&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 렌더러에 그림자 맵 활성화
renderer.shadowMap.enabled = true;
// 렌더러에 그림자 맵 타입 설정
renderer.shadowMap.type = THREE.PCFSoftShadowMap;&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;그림자가 만들어지기 위해서는 조명과 객체에 그림자 생성 기능인 castShadow(캐스트 쉐도우)가 활성화&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;되어야 합니다. 기본적으로 비활성화되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1687003792519&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 조명에 그림자 생성 활성화
light1.castShadow = true;
			
// 육면체에 그림자 생성 활성화
box1.castShadow = true;
// 구에 그림자 생성 활성화
sphere1.castShadow = true;&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;그리고 그림자가 표현될 객체에는 그림자를 받기 위해서 receiveShadow(리시브&amp;nbsp;쉐도우)가 활성화되어야 합니다. 기본적으로 비활성화되어 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687010199783&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 평면에 그림자 받기 활성화
plane1.receiveShadow = true;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edSXsN/btskifKnNHz/zuahaoKD6qGf89CMXQjz00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edSXsN/btskifKnNHz/zuahaoKD6qGf89CMXQjz00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edSXsN/btskifKnNHz/zuahaoKD6qGf89CMXQjz00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedSXsN%2FbtskifKnNHz%2FzuahaoKD6qGf89CMXQjz00%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;2650&quot; height=&quot;1636&quot; data-origin-width=&quot;2650&quot; data-origin-height=&quot;1636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림자 기은 설정은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Scence(씬, 장면)에&lt;span&gt; 추가하기 전이나 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;렌더러(Renderer)가 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;랜더 하기 전에 추가되어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;평면 객체에 그림자가 만들어진 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FEuMk/btskifp5GCw/92PQ1K99YkoyG4Wiwgz6a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FEuMk/btskifp5GCw/92PQ1K99YkoyG4Wiwgz6a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FEuMk/btskifp5GCw/92PQ1K99YkoyG4Wiwgz6a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFEuMk%2Fbtskifp5GCw%2F92PQ1K99YkoyG4Wiwgz6a0%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;2618&quot; height=&quot;1616&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&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;그림자가 다 보이게 평면 객체의 위치(position)를 조정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687011287393&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 평면 객체를 중앙에서 아래로 위치 설정
plane1.position.set(1, -1, -3);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tOmKZ/btskgfLd5Ox/6lKJeVigpEmZqj6o31UQDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tOmKZ/btskgfLd5Ox/6lKJeVigpEmZqj6o31UQDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tOmKZ/btskgfLd5Ox/6lKJeVigpEmZqj6o31UQDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtOmKZ%2FbtskgfLd5Ox%2F6lKJeVigpEmZqj6o31UQDk%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;2618&quot; height=&quot;1616&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&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;또는 평면 객체의 가로, 세로가 10에서 100으로 조정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687011355524&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 평면 지오메트리 생성
const plane1Geometry = new THREE.PlaneGeometry(100, 100);
:
// 평면 객체를 중앙에서 아래로 위치 설정
plane1.position.set(0, -1, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDGkaS/btskk76bUby/5hnttYLW3UK3JuqhDtnzX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDGkaS/btskk76bUby/5hnttYLW3UK3JuqhDtnzX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDGkaS/btskk76bUby/5hnttYLW3UK3JuqhDtnzX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDGkaS%2Fbtskk76bUby%2F5hnttYLW3UK3JuqhDtnzX0%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;2618&quot; height=&quot;1616&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;저는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;평면 객체의 가로, 세로를 조정하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DirectionalLight(디렉셔널 라이트)의 위치(position)가 멀어질 수 록 객체들의 그림자가 달라집니다.&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;DirectionalLight(디렉셔널 라이트)의 위치(position)를 왼쪽으로 더 이동(X축 -1에서 -5로 이동)시키면 그림자가 길어지게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1687011591952&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명
const light1 = new THREE.DirectionalLight(0xffffff, 1);
light1.position.set(-5, 1, 1);
scene.add(light1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGbkjL/btsklmWARr5/WGVTLF5jjQfC33c4ojMTk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGbkjL/btsklmWARr5/WGVTLF5jjQfC33c4ojMTk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGbkjL/btsklmWARr5/WGVTLF5jjQfC33c4ojMTk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGbkjL%2FbtsklmWARr5%2FWGVTLF5jjQfC33c4ojMTk0%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;2618&quot; height=&quot;1616&quot; data-origin-width=&quot;2618&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>castShadow</category>
      <category>PCFSoftShadowMap</category>
      <category>PlaneGeometry</category>
      <category>receiveShadow</category>
      <category>shadow</category>
      <category>shadowMap</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/292</guid>
      <comments>https://carrotweb.tistory.com/292#entry292comment</comments>
      <pubDate>Sat, 17 Jun 2023 23:29:52 +0900</pubDate>
    </item>
    <item>
      <title>three.js 조명 - AmbientLight, DirectionalLight, MeshStandardMaterial</title>
      <link>https://carrotweb.tistory.com/291</link>
      <description>&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;조명을 사용하기 전에 객체들이 조명에 반응하도록 Material(머티리얼)을 변경해 줘야 합니다.&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;이전에 생성한 육면체 객체와 구 객체에는 조명에 반응하지 않는 MeshBasicMaterial(메쉬&amp;nbsp;베이식 머티리얼)을 사용하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686485232106&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const box1Material = new THREE.MeshBasicMaterial({color: 0x00ff00});

:

const sphere1Material = new THREE.MeshBasicMaterial({color: 0x0000ff});&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;그래서 조명에 반응하는 MeshStandardMaterial(메쉬 표준 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;머티리얼&lt;/span&gt;)을 생성하여 변경하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;MeshStandardMaterial(메쉬 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;표준&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;머티리얼)은 Metallic-Roughness를 사용한 표준 물리 기반 재질로 렌더링 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 조명이 없으면 객체의 색이 표시되지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686485378151&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MeshStandardMaterial(parameters : Object)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 color 속성만 설명하겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;color 속성은 객체에 적용할 색상입니다. 기본값 0xffffff (흰색) (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 육면체 객체와 구 객체에 사용된 MeshBasicMaterial(메쉬&amp;nbsp;베이식&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;머티리얼)은 주석 처리하고&lt;/span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;MeshStandardMaterial(메쉬&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;표준&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;머티리얼)을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686484739004&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//const box1Material = new THREE.MeshBasicMaterial({color: 0x00ff00});
const box1Material = new THREE.MeshStandardMaterial({color: 0x00ff00});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO255S/btsjButW8pJ/zKDcPEpi9YSMKkFOygAGNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO255S/btsjButW8pJ/zKDcPEpi9YSMKkFOygAGNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO255S/btsjButW8pJ/zKDcPEpi9YSMKkFOygAGNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO255S%2FbtsjButW8pJ%2FzKDcPEpi9YSMKkFOygAGNk%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;2648&quot; height=&quot;1632&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&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;pre id=&quot;code_1686484840918&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//const sphere1Material = new THREE.MeshBasicMaterial({color: 0x0000ff});
const sphere1Material = new THREE.MeshStandardMaterial({color: 0x0000ff});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOgpZB/btsjmuPIieH/DWlDftmPtRVrH5h9byjqR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOgpZB/btsjmuPIieH/DWlDftmPtRVrH5h9byjqR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOgpZB/btsjmuPIieH/DWlDftmPtRVrH5h9byjqR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOgpZB%2FbtsjmuPIieH%2FDWlDftmPtRVrH5h9byjqR0%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;2648&quot; height=&quot;1632&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&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;2428&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AXEtY/btsjkNbj7gw/TJkYNBAIusJy4m86iIYkzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AXEtY/btsjkNbj7gw/TJkYNBAIusJy4m86iIYkzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AXEtY/btsjkNbj7gw/TJkYNBAIusJy4m86iIYkzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXEtY%2FbtsjkNbj7gw%2FTJkYNBAIusJy4m86iIYkzK%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;2428&quot; height=&quot;1538&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&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;Scence(씬, 장면)에 있는 모든 객체에 빛을 비추기 위해 주변 조명(AmbientLight)을 생성하겠습니다.&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;AmbientLight(엠비언트 라이트)은 Scence(씬, 장면)에 있는 모든 객체에 빛을 비춥니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686483618864&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AmbientLight(color : Integer, intensity : Float)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;color(색상) : 조명 색상입니다. 기본값&amp;nbsp;0xffffff&amp;nbsp;(흰색)&amp;nbsp;(입력하지&amp;nbsp;않으면&amp;nbsp;기본값으로&amp;nbsp;설정됩니다.)&lt;/li&gt;
&lt;li&gt;intensity(밝기) : 조명의 강도입니다. 기본값 1 (입력하지&amp;nbsp;않으면&amp;nbsp;기본값으로&amp;nbsp;설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Scence(씬, 장면)에 있는 모든 객체에 빛을 비추기 위해 흰색의 주변 조명(AmbientLight)을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686484555854&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 주변 조명
const ambientlight = new THREE.AmbientLight(0xffffff, 1);
scene.add(ambientlight);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;조명이 모든 객체에 일관되게 적용되기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;조명의 밝기가 1이면 모든 면이 밝아져 입체로 보이지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df50RK/btsjtAVO8Ue/q0UWkxOR2xbibQrVwkce8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df50RK/btsjtAVO8Ue/q0UWkxOR2xbibQrVwkce8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df50RK/btsjtAVO8Ue/q0UWkxOR2xbibQrVwkce8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf50RK%2FbtsjtAVO8Ue%2Fq0UWkxOR2xbibQrVwkce8K%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;2428&quot; height=&quot;1538&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&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;그래서 밝기를 0.5 이하로 설정하고 다른 조명을 추가하여 빛을 비추면 좀 더 입체적으로 보이게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 명암 대비가 있게 주변 조명의 밝기를 0.3으로 설정하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686483543261&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 주변 조명
const ambientlight = new THREE.AmbientLight(0xffffff, 0.3);
scene.add(ambientlight);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4uYZN/btsjqvUNJvn/viHcFmQK9wf9P7pG6yrGVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4uYZN/btsjqvUNJvn/viHcFmQK9wf9P7pG6yrGVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4uYZN/btsjqvUNJvn/viHcFmQK9wf9P7pG6yrGVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4uYZN%2FbtsjqvUNJvn%2FviHcFmQK9wf9P7pG6yrGVk%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;2648&quot; height=&quot;1632&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면 조명의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;밝기가 낮아져 어둡게 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nuwVc/btsjtAVPfXG/LauFDBaHhYOzXK4EfhRRM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nuwVc/btsjtAVPfXG/LauFDBaHhYOzXK4EfhRRM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nuwVc/btsjtAVPfXG/LauFDBaHhYOzXK4EfhRRM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnuwVc%2FbtsjtAVPfXG%2FLauFDBaHhYOzXK4EfhRRM0%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;2428&quot; height=&quot;1538&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;육면체 객체와 구 객체의 MeshPhongMaterial(메쉬 퐁&lt;span&gt;&amp;nbsp;&lt;/span&gt;머티리얼)에서 색상을 제거하고 AmbientLight(엠비언트 라이트)의 색상을 붉은색으로 변경하면 객체의 색이 조명색으로 보이게 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686487478234&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const box1Material = new THREE.MeshPhongMaterial();

:

const sphere1Material = new THREE.MeshPhongMaterial();

:

const ambientlight = new THREE.AmbientLight(0xff0000, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FASuu/btsjnG3kiUW/aUklKlfIu4HRX2EvWkUr01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FASuu/btsjnG3kiUW/aUklKlfIu4HRX2EvWkUr01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FASuu/btsjnG3kiUW/aUklKlfIu4HRX2EvWkUr01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFASuu%2FbtsjnG3kiUW%2FaUklKlfIu4HRX2EvWkUr01%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;2428&quot; height=&quot;1538&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체들이 입체적으로 보이기 위해 방향성이 있는 조명을 추가하도록 하겠습니다.&lt;/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;DirectionalLight(디렉셔널 라이트)은 특정 방향으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;객체에&lt;span&gt; &lt;/span&gt;&lt;/span&gt;빛을 비춥니다. 마치 태양처럼 먼 거리에서 빛이 오는 것처럼 빛을 비춥니다. 그래서 모든 그림자는 평행하게 나타납니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686493842992&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DirectionalLight(color : Integer, intensity : Float)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;color(색상) : 조명 색상입니다. 기본값 0xffffff (흰색) (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;intensity(밝기) : 조명의 강도입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 빛을 비추기 위해 흰색의 방향성 조명(DirectionalLight)을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686493624994&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방향성 조명
const light1 = new THREE.DirectionalLight(0xffffff, 1);
scene.add(light1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 위에서 아래로 빛이 비추어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qTf5c/btsjAwMafnZ/K3KKJaRPiEKcYHKhgnPEv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qTf5c/btsjAwMafnZ/K3KKJaRPiEKcYHKhgnPEv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qTf5c/btsjAwMafnZ/K3KKJaRPiEKcYHKhgnPEv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqTf5c%2FbtsjAwMafnZ%2FK3KKJaRPiEKcYHKhgnPEv1%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;2428&quot; height=&quot;1538&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&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;DirectionalLight(디렉셔널 라이트)에 위치(position)를 설정하지 않으면 조명이 위에서 아래로 비추도록 설정됩니다.&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;위치(position)에서 X 축에만 값을 주면 조명이 오른쪽에서 왼쪽으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;비추도록&lt;span&gt; &lt;/span&gt;&lt;/span&gt;됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686496665622&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;light1.position.set(1, 0, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8Qqu/btsjBt2UaTT/yF8IcG6wFUFK5rWBEKfO00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8Qqu/btsjBt2UaTT/yF8IcG6wFUFK5rWBEKfO00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8Qqu/btsjBt2UaTT/yF8IcG6wFUFK5rWBEKfO00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8Qqu%2FbtsjBt2UaTT%2FyF8IcG6wFUFK5rWBEKfO00%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;1477&quot; height=&quot;935&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;935&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;위치(position)에서 Y 축에만&lt;span&gt; 값을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;주면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;조명이 위에서 아래로 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;비추도록&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686497106047&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;light1.position.set(0, 1, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bicoOo/btsjlk7RbRa/HrixXyCtf5kx69nU24CQZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bicoOo/btsjlk7RbRa/HrixXyCtf5kx69nU24CQZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bicoOo/btsjlk7RbRa/HrixXyCtf5kx69nU24CQZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbicoOo%2Fbtsjlk7RbRa%2FHrixXyCtf5kx69nU24CQZ0%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;1477&quot; height=&quot;935&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;935&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;위치(position)에서 Z 축에만&lt;span&gt; 값을&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;주면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;조명이 앞에서 뒤로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;비추도록&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686497277703&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;light1.position.set(0, 0, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;935&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/duMSgg/btsjpERPkxy/zZZSNcnDIr9dA7T77rbZJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/duMSgg/btsjpERPkxy/zZZSNcnDIr9dA7T77rbZJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/duMSgg/btsjpERPkxy/zZZSNcnDIr9dA7T77rbZJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FduMSgg%2FbtsjpERPkxy%2FzZZSNcnDIr9dA7T77rbZJK%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;1477&quot; height=&quot;935&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;935&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;조명이 왼쪽에서 오른쪽으로, 위에서 아래로, 앞에서 뒤로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;비추도록&lt;span&gt;&lt;span&gt; 설정하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686497440229&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;light1.position.set(-1, 1, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SkfiX/btsjkLYX61F/jYt6J2wsDFnyIeXA6KTvdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SkfiX/btsjkLYX61F/jYt6J2wsDFnyIeXA6KTvdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SkfiX/btsjkLYX61F/jYt6J2wsDFnyIeXA6KTvdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSkfiX%2FbtsjkLYX61F%2FjYt6J2wsDFnyIeXA6KTvdk%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;2648&quot; height=&quot;1632&quot; data-origin-width=&quot;2648&quot; data-origin-height=&quot;1632&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;2428&quot; data-origin-height=&quot;1538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmjNxg/btsjmBuuu3q/pAG8hVRkqak96IvAcktho1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmjNxg/btsjmBuuu3q/pAG8hVRkqak96IvAcktho1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmjNxg/btsjmBuuu3q/pAG8hVRkqak96IvAcktho1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmjNxg%2FbtsjmBuuu3q%2FpAG8hVRkqak96IvAcktho1%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;2428&quot; height=&quot;1538&quot; data-origin-width=&quot;2428&quot; data-origin-height=&quot;1538&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;위치(position)가 멀어질 수 록 객체들의 위치에 따라 빛의 양도 달라집니다. 그리고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;조명의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;위치(position)에 따라 객체의 그림자가 달라지게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>AmbientLight</category>
      <category>DirectionalLight</category>
      <category>MeshStandardMaterial</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/291</guid>
      <comments>https://carrotweb.tistory.com/291#entry291comment</comments>
      <pubDate>Mon, 12 Jun 2023 00:38:38 +0900</pubDate>
    </item>
    <item>
      <title>three.js 카메라 위치 변경, 객체 위치 변경, 애니메이팅 - Camera Position, LookAt, Mesh Position, Animating, AxesHelper, SphereGeometry</title>
      <link>https://carrotweb.tistory.com/290</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Camera(카메라)는 위치(position)를 설정하지 않으면 Scence(씬, 장면)의 중앙을 보게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf9Gls/btsjqwMpbdI/PUQkmN5Zbay6cKJSplun50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf9Gls/btsjqwMpbdI/PUQkmN5Zbay6cKJSplun50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf9Gls/btsjqwMpbdI/PUQkmN5Zbay6cKJSplun50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf9Gls%2FbtsjqwMpbdI%2FPUQkmN5Zbay6cKJSplun50%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;240&quot; height=&quot;219&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;289&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;그래서 Camera(카메라)의 위치(position)는 조정하여 객체가 입체적으로 보이도록 하겠습니다.&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;1. Camera(카메라)의 Z 위치가 커지면 Scence(씬, 장면)를 중심으로 카메라가 뒤로 이동합니다.&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;Camera(카메라)의 Z 위치를 2로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686381683023&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 Z 위치를 이동
camera.position.z = 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;96&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVlhtD/btsjlZBRJ9i/p7J9Ch4KmTa82qnFBNC8BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVlhtD/btsjlZBRJ9i/p7J9Ch4KmTa82qnFBNC8BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVlhtD/btsjlZBRJ9i/p7J9Ch4KmTa82qnFBNC8BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVlhtD%2FbtsjlZBRJ9i%2Fp7J9Ch4KmTa82qnFBNC8BK%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;80&quot; height=&quot;165&quot; data-origin-width=&quot;96&quot; data-origin-height=&quot;198&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;1477&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqu2dp/btsjk5WZcWe/fm6Imx4ZwFXktT4loKAFtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqu2dp/btsjk5WZcWe/fm6Imx4ZwFXktT4loKAFtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqu2dp/btsjk5WZcWe/fm6Imx4ZwFXktT4loKAFtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqu2dp%2Fbtsjk5WZcWe%2Ffm6Imx4ZwFXktT4loKAFtK%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;1477&quot; height=&quot;946&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera(카메라)의 Z 위치를 5로 다시 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686397237405&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 Z 위치를 이동
camera.position.z = 5;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;947&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ7IAi/btsjnabPEps/yT5QLCCBuPfeR2AJF9QgPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ7IAi/btsjnabPEps/yT5QLCCBuPfeR2AJF9QgPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ7IAi/btsjnabPEps/yT5QLCCBuPfeR2AJF9QgPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ7IAi%2FbtsjnabPEps%2FyT5QLCCBuPfeR2AJF9QgPK%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;1477&quot; height=&quot;947&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;947&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera(카메라)의 Z 위치는 Camera(카메라)를 생성할 때 설정한 near(카메라부터 가까운 거리)부터 far(카메라부터 먼 거리) 안의 값으로 설정해야 합니다. (이전 생성할 때 near는 0.1, far는 1000입니다.)&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. Camera(카메라)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;X 위치&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;커지면 Scence(씬, 장면)를 중심으로 오른쪽으로 카메라가 이동합니다.&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;Camera(카메라)의 X 위치를 1로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686381731541&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 X 위치를 이동
camera.position.x = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;122&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lun9a/btsjmvAy1Ui/pSk8bdS6tPR1lBzYd9Qs20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lun9a/btsjmvAy1Ui/pSk8bdS6tPR1lBzYd9Qs20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lun9a/btsjmvAy1Ui/pSk8bdS6tPR1lBzYd9Qs20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flun9a%2FbtsjmvAy1Ui%2FpSk8bdS6tPR1lBzYd9Qs20%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;100&quot; height=&quot;170&quot; data-origin-width=&quot;122&quot; data-origin-height=&quot;207&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;1477&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sIGbh/btsjjz5fIzZ/ooIIdFtgtl3rIMkKDaglI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sIGbh/btsjjz5fIzZ/ooIIdFtgtl3rIMkKDaglI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sIGbh/btsjjz5fIzZ/ooIIdFtgtl3rIMkKDaglI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsIGbh%2Fbtsjjz5fIzZ%2FooIIdFtgtl3rIMkKDaglI0%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;1477&quot; height=&quot;945&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;945&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera(카메라)의 X 위치를 2로 다시 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686396754617&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 X 위치를 이동
camera.position.x = 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYDoqh/btsjpERjTXT/oG36kJ2t9oVxWWeReiva9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYDoqh/btsjpERjTXT/oG36kJ2t9oVxWWeReiva9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYDoqh/btsjpERjTXT/oG36kJ2t9oVxWWeReiva9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYDoqh%2FbtsjpERjTXT%2FoG36kJ2t9oVxWWeReiva9K%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;1477&quot; height=&quot;948&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;948&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. Camera(카메라)의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Y 위치&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;커지면 Scence(씬, 장면)를 중심으로 위쪽으로 카메라가 이동합니다.&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;Camera(카메라)의 Y 위치를 1로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686382209013&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 Y 위치를 이동
camera.position.y = 1;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OKce5/btsjlEdFoiZ/rXTHTNklgRYqnPhoqIqBRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OKce5/btsjlEdFoiZ/rXTHTNklgRYqnPhoqIqBRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OKce5/btsjlEdFoiZ/rXTHTNklgRYqnPhoqIqBRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOKce5%2FbtsjlEdFoiZ%2FrXTHTNklgRYqnPhoqIqBRK%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;200&quot; height=&quot;117&quot; data-origin-width=&quot;222&quot; data-origin-height=&quot;130&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;1477&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYAhXl/btsjpEjt8al/p2C43Y7u1Dae6s6PJKSeWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYAhXl/btsjpEjt8al/p2C43Y7u1Dae6s6PJKSeWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYAhXl/btsjpEjt8al/p2C43Y7u1Dae6s6PJKSeWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYAhXl%2FbtsjpEjt8al%2Fp2C43Y7u1Dae6s6PJKSeWk%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;1477&quot; height=&quot;945&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;945&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera(카메라)의 Y 위치를 2로 다시 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686396983113&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 Y 위치를 이동
camera.position.y = 2;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;948&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2kTAD/btsji2GHTRv/VQZukz2Pj0MnvrqJptocK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2kTAD/btsji2GHTRv/VQZukz2Pj0MnvrqJptocK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2kTAD/btsji2GHTRv/VQZukz2Pj0MnvrqJptocK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2kTAD%2Fbtsji2GHTRv%2FVQZukz2Pj0MnvrqJptocK1%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;1477&quot; height=&quot;948&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;948&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;Camera(카메라)의 위치(position)를 조정하니 객체가 입체적으로 보입니다.&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;Camera(카메라)는 위치(position)를 한 번에 설정할 수도 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686382474052&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 X, Y, Z 위치를 이동
camera.position.set(2, 2, 5);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cULdh4/btsjpD5TEAk/xWx1T4WkBdy3VnkzxVITU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cULdh4/btsjpD5TEAk/xWx1T4WkBdy3VnkzxVITU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cULdh4/btsjpD5TEAk/xWx1T4WkBdy3VnkzxVITU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcULdh4%2FbtsjpD5TEAk%2FxWx1T4WkBdy3VnkzxVITU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체들을&lt;span&gt;&amp;nbsp;&lt;/span&gt;Scence(씬, 장면)에 추가할 때&lt;span&gt;&amp;nbsp;&lt;/span&gt;Scence(씬, 장면)의 중앙이&lt;span&gt;&amp;nbsp;&lt;/span&gt;어디에 있는지 헷갈릴 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Scence(씬, 장면)에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;3개의 축(X, Y, Z)을 시각화할 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&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 data-ke-size=&quot;size16&quot;&gt;4. Scence(씬, 장면)에 추가할 축 도우미(AxesHelper, 엑시즈 헬퍼)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686397383229&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;AxesHelper(size : Number)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;size(크기) : 축의 길이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;축의 길이를 5로 설정하고 Scence(씬, 장면)에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686389016906&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 장면에 X, Y, Z 축을 표시 (X : Red, Y : Green, Z : Blue) 
const axes = new THREE.AxesHelper(5);
scene.add(axes);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWAWYE/btsjjBWmV4y/qKApwKMiFkfgnP38GktxG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWAWYE/btsjjBWmV4y/qKApwKMiFkfgnP38GktxG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWAWYE/btsjjBWmV4y/qKApwKMiFkfgnP38GktxG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWAWYE%2FbtsjjBWmV4y%2FqKApwKMiFkfgnP38GktxG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;그러면 Scence(씬, 장면)에 &amp;nbsp;X 축은 붉은색, Y 축은 녹색, Z 축은 파란색으로 표시됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cws9BN/btsjmvHm7L3/4NzuCnecKh1I7uOwul5n0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cws9BN/btsjmvHm7L3/4NzuCnecKh1I7uOwul5n0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cws9BN/btsjmvHm7L3/4NzuCnecKh1I7uOwul5n0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcws9BN%2FbtsjmvHm7L3%2F4NzuCnecKh1I7uOwul5n0K%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;2524&quot; height=&quot;1618&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확실하게 Scence(씬, 장면)의 중앙 위치가 확인됩니다.&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;이어서 구(Sphere)를 생성하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위치(position)를&lt;span&gt; 지정하여 &lt;/span&gt;&lt;/span&gt;추가해 보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Scence(씬, 장면)에 추가할 SphereGeometry(스피어 지오메트리, 구)를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686398412353&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SphereGeometry(radius : Float, widthSegments : Integer, heightSegments : Integer, phiStart : Float, phiLength : Float, thetaStart : Float, thetaLength : Float)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;radius(레이디어스, 반지름, 반경) : 구의 반지름입니다. 기본값&lt;span&gt;&amp;nbsp;&lt;/span&gt;1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;widthSegments&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;(수평 세그먼트, 가로 분절 수) : 가로를 분할 면의 수입니다. &lt;/span&gt;최소값 3, 기본값 32 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;heightSegments(수직 세그먼트, 세로 분절 수) : 세로를 분할 면의 수입니다.&amp;nbsp; 최소값 2, 기본값 16 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;phiStart(파이 시작) : 수평 시작 각도입니다. 기본값 0 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;phiLength(파이 길이) : 수평 스위프 각도 크기입니다. 기본값 Math.PI X 2 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;thetaStart(세타 시작) : 수직 시작 각도입니다. 기본값 0 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;thetaLength(세타 길이) : 수직 스위프 각도 크기입니다. 기본값 Math.PI (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이(Math.PI)는 180도입니다. (호도법, 라디안을 참고하세요.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 1도 = &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Math.PI / 180 입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;phiStart(파이 시작),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;phiLength(파이 길이),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;thetaStart(세타 시작),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;thetaLength(세타 길이)에서 각도 값을 설정할 때 사용하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686406952753&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(Math.PI/180) * 각도&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;반지름이 1인 구를 생성하고 구의 색상을 파란색으로 하기 위해서 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Material(머티리얼)을 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;SphereGeometry(스피어 지오메트리, 구)와&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Material(머티리얼)을 사용하여 객체를 생성하고 객체의 위치(position)를 기존의 육면체 뒤에 오게 설정하여 Scence(씬, 장면)에 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686407196192&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 구 지오메트리 생성
const sphere1Geometry = new THREE.SphereGeometry(1);
// 구에 사용할 색상과 질감의 데이터를 생성
const sphere1Material = new THREE.MeshBasicMaterial({color: 0x0000ff});
// 구와 색상과 질감의 데이터를 결합하여 구 객체 생성
const sphere1 = new THREE.Mesh(sphere1Geometry, sphere1Material);
// 구의 X, Y, Z 위치를 이동
sphere1.position.set(2, 1, -2);
// 장면에 구 객체 추가
scene.add(sphere1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nds93/btsjkGb7exA/s2SkbcYKsgh8DrPGKWTsh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nds93/btsjkGb7exA/s2SkbcYKsgh8DrPGKWTsh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nds93/btsjkGb7exA/s2SkbcYKsgh8DrPGKWTsh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnds93%2FbtsjkGb7exA%2Fs2SkbcYKsgh8DrPGKWTsh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;그러면 Scence(씬, 장면)에 &amp;nbsp;구가 나타난 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jr7X8/btsjj8mqN7U/lskKR0qclpKoL2BYHMOQo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jr7X8/btsjj8mqN7U/lskKR0qclpKoL2BYHMOQo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jr7X8/btsjj8mqN7U/lskKR0qclpKoL2BYHMOQo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJr7X8%2Fbtsjj8mqN7U%2FlskKR0qclpKoL2BYHMOQo0%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;2524&quot; height=&quot;1618&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Camera LookAt&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;Camera(카메라)가 객체를 바라보게 변경해 보도록 하겠습니다.&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;Camera(카메라)의 lookAt 함수를 사용하면 지정된 위치를 중심으로 렌더링 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686408636673&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.lookAt(vector : Vector3)
.lookAt(x : Float, y : Float, z : Float)&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;Camera(카메라)가 육면체 객체를 중심으로 보게 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686408397629&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라를 육면체 객체를 보게 변경
camera.lookAt(box1.position);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgA4VO/btsjpG2IYAB/YzQfhx1fJXhQ5UE4OROq90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgA4VO/btsjpG2IYAB/YzQfhx1fJXhQ5UE4OROq90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgA4VO/btsjpG2IYAB/YzQfhx1fJXhQ5UE4OROq90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgA4VO%2FbtsjpG2IYAB%2FYzQfhx1fJXhQ5UE4OROq90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;2524&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2g9El/btsjk5Qhwst/S6XGstfDCJlEvLVHfri2KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2g9El/btsjk5Qhwst/S6XGstfDCJlEvLVHfri2KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2g9El/btsjk5Qhwst/S6XGstfDCJlEvLVHfri2KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2g9El%2Fbtsjk5Qhwst%2FS6XGstfDCJlEvLVHfri2KK%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;2524&quot; height=&quot;1618&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&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;Camera(카메라)가 구 객체를 중심으로 보게 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686409158058&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라를 구 객체를 보게 변경
camera.lookAt(sphere1.position);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;구 객체가 화면 중앙에 오게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHeTeJ/btsjnbopQZA/AWstN2hPznbXaloAkPddS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHeTeJ/btsjnbopQZA/AWstN2hPznbXaloAkPddS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHeTeJ/btsjnbopQZA/AWstN2hPznbXaloAkPddS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHeTeJ%2FbtsjnbopQZA%2FAWstN2hPznbXaloAkPddS1%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;2524&quot; height=&quot;1618&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&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;Camera(카메라)가 Scence(씬, 장면)을 중심으로 보게 변경하면 육면체 객체를 중심으로 보게 변경합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 육면체 객체의 위치(position)가 X : 0,&amp;nbsp; Y : 0,&amp;nbsp; Z : 0이기 때문입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686469339436&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라를 장면 중앙을 보게 변경
camera.lookAt(scene.position);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Animating(애니메이팅)&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;변경된 정보로 다시 &lt;/span&gt;&lt;/span&gt;렌더링 되게 하기 위해서는 HTML5를 지원하는 웹 브라우저의 내장 메서드인 requestAnimationFrame 메서드를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686409786792&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;requestAnimationFrame(callback : Function)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;callback : 애니메이션을 업데이트할 시간이 되었을 때 호출할 함수입니다. (설정된&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;콜백 함수를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;일반적으로 초당 60회 호출하지만 브라우마다 조금씩 다를 수 있습니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;1. 기존의 렌더러 함수는 주석 처리하고 애니메이션 함수를 생성합니다. 애니메이션 함수에는 렌더링을 위한 렌더러 함수와 애니메이션 함수를 다시 호출하기 위해 requestAnimationFrame 메서드를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686409542050&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 랜더링
// renderer.render(scene, camera);

// 애니메이팅
function animate() {
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};

animate();&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;2. 애니메이션을 위해 육면체 객체가 Scence(씬, 장면)의 X, Y, Z 축을 중심으로 회전(rotation) 시키겠습니다. (단위는 radian(라디안) 입니다.)&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;rotation.x는 객체가 Scence(씬, 장면)의 X 축을 중심으로 회전하게 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB86Vg/btsjlWkUlOm/rRt9ZGAvZhIIzrfWPwpDc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB86Vg/btsjlWkUlOm/rRt9ZGAvZhIIzrfWPwpDc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB86Vg/btsjlWkUlOm/rRt9ZGAvZhIIzrfWPwpDc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB86Vg%2FbtsjlWkUlOm%2FrRt9ZGAvZhIIzrfWPwpDc0%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;1477&quot; height=&quot;946&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&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;rotation.y는 객체가 Scence(씬, 장면)의 Y 축을 중심으로 회전하게 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czXERl/btsjqxq7r2r/6e2NK3pblrDKZ4dEB7cy1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czXERl/btsjqxq7r2r/6e2NK3pblrDKZ4dEB7cy1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czXERl/btsjqxq7r2r/6e2NK3pblrDKZ4dEB7cy1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczXERl%2Fbtsjqxq7r2r%2F6e2NK3pblrDKZ4dEB7cy1K%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;1477&quot; height=&quot;946&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&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;rotation.z는 객체가 Scence(씬, 장면)의 Z 축을 중심으로 회전하게 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yRa1d/btsjtAuj3YP/ZEnKzRi1aGoHTxe3tNJzX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yRa1d/btsjtAuj3YP/ZEnKzRi1aGoHTxe3tNJzX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yRa1d/btsjtAuj3YP/ZEnKzRi1aGoHTxe3tNJzX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyRa1d%2FbtsjtAuj3YP%2FZEnKzRi1aGoHTxe3tNJzX0%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;1477&quot; height=&quot;946&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;946&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;1 radian(라디안)은 약 57.3도입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 0.01 radian(라디안)은 0.573도입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686411452266&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 애니메이팅
function animate() {
    box1.rotation.x += 0.01;
    box1.rotation.y += 0.01;
    box1.rotation.z += 0.01;
    renderer.render(scene, camera);
    requestAnimationFrame(animate);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2GIif/btsjjzxv4Zh/vGD5RBz6Y3B2g3kEF5uaEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2GIif/btsjjzxv4Zh/vGD5RBz6Y3B2g3kEF5uaEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2GIif/btsjjzxv4Zh/vGD5RBz6Y3B2g3kEF5uaEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2GIif%2Fbtsjjzxv4Zh%2FvGD5RBz6Y3B2g3kEF5uaEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;그러면 육면체 객체가 Scence(씬, 장면)의 X, Y, Z 축 방향으로 회전하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GaEg7/btsjj803VPn/RdR9QejRqPn2kpozh4rO7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GaEg7/btsjj803VPn/RdR9QejRqPn2kpozh4rO7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GaEg7/btsjj803VPn/RdR9QejRqPn2kpozh4rO7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGaEg7%2Fbtsjj803VPn%2FRdR9QejRqPn2kpozh4rO7k%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;2524&quot; height=&quot;1618&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>Animating</category>
      <category>AxesHelper</category>
      <category>Camera Position</category>
      <category>camera.lookAt</category>
      <category>rotation</category>
      <category>SphereGeometry</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/290</guid>
      <comments>https://carrotweb.tistory.com/290#entry290comment</comments>
      <pubDate>Sun, 11 Jun 2023 01:07:36 +0900</pubDate>
    </item>
    <item>
      <title>three.js 장면, 카메라, 렌더러, 객체, 머티리얼 생성 - Scene, Camera, Renderer, Geometry, PerspectiveCamera, BoxGeometry, MeshBasicMaterial</title>
      <link>https://carrotweb.tistory.com/289</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 설명들인 것처럼 three.js를 개발하기 위해서 NPM과 빌드 도구(Node.js, Vite)를 사용하거나 CDN으로 가져(Import) 오거나 직접 js 파일을 다운로드해서 사용하는 방법이 있습니다.&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;최근에 NPM과 빌드 도구(Node.js, Vite)를 많이 사용하고 있는 것 같아서 Node기반으로 개발하도록 하겠습니다.&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;우리는 어떻게 3차원으로 볼 수 있을 까요?&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;우리는 눈으로 공간에 있는 사물을 볼 수 있습니다. 그리고 우리는 몸을 움직여 공간에서 사물의 앞/뒤, 좌/우, 위/아래를 볼 수 있습니다. 그래서 사물을 입체적(3차원)으로 볼 수 있습니다.&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;사물이 공간에서 항상 우리의 눈높이와 같은 곳에 있지 않고 상/하, 좌/우에도 있고 우리 중심으로 떨어져 있기도 하기 때문입니다. 그리고 빛이 있어 사물의 밝기가 달라지고 그림자가 생겨 더욱 입체감 있게 보입니다.&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;우리가 움직이지 못해도 공간 안에서 사물의 위치와 거리, 빛에 따라 우리의 눈에는 입체적(3차원)으로 보입니다.&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;three.js도 3차원을 만들기 위해서 우리의 눈과 같은 시점에서 구현하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;three.js도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사물이 있을 공간이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;우리의 눈처럼 사물을 촬영할&amp;nbsp;카메라(Camera)가 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 카메라(Camera)에서 촬영한 장면(Scene)을 화면으로 볼 수 있게 처리하는 렌더러(Renderer)가 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉, three.js는 우리의 눈과 같은 카메라(Camera)의 시점에서 촬영한 장면(Scene)을 화면으로 볼 수 있게 처리해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 사물 입장에서는 장면(Scence)은 공간입니다. 그 공간에 있어야 사물이 촬영되기 때문입니다.&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;그럼 three.js로 3차원을 표현(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Rendering,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;렌더링) 하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;1. main.js&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 오픈합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;2. 객체가 있을 공간을 생성하기 위해 Scence(씬, 장면)를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686039483492&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 장면 생성
const scene = new THREE.Scene();&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;3. 촬영할 Camera(카메라)로 원근법이 적용되는 카메라를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686043565503&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PerspectiveCamera(fov : Number, aspect : Number, near : Number, far : Number)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fov(포브, field of view, 시야범위(각도)) : 화면이 보이는 각도입니다. 기본값 50도 (주로 45 ~ 75도 사이로 설정합니다.)&lt;/li&gt;
&lt;li&gt;aspect(애스펙트, aspect ratio, 종횡비, 가로세로비(비율)) : 가로와 세로 비율(영상에서 사물을 둘러싼 공간의 크기)입니다. 웹 브라우저를 통해서 보기 때문에 화면의 너비를 화면의 높이로 나눈 값을 사용합니다.&lt;/li&gt;
&lt;li&gt;near(니어, 카메라부터 가까운 거리) : 기본값 0.1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;far(파, 카메라부터 먼 거리) : 기본값 2000 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1qa3F/btsmWnyNW57/m78K99f8SQJvD7XlwIIJp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1qa3F/btsmWnyNW57/m78K99f8SQJvD7XlwIIJp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1qa3F/btsmWnyNW57/m78K99f8SQJvD7XlwIIJp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1qa3F%2FbtsmWnyNW57%2Fm78K99f8SQJvD7XlwIIJp1%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;500&quot; height=&quot;265&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvVncE/btsmWka5Qxi/uYQDJR9x7qUZKCqkVTjwd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvVncE/btsmWka5Qxi/uYQDJR9x7qUZKCqkVTjwd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvVncE/btsmWka5Qxi/uYQDJR9x7qUZKCqkVTjwd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvVncE%2FbtsmWka5Qxi%2FuYQDJR9x7qUZKCqkVTjwd1%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;400&quot; height=&quot;375&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;488&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;WebGLRenderer(렌더러)가 Camera의 far 보다 멀리 있는 객체나 near 보다 가까이 있는 객체는&lt;span&gt;&amp;nbsp;&lt;/span&gt;표현(Rendering, 렌더링) 하지 않는다는 뜻입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686043755300&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 원근법이 적용되는 카메라 생성
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);&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;4. 카메라의 시점으로 공간을 렌더링 하기 위해 WebGLRenderer(렌더러)를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686045962405&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WebGLRenderer(parameters : Object)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용하는 속성만 간단하게 설명하겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;canvas 속성은 렌더러가 렌더링 한 결과가 출력될 canvas 객체입니다. 속성이 설정되지 않으면 canvas 객체를 생성합니다.&lt;/li&gt;
&lt;li&gt;antialias 속성은 픽셀로 되어 있는 선들을 부드럽게 만드는 옵션이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebGLRenderer(렌더러) 파라미터에 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;antialias&lt;span&gt; 속성을&amp;nbsp;&lt;/span&gt;&lt;/span&gt;추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686048497037&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// WebGL 렌더러 생성
const renderer = new THREE.WebGLRenderer({antialias: true});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저의 크기로 WebGLRenderer(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;렌더러)가 &lt;/span&gt;렌더링 할 화면의 크기를 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686045356352&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 랜더링할 화면의 크기(width, height) 설정
renderer.setSize(window.innerWidth, window.innerHeight);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebGLRenderer(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;렌더러)가&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;렌더링 한 결과를 &amp;lt;body&amp;gt; 태그 안에 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686048847742&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 랜더러가 렌더링한 결과를 HTML에 추가 - canvas 생성
document.body.appendChild(renderer.domElement);&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;만약, index.html에 &amp;lt;canvas&amp;gt; 태그가 있다면 다음 처럼 하시면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686048090045&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;My first three.js app&amp;lt;/title&amp;gt;
		&amp;lt;style&amp;gt;
			body { margin: 0; }
			#myCanvas {width: 800px; height: 450px;}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;canvas id=&quot;myCanvas&quot;&amp;gt;&amp;lt;/canvas&amp;gt;
		&amp;lt;script type=&quot;module&quot; src=&quot;/main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main.js에서 canvas 객체를 가져와 WebGLRenderer(렌더러) 파라미터에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686047237540&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// canvas 객체
const myCanvas = document.getElementById('myCanvas');
// WebGL 렌더러 생성
const renderer = new THREE.WebGLRenderer({canvas: myCanvas, antialias: true});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 canvas 객체에 설정된 크기로 WebGLRenderer(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;렌더러)가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;렌더링 할 화면의 크기를 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686048382316&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 랜더링할 화면의 크기(width, height) 설정
renderer.setSize(myCanvas.clientWidth, myCanvas.clientHeight);&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;5. WebGLRenderer(렌더러)가&amp;nbsp;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)과 Camera(카메라)을 사용하여 &lt;/span&gt;렌더링 하게 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686049020919&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 랜더링
renderer.render(scene, camera);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beJwzU/btsiOeG16eO/KCd7qcN5TtMArznTxYk3Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beJwzU/btsiOeG16eO/KCd7qcN5TtMArznTxYk3Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beJwzU/btsiOeG16eO/KCd7qcN5TtMArznTxYk3Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeJwzU%2FbtsiOeG16eO%2FKCd7qcN5TtMArznTxYk3Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1624&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그럼, Vite(비트)를 통해 확인해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;6. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다. 그리고 Vite(비트)를 실행하기 위해 Terminal(터미널)에서 npx 명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686050477612&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx vite&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwlgNV/btsiU4v7S9S/Xu9kfZ6oUE0Kt2ja8CIbqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwlgNV/btsiU4v7S9S/Xu9kfZ6oUE0Kt2ja8CIbqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwlgNV/btsiU4v7S9S/Xu9kfZ6oUE0Kt2ja8CIbqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwlgNV%2FbtsiU4v7S9S%2FXu9kfZ6oUE0Kt2ja8CIbqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1624&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 localhost(로컬호스트, IP가 127.0.0.1)로 포트번호 5173으로 웹 서버가 실행됩니다.&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: #555555; text-align: start;&quot;&gt;7. Terminal(터미널)에서 Local에 있는 URL(http://localhost:5173/)에 마우스를 이동한 후 Ctrl 키를 누른 후 마우스를 클릭합니다. 그러면 기본 웹 브라우저가 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyDXx/btsiO6hpKdl/ZdlZUdohqAmfFNGilly8V1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyDXx/btsiO6hpKdl/ZdlZUdohqAmfFNGilly8V1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyDXx/btsiO6hpKdl/ZdlZUdohqAmfFNGilly8V1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyyDXx%2FbtsiO6hpKdl%2FZdlZUdohqAmfFNGilly8V1%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;2122&quot; height=&quot;1324&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1324&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)에 객체가 없기 때문에 아무것도 나타나지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그럼 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)에&lt;span&gt; 육면체를 추가해 보도록 하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;8. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)에 추가할 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;BoxGeometry(박스 지오메트리, &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;육면체&lt;/span&gt;)를&lt;/span&gt; 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686058775384&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BoxGeometry(width : Float, height : Float, depth : Float, widthSegments : Integer, heightSegments : Integer, depthSegments : Integer)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;width(가로, 너비, 폭) : &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;가로&lt;/span&gt;길이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;height(세로, 높이) : &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;세로&lt;/span&gt;길이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;depth(깊이) : 깊이입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;widthSegments(수평 세그먼트, 가로 분절 수) : 가로를 분할 면의 수입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;heightSegments(수직&amp;nbsp;세그먼트, 세로 분절 수) : 세로를 분할 면의 수입니다. 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;li&gt;depthSegments(깊이&amp;nbsp;세그먼트, 깊이 분절 수) : 깊이를 분할 면의 수입니다 기본값 1 (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4tNbN/btsjj9S13l7/UgrDEsx7WhzKJKSx9flMYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4tNbN/btsjj9S13l7/UgrDEsx7WhzKJKSx9flMYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4tNbN/btsjj9S13l7/UgrDEsx7WhzKJKSx9flMYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4tNbN%2Fbtsjj9S13l7%2FUgrDEsx7WhzKJKSx9flMYK%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;300&quot; height=&quot;249&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;256&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;pre id=&quot;code_1686058736398&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체 지오메트리 생성
const box1Geometry = new THREE.BoxGeometry(1, 1, 1);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;BoxGeometry(박스&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;지오메트리,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;육면체&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;)&lt;/span&gt;에 색상과 질감을 표현하는 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Material(머티리얼)을 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeshBasicMaterial(메쉬&amp;nbsp;베이식&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;머티리얼&lt;/span&gt;)은 조명을 고려하지 않고 단순하게 면을 렌더링 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686061103667&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MeshBasicMaterial(parameters : Object)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 color 속성만 설명하겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;color 속성은 객체의 면에 적용할 색상입니다. 기본값 0xffffff (흰색) (입력하지 않으면 기본값으로 설정됩니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파라미터에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;color&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;속성을&amp;nbsp;&lt;/span&gt;&lt;/span&gt;추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686061836455&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const box1Material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;BoxGeometry(박스&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;지오메트리,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;육면체&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;)&lt;/span&gt;와&lt;span&gt; &lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Material(머티리얼)을 사용하여 객체를 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686063251609&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 육면체와 색상과 질감의 데이터를 결합하여 육면체 객체 생성
const box1 = new THREE.Mesh(box1Geometry, box1Material);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)에 생성한 객체&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;를&lt;/span&gt;&lt;span&gt; 추가&lt;/span&gt;합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686063310858&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 장면에 육면체 객체 추가
scene.add(box1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sfltg/btsjnHtOgsV/VSop8VD7ydBNpcBUKVDdD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sfltg/btsjnHtOgsV/VSop8VD7ydBNpcBUKVDdD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sfltg/btsjnHtOgsV/VSop8VD7ydBNpcBUKVDdD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSfltg%2FbtsjnHtOgsV%2FVSop8VD7ydBNpcBUKVDdD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;main.js를 저장하면 Vite(비트)가 자동으로 웹 브라우저를 갱신해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4T0le/btsiWSbjsLK/ye205GpMQbuPX3ca47vbUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4T0le/btsiWSbjsLK/ye205GpMQbuPX3ca47vbUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4T0le/btsiWSbjsLK/ye205GpMQbuPX3ca47vbUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4T0le%2FbtsiWSbjsLK%2Fye205GpMQbuPX3ca47vbUK%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;2122&quot; height=&quot;1324&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1324&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)에 객체를 추가했지만 아무것도 나타나지 않았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그 이유는 Camera(&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;카메라&lt;/span&gt;)의 위치가 객체 앞에 있어 렌더링이 되지 않기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 Camera(카메라)가 객체의 앞에 있을 까요?&lt;/p&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;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)에&lt;span&gt;&lt;span&gt;&amp;nbsp;추가할&lt;/span&gt; 때 객체의 위치(position)를 설정하지 않으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)의 중앙에 추가됩니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 Camera(카메라)도&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;위치(position)를 설정하지 않으면&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Scence(씬, 장면)의 중앙을 보게 됩니다. 즉, &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Camera(카메라)의 Z 좌표가 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;0 좌표로 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceZgoV/btskhDdwnmp/a9givKXplUTMX9YbIfmg91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceZgoV/btskhDdwnmp/a9givKXplUTMX9YbIfmg91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceZgoV/btskhDdwnmp/a9givKXplUTMX9YbIfmg91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceZgoV%2FbtskhDdwnmp%2Fa9givKXplUTMX9YbIfmg91%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;500&quot; height=&quot;351&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;389&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;&amp;nbsp;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Camera(카메라) 사이의 거리를 계산해 보면 거리가 0이 나옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686379250707&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(box1.position.distanceTo(camera.position));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEW6e/btsjk7mPVZk/aU4KWnHvd7dNmXL2nuFeVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEW6e/btsjk7mPVZk/aU4KWnHvd7dNmXL2nuFeVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEW6e/btsjk7mPVZk/aU4KWnHvd7dNmXL2nuFeVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEW6e%2Fbtsjk7mPVZk%2FaU4KWnHvd7dNmXL2nuFeVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;2524&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P1MQm/btsjk5WSofo/eHce3Dp5rPoxmhwzp74Vq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P1MQm/btsjk5WSofo/eHce3Dp5rPoxmhwzp74Vq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P1MQm/btsjk5WSofo/eHce3Dp5rPoxmhwzp74Vq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP1MQm%2Fbtsjk5WSofo%2FeHce3Dp5rPoxmhwzp74Vq1%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;2524&quot; height=&quot;1620&quot; data-origin-width=&quot;2524&quot; data-origin-height=&quot;1620&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;그래서 Camera(&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;카메라&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;)의 Z 위치를 이동시켜 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;렌더링이&lt;span&gt; 되게 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;96&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhEyie/btsjj9rW3YN/ByKuqKPAwXlNwjVDu3d1BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhEyie/btsjj9rW3YN/ByKuqKPAwXlNwjVDu3d1BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhEyie/btsjj9rW3YN/ByKuqKPAwXlNwjVDu3d1BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhEyie%2Fbtsjj9rW3YN%2FByKuqKPAwXlNwjVDu3d1BK%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;80&quot; height=&quot;165&quot; data-origin-width=&quot;96&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1686063779855&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 카메라 Z 위치를 이동
camera.position.z = 5;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsZ8uU/btsjlXKEn4w/CYyuh0m8C57S5fw4F1lftk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsZ8uU/btsjlXKEn4w/CYyuh0m8C57S5fw4F1lftk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsZ8uU/btsjlXKEn4w/CYyuh0m8C57S5fw4F1lftk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsZ8uU%2FbtsjlXKEn4w%2FCYyuh0m8C57S5fw4F1lftk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1628&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1628&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;웹 브라우저를 보면 녹색의 사각형이 나타난 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MJ1cl/btsiNvCesvj/2KEZSh5FZKHtKuJV81lp81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MJ1cl/btsiNvCesvj/2KEZSh5FZKHtKuJV81lp81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MJ1cl/btsiNvCesvj/2KEZSh5FZKHtKuJV81lp81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMJ1cl%2FbtsiNvCesvj%2F2KEZSh5FZKHtKuJV81lp81%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;2122&quot; height=&quot;1324&quot; data-origin-width=&quot;2122&quot; data-origin-height=&quot;1324&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Camera(&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;카메라)의 위치가 정면을 바라보고 있기 때문입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 입체적으로 보기 위해 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;카메라(&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Camera&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;)의 위치를 변동시키고 객체을 회전시켜서 Animating(애니메이팅)를 해보겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>BoxGeometry</category>
      <category>Camera</category>
      <category>MeshBasicMaterial</category>
      <category>PerspectiveCamera</category>
      <category>Renderer</category>
      <category>scene</category>
      <category>Three.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/289</guid>
      <comments>https://carrotweb.tistory.com/289#entry289comment</comments>
      <pubDate>Wed, 7 Jun 2023 00:14:27 +0900</pubDate>
    </item>
    <item>
      <title>three.js three.module.js 파일 사용 - Download, GitHub</title>
      <link>https://carrotweb.tistory.com/288</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;three.module.js 파일을 다운로드하기 위해서는 Three.js 사이트에서 three.js-master.zip 파일을 다운로드하거나 GitHub에서 파일을 직접 다운로드하면 됩니다.&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;three.module.js 파일만 사용할 거면 GitHub에서 파일을 직접 다운로드하는 것이 간편하고 빠릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;다운로드하여 스크립트 모듈로 불러오기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Three.js 사이트(&lt;a href=&quot;https://threejs.org/&quot;&gt;https://threejs.org/&lt;/a&gt;)에서 왼쪽 메뉴에 있는 download를 클릭하여 three.js-master.zip 파일을 다운로드합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2368&quot; data-origin-height=&quot;1522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgPY4G/btsiyUWr6ou/yAaBSOvu80pQHDgknsW4E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgPY4G/btsiyUWr6ou/yAaBSOvu80pQHDgknsW4E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgPY4G/btsiyUWr6ou/yAaBSOvu80pQHDgknsW4E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgPY4G%2FbtsiyUWr6ou%2FyAaBSOvu80pQHDgknsW4E0%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;2368&quot; height=&quot;1522&quot; data-origin-width=&quot;2368&quot; data-origin-height=&quot;1522&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;three.js-master.zip 압축 파일을 풉니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Three.js를 Script으로 불러와 개발하기 위해 폴더를 생성합니다. 저는 &quot;C:\workspaces\webstudys\myworld3&quot; 폴더를 생성하였습니다. 생성된 프로젝트 폴더에 scripts 폴더를 생성합니다.&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;3. three.js-master.zip 압축 파일을 푼 폴더에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;three.js-master\build 폴더에 있는 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;three.module.js 파일을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;scripts&lt;span&gt; 폴더&lt;/span&gt;&lt;/span&gt;로 복사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2232&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCeSy4/btsiBJtNCus/1RK3hF5yFGcKzkjSM0hhKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCeSy4/btsiBJtNCus/1RK3hF5yFGcKzkjSM0hhKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCeSy4/btsiBJtNCus/1RK3hF5yFGcKzkjSM0hhKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCeSy4%2FbtsiBJtNCus%2F1RK3hF5yFGcKzkjSM0hhKk%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;2232&quot; height=&quot;724&quot; data-origin-width=&quot;2232&quot; data-origin-height=&quot;724&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;저는 &quot;C:\workspaces\webstudys\&lt;/span&gt;&lt;/span&gt;myworld3\scripts 폴더로 복사하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2238&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/toPIA/btsivP2sgDn/NjGXezluCKpEjkLi812901/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/toPIA/btsivP2sgDn/NjGXezluCKpEjkLi812901/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/toPIA/btsivP2sgDn/NjGXezluCKpEjkLi812901/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtoPIA%2FbtsivP2sgDn%2FNjGXezluCKpEjkLi812901%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;2238&quot; height=&quot;484&quot; data-origin-width=&quot;2238&quot; data-origin-height=&quot;484&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;또는 GitHub에서 three.module.js 파일을 직접 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/mrdoob/three.js/blob/dev/build/three.module.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mrdoob/three.js/blob/dev/build/three.module.js&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽에 있는 More file actions(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;...&quot;&lt;/span&gt;) 버튼을 눌러 Download를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgog1G/btsiJyrS9J4/W4rK8d4qE0RrJopaqwGOhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgog1G/btsiJyrS9J4/W4rK8d4qE0RrJopaqwGOhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgog1G/btsiJyrS9J4/W4rK8d4qE0RrJopaqwGOhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgog1G%2FbtsiJyrS9J4%2FW4rK8d4qE0RrJopaqwGOhK%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;2556&quot; height=&quot;1528&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;2556&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCV5qf/btsiQJei3x3/6KOtbvZqRDM6MPqcSK6h2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCV5qf/btsiQJei3x3/6KOtbvZqRDM6MPqcSK6h2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCV5qf/btsiQJei3x3/6KOtbvZqRDM6MPqcSK6h2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCV5qf%2FbtsiQJei3x3%2F6KOtbvZqRDM6MPqcSK6h2K%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;2556&quot; height=&quot;1528&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 three.module.js 파일을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;scripts&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;폴더&lt;/span&gt;&lt;/span&gt;로 복사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하거나 Ctrl 키를 누를 상태에서 K, O를 이어서 누릅니다. (Ctrl + K, Ctrl + O) 그리고 &quot;C:\workspaces\webstudys\myworld3&quot; 폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누르면 폴더가 오픈됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bah7LT/btsiFPAhuYY/knPmNccHNso0QKzpOMKfzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bah7LT/btsiFPAhuYY/knPmNccHNso0QKzpOMKfzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bah7LT/btsiFPAhuYY/knPmNccHNso0QKzpOMKfzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbah7LT%2FbtsiFPAhuYY%2FknPmNccHNso0QKzpOMKfzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안을 위해 Trust(신뢰) 확인 창이 나타납니다.&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;&quot;Yes, I Trust the authors&quot; 버튼을 누릅니다.&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;그리고 Welcome(시작) 창은 닫습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. index.html&lt;span style=&quot;text-align: start;&quot;&gt; 파일을 생성하기 위해서 EXPLORER(탐색기)의 MYWORLD3을 선택하고 첫 번째 아이콘(New File...(새 파일))을 클릭하고 입력란에 &quot;index.html&quot;를 입력하고 Enter 키를 눌러 파일을 생성합니다. 그리고 에디터에서 &quot;!&quot;를 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Enter 키를 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mRi7r/btsiM9ZAfzD/gVy8s9sasQzHH9VXKto2kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mRi7r/btsiM9ZAfzD/gVy8s9sasQzHH9VXKto2kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mRi7r/btsiM9ZAfzD/gVy8s9sasQzHH9VXKto2kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmRi7r%2FbtsiM9ZAfzD%2FgVy8s9sasQzHH9VXKto2kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;에디터에서&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;html:5&quot;를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;입력하고 Enter 키를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dANJLS/btsiPiH6Nk6/R9AJa7jHP9SDnA8y0p9Og0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dANJLS/btsiPiH6Nk6/R9AJa7jHP9SDnA8y0p9Og0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dANJLS/btsiPiH6Nk6/R9AJa7jHP9SDnA8y0p9Og0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdANJLS%2FbtsiPiH6Nk6%2FR9AJa7jHP9SDnA8y0p9Og0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 자동으로 HTML5 형식으로 만들어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HDc5D/btsiNcaW85x/Q2jOcp3UbZXW1cc5i2KDN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HDc5D/btsiNcaW85x/Q2jOcp3UbZXW1cc5i2KDN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HDc5D/btsiNcaW85x/Q2jOcp3UbZXW1cc5i2KDN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHDc5D%2FbtsiNcaW85x%2FQ2jOcp3UbZXW1cc5i2KDN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&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;&amp;lt;html&amp;gt;&amp;nbsp;태그에&amp;nbsp;있는&amp;nbsp;&quot;lang&quot;&amp;nbsp;속성은&amp;nbsp;제거합니다.&amp;nbsp;그리고&amp;nbsp;&amp;lt;title&amp;gt;&amp;nbsp;태그에&amp;nbsp;있는&amp;nbsp;&quot;Document&quot;를&amp;nbsp;제거하고&amp;nbsp;&quot;My&amp;nbsp;first&amp;nbsp;three.js&amp;nbsp;app&quot;로&amp;nbsp;입력합니다.&amp;nbsp;그리고&amp;nbsp;&amp;lt;style&amp;gt;&amp;nbsp;태그를&amp;nbsp;추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685946153820&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;My first three.js app&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body { margin: 0; }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mSYgk/btsiNcotT2o/MoeZReT9hsIMGBahdRXZdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mSYgk/btsiNcotT2o/MoeZReT9hsIMGBahdRXZdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mSYgk/btsiNcotT2o/MoeZReT9hsIMGBahdRXZdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmSYgk%2FbtsiNcotT2o%2FMoeZReT9hsIMGBahdRXZdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&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;6. three.module.js 파일을 불러오기 위해서 스크립트의 module을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685951504006&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;module&quot; src=&quot;scripts/three.module.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script type=&quot;module&quot;&amp;gt;은 자바스크립트 모듈(JavaScript module)을 가져오게 합니다.&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;lt;body&amp;gt; 태그 안에 개발을 위한 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;자바스크립트를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685952508507&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;module&quot; src=&quot;scripts/main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/riVrr/btsiOkTZBui/XOrM0QviHPyaxsuIw7WxCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/riVrr/btsiOkTZBui/XOrM0QviHPyaxsuIw7WxCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/riVrr/btsiOkTZBui/XOrM0QviHPyaxsuIw7WxCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FriVrr%2FbtsiOkTZBui%2FXOrM0QviHPyaxsuIw7WxCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&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;7. main.js&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 생성하기 위해서 EXPLORER(탐색기)의 scripts를 선택하고 첫 번째 아이콘(New File...(새 파일))을 클릭하고 입력란에 &quot;main.js를 입력하고 Enter 키를 눌러 파일을 생성합니다. 그리고 import를 통해 three.module.js 모듈을 가져오게 하고 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685952017984&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import * as THREE from './three.module.js';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBgWo/btsiBMEewTK/EwMMVbqMjN51YyhbaF2Hkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBgWo/btsiBMEewTK/EwMMVbqMjN51YyhbaF2Hkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBgWo/btsiBMEewTK/EwMMVbqMjN51YyhbaF2Hkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBgWo%2FbtsiBMEewTK%2FEwMMVbqMjN51YyhbaF2Hkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&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;탐색기에서 index.html 파일을 더블 클릭하여 웹 브라우저에서 실행할 수 있지만 스크립트 모듈들이 보안상의 이유로 정상적으로 작동되지 않을 수 있습니다. 그래서 웹 서버를 통해 실행하는 것이 좋습니다.&lt;/p&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;span style=&quot;color: #333333;&quot;&gt;웹 서버로 실행하는 방법으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;라이브 서버(Live Server)를 사용하면 됩니다.&lt;/span&gt;&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브 서버(Live Server)로 실행&lt;/b&gt;&lt;/p&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;라이브 서버(Live Server)의 다운로드 및 설치에 대한 자세한 설명은 &quot;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://carrotweb.tistory.com/274&quot;&gt;VSCode 웹 서버 설치, 포트 변경 - 라이브 서버(Live Server)&lt;/a&gt;&quot; 참고하시기 바랍니다.&lt;/p&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;1. index.html 파일에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Open with Live Server&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccRR1q/btsiM9L7kHH/MXGYeRM5nFklqTIyMwQBL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccRR1q/btsiM9L7kHH/MXGYeRM5nFklqTIyMwQBL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccRR1q/btsiM9L7kHH/MXGYeRM5nFklqTIyMwQBL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccRR1q%2FbtsiM9L7kHH%2FMXGYeRM5nFklqTIyMwQBL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 index.html 파일 편집기에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Open with Live Server&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PnAWd/btsiFQGcbFv/3JGz9d4NekA9qhaL5Klau0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PnAWd/btsiFQGcbFv/3JGz9d4NekA9qhaL5Klau0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PnAWd/btsiFQGcbFv/3JGz9d4NekA9qhaL5Klau0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPnAWd%2FbtsiFQGcbFv%2F3JGz9d4NekA9qhaL5Klau0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&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;2. 기본 브라우저로 설정된 웹 브라우저가 실행됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;localhost(로컬호스트, IP가 127.0.0.1)로 포트번호 5500으로 웹 서버가 실행됩니다. (저는 포트번호를 9000으로 변경하였습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsHy52/btsiQH1PFka/tkiFmJRFupOamxMV9aKqf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsHy52/btsiQH1PFka/tkiFmJRFupOamxMV9aKqf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsHy52/btsiQH1PFka/tkiFmJRFupOamxMV9aKqf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsHy52%2FbtsiQH1PFka%2FtkiFmJRFupOamxMV9aKqf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1620&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1620&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;빈 페이지가 나올 겁니다. 아직 코드가 없어 내용이 없습니다. 정상적으로 three.js 모듈이 로드된 겁니다.&lt;/p&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;이어서 Scene, Geometry, Camera, Renderer를 사용하여 3D를 만들어 보겠습니다.&lt;/p&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;참고로, OrbitControls과&amp;nbsp;GLTFLoader와&amp;nbsp;같은&amp;nbsp;모듈들은&amp;nbsp;별도로&amp;nbsp;가져와야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;three.js-master.zip 압축 파일을 푼 폴더에서&lt;span&gt; &lt;/span&gt;&lt;/span&gt;three.js-master\examples\jsm 폴더에서 모듈들을 찾을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2230&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAJEry/btsiFOhl0Sx/BZ5RbvZe74WDqsefEiID00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAJEry/btsiFOhl0Sx/BZ5RbvZe74WDqsefEiID00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAJEry/btsiFOhl0Sx/BZ5RbvZe74WDqsefEiID00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAJEry%2FbtsiFOhl0Sx%2FBZ5RbvZe74WDqsefEiID00%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;2230&quot; height=&quot;872&quot; data-origin-width=&quot;2230&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OrbitControls은 three.js-master\three.js-master\examples\jsm\controls 폴더에서 OrbitControls.js 파일입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GLTFLoader은 three.js-master\three.js-master\examples\jsm\loaders 폴더에서 GLTFLoader.js 파일입니다&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;GitHub에서도 파일을 직접 받을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/mrdoob/three.js/tree/dev/examples/jsm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mrdoob/three.js/tree/dev/examples/jsm&lt;/a&gt;에서 모듈들을 찾을 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dm9Pp6/btsiJ7nq9ed/PY3KN3R78rbaa5UF7r6mR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dm9Pp6/btsiJ7nq9ed/PY3KN3R78rbaa5UF7r6mR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dm9Pp6/btsiJ7nq9ed/PY3KN3R78rbaa5UF7r6mR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdm9Pp6%2FbtsiJ7nq9ed%2FPY3KN3R78rbaa5UF7r6mR0%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;2556&quot; height=&quot;1528&quot; data-origin-width=&quot;2556&quot; data-origin-height=&quot;1528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;OrbitControls은&lt;span&gt; &lt;a href=&quot;https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/OrbitControls.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mrdoob/three.js/blob/dev/examples/jsm/controls/OrbitControls.js&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;GLTFLoader은&lt;span&gt; &lt;a href=&quot;https://github.com/mrdoob/three.js/blob/dev/examples/jsm/loaders/GLTFLoader.js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/mrdoob/three.js/blob/dev/examples/jsm/loaders/GLTFLoader.js&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>Live Server</category>
      <category>module</category>
      <category>Three.js</category>
      <category>three.module.js</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/288</guid>
      <comments>https://carrotweb.tistory.com/288#entry288comment</comments>
      <pubDate>Mon, 5 Jun 2023 18:04:35 +0900</pubDate>
    </item>
    <item>
      <title>three.js CDN에서 가져오기 - script importmap module, serve, npx</title>
      <link>https://carrotweb.tistory.com/287</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;CDN에서 가져오기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Three.js를 CDN에서 가져와서 개발하기 위해 폴더를 생성합니다. 저는 &quot;C:\workspaces\webstudys\myworld2&quot; 폴더를 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하거나 Ctrl 키를 누를 상태에서 K, O를 이어서 누릅니다. (Ctrl + K, Ctrl + O) 그리고 &quot;C:\workspaces\webstudys\myworld2&quot; 폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누르면 폴더가 오픈됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Y8lz/btsivhjkPso/uHupZSvcMBjAFu2hy2ivk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Y8lz/btsivhjkPso/uHupZSvcMBjAFu2hy2ivk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Y8lz/btsivhjkPso/uHupZSvcMBjAFu2hy2ivk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Y8lz%2FbtsivhjkPso%2FuHupZSvcMBjAFu2hy2ivk1%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;보안을 위해 Trust(신뢰) 확인 창이 나타납니다.&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&quot;Yes, I Trust the authors&quot; 버튼을 누릅니다.&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;그리고 Welcome(시작) 창은 닫습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. index.html&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;파일을 생성하기 위해서 EXPLORER(탐색기)의 MYWORLD2를 선택하고 첫 번째 아이콘(New File...(새 파일))을 클릭하고 입력란에 &quot;index.html&quot;를 입력하고 Enter 키를 눌러 파일을 생성합니다. 그리고 에디터에서 &quot;!&quot;를 입력하고 &lt;span style=&quot;text-align: start;&quot;&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7DtbY/btsivREKVdm/fTvykjCgGp3D0ovMlKALj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7DtbY/btsivREKVdm/fTvykjCgGp3D0ovMlKALj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7DtbY/btsivREKVdm/fTvykjCgGp3D0ovMlKALj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7DtbY%2FbtsivREKVdm%2FfTvykjCgGp3D0ovMlKALj0%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;에디터에서&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;html:5&quot;를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;입력하고 Enter 키를 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNWX6y/btsivO83xdY/rhXy0IYJIIcQRyLbTE1ad0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNWX6y/btsivO83xdY/rhXy0IYJIIcQRyLbTE1ad0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNWX6y/btsivO83xdY/rhXy0IYJIIcQRyLbTE1ad0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNWX6y%2FbtsivO83xdY%2FrhXy0IYJIIcQRyLbTE1ad0%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러면 자동으로 HTML5 형식으로 만들어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltX1G/btsizdU1rQp/zugJhCkrK6znXqJ7oX4qh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltX1G/btsizdU1rQp/zugJhCkrK6znXqJ7oX4qh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltX1G/btsizdU1rQp/zugJhCkrK6znXqJ7oX4qh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltX1G%2FbtsizdU1rQp%2FzugJhCkrK6znXqJ7oX4qh0%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&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;lt;html&amp;gt; 태그에 있는 &quot;lang&quot; 속성은 제거합니다. 그리고 &amp;lt;title&amp;gt; 태그에 있는 &quot;Document&quot;를 제거하고 &quot;My first three.js app&quot;로 입력합니다. 그리고 &amp;lt;style&amp;gt; 태그를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685897819846&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;My first three.js app&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body { margin: 0; }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tbsmF/btsitUbq5zf/6K7efSc6GrPRdMsBP9AOsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tbsmF/btsitUbq5zf/6K7efSc6GrPRdMsBP9AOsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tbsmF/btsitUbq5zf/6K7efSc6GrPRdMsBP9AOsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtbsmF%2FbtsitUbq5zf%2F6K7efSc6GrPRdMsBP9AOsK%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. three.js를 CDN에서 가져오기 위해서 Import Map을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685894836793&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;importmap&quot;&amp;gt;
  // JSON object defining import
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;script type=&quot;importmap&quot;&amp;gt; 태그 안에는 JSON 객체로 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;스크립트에서 사용할 모듈들을 매핑합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;매핑 정보는 imports 객체에 속성(key)-값(vale) 쌍으로 이루어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686030652839&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;imports&quot; : {
		key : value
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성(key)에는 module-name(모듈 명, import form에서 사용할 이름),&amp;nbsp; 값(vale)은 모듈의 &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;절대 또는 상대 경로입니다. (상대 &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;경로&lt;/span&gt;는 항상 ./, ../, /로 시작해야 합니다.)&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;three.js 사이트에 있는 내용을 보면 &quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;three&quot;와 &quot;three/addons/&quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;을 매핑하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685894557292&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script async src=&quot;https://unpkg.com/es-module-shims@1.6.3/dist/es-module-shims.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&quot;importmap&quot;&amp;gt;
{
	&quot;imports&quot;: {
		&quot;three&quot;: &quot;https://unpkg.com/three@&amp;lt;version&amp;gt;/build/three.module.js&quot;,
		&quot;three/addons/&quot;: &quot;https://unpkg.com/three@&amp;lt;version&amp;gt;/examples/jsm/&quot;
	}
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;three/addons/&quot;은 &quot;three/example/jsm/&quot;에 있는 모듈들을 사용할 수 있게 매핑되어 있습니다.&amp;nbsp;(속성(key)이 &quot;/&quot;로 끝나고 값(vale)이 &quot;/&quot;로 끝나면 경로 밑에 있는 패키지 전체가 매핑되게 됩니다.) 그래서 controls, loaders, post-processing effects와 같은 기능들을 import에서 &quot;three/addons/&quot;으로 가져오게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;three.js를 가져오기 위해서 importmap에 있는 &amp;lt;version&amp;gt;를 three.js의 실제 버전으로 변경해야 합니다.&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;three.js의 최신 버전은 three 패키지 버전 리스트(&lt;a href=&quot;https://www.npmjs.com/package/three?activeTab=versions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.npmjs.com/package/three?activeTab=versions&lt;/a&gt;)에서 확인하시기 바랍니다. (2023년 6월 현재 최신 버전은 0.153.0입니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2444&quot; data-origin-height=&quot;1522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bufgu9/btsiwkUrCwS/1gYTMtkmhvKDkTGDea0wAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bufgu9/btsiwkUrCwS/1gYTMtkmhvKDkTGDea0wAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bufgu9/btsiwkUrCwS/1gYTMtkmhvKDkTGDea0wAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbufgu9%2FbtsiwkUrCwS%2F1gYTMtkmhvKDkTGDea0wAK%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;2444&quot; height=&quot;1522&quot; data-origin-width=&quot;2444&quot; data-origin-height=&quot;1522&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;lt;version&amp;gt;를 &quot;0.153.0&quot;으로 변경하여 &amp;lt;head&amp;gt;&amp;lt;/head&amp;gt; 태그 안에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685898070656&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;My first three.js app&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body { margin: 0; }
    &amp;lt;/style&amp;gt;
    &amp;lt;script async src=&quot;https://unpkg.com/es-module-shims@1.6.3/dist/es-module-shims.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;importmap&quot;&amp;gt;
    {
        &quot;imports&quot;: {
            &quot;three&quot;: &quot;https://unpkg.com/three@0.153.0/build/three.module.js&quot;,
            &quot;three/addons/&quot;: &quot;https://unpkg.com/three@0.153.0/examples/jsm/&quot;
        }
    }
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beifoI/btsiFNg9uFS/y49AYdpqVkIiFfHTEcWd70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beifoI/btsiFNg9uFS/y49AYdpqVkIiFfHTEcWd70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beifoI/btsiFNg9uFS/y49AYdpqVkIiFfHTEcWd70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeifoI%2FbtsiFNg9uFS%2Fy49AYdpqVkIiFfHTEcWd70%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;nbsp;type=&quot;importmap&quot;&amp;gt;는&amp;nbsp;&amp;lt;script&amp;nbsp;type=&quot;module&quot;&amp;gt;&amp;nbsp;태그&amp;nbsp;보다&amp;nbsp;앞에&amp;nbsp;있어야&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;그리고 import를 통해 three.js 모듈을 가져오기 위해 스크립트의 module을 추가하고 저장합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685900489556&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;module&quot;&amp;gt;
	import * as THREE from 'three';
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FsVku/btsiuJmRjQJ/6ik89rNTJtKRbG8oU0yl0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FsVku/btsiuJmRjQJ/6ik89rNTJtKRbG8oU0yl0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FsVku/btsiuJmRjQJ/6ik89rNTJtKRbG8oU0yl0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFsVku%2FbtsiuJmRjQJ%2F6ik89rNTJtKRbG8oU0yl0k%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&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;또는 importmap를 사용하지 않고 바로 사용할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686028442991&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;My first three.js app&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        body { margin: 0; }
    &amp;lt;/style&amp;gt;
    &amp;lt;script type=&quot;module&quot;&amp;gt;
        import * as THREE from 'https://unpkg.com/three@0.153.0/build/three.module.js';
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;importmap에 매핑된 경로를 보면 &quot;https://unpkg.com/&quot;로 되어 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;잠깐 unpkg에 대해 알아보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;UNPKG&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;패키지(패키지에 있는 파일이나 전체)를 쉽고 빠르게 URL로 로드할 수 있게 해주는 사이트입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1686033095628&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://unpkg.com/:package@:version/:file&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;three.js는&amp;nbsp;:package은 &quot;three&quot;, :version은 &quot;0.153.0&quot;, :file은 &quot;build/three.module.js&quot; 입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1686033939364&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://unpkg.com/three@0.153.0/build/three.module.js&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;자세한 설명은 UNPKG(&lt;a href=&quot;https://unpkg.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://unpkg.com/&lt;/a&gt;)를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐색기에서 index.html 파일을 더블 클릭하여 웹 브라우저에서 실행할 수 있지만 스크립트 모듈들이 보안상의 이유로 정상적으로 작동되지 않을 수 있습니다. 그래서 웹 서버를 통해 실행하는 것이 좋습니다.&lt;/p&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;span style=&quot;color: #333333;&quot;&gt;웹 서버로 실행하는 방법은 serve(Node.js 기반) 또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;라이브 서버(Live Server)를 사용하면 됩니다.&lt;/span&gt;&lt;/p&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;serve로 실행&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;serve가 설치되고 실행되기 위해서는 Node.js가 설치되어 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;윈도우 Node.js 다운로드 및 설치에 대한 자세한 설명은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&quot;&lt;a style=&quot;color: #3d62ce;&quot; href=&quot;https://carrotweb.tistory.com/106&quot;&gt;윈도우&amp;nbsp;Node.js 설치 - Windows Node.js Download &amp;amp; Install - 14.x&lt;/a&gt;&quot;를 참고하시기&amp;nbsp;바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다. 그리고 Vite(비트)를 실행하기 위해 Terminal(터미널)에서 npx 명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685899826899&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx serve .&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGWfQh/btsitGRJQil/kEGmStHCCcsIr7StC02ig1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGWfQh/btsitGRJQil/kEGmStHCCcsIr7StC02ig1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGWfQh/btsitGRJQil/kEGmStHCCcsIr7StC02ig1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGWfQh%2FbtsitGRJQil%2FkEGmStHCCcsIr7StC02ig1%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;serve가 설치된 적이 없으면 자동으로 최신 버전으로 설치를 진행해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Ok to proceed? (y)&quot;에서 Enter 키를 누르면 serve가 설치됩니다.&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;serve가 설치된 후 자동으로 localhost(로컬호스트, IP가 127.0.0.1)로 포트번호 3000으로 웹 서버가 실행됩니다.&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. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Terminal(터미널)에서 Local에 있는 URL(http://localhost:3000)에 마우스를 이동한 후 Ctrl 키를 누른 후 마우스를 클릭합니다. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그러면 기본 웹 브라우저가 실행됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zJLni/btsiJyjJ6Vu/J2yI9pEAPm2XiCfPYvgy6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zJLni/btsiJyjJ6Vu/J2yI9pEAPm2XiCfPYvgy6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zJLni/btsiJyjJ6Vu/J2yI9pEAPm2XiCfPYvgy6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzJLni%2FbtsiJyjJ6Vu%2FJ2yI9pEAPm2XiCfPYvgy6K%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&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;빈 페이지가 나올 겁니다. 아직 코드가 없어 내용이 없습니다. 정상적으로 three.js 모듈이 로드된 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브 서버(Live Server)로 실행&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;라이브 서버(Live Server)의 다운로드 및 설치에 대한 자세한 설명은 &quot;&lt;a href=&quot;https://carrotweb.tistory.com/274&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VSCode 웹 서버 설치, 포트 변경 - 라이브 서버(Live Server)&lt;/a&gt;&quot; 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. index.html 파일에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Open with Live Server&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjx4L3/btsiuMKHloZ/BXkttrsX1gQZjkH83dclKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjx4L3/btsiuMKHloZ/BXkttrsX1gQZjkH83dclKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjx4L3/btsiuMKHloZ/BXkttrsX1gQZjkH83dclKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjx4L3%2FbtsiuMKHloZ%2FBXkttrsX1gQZjkH83dclKK%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 index.html 파일 편집기에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Open with Live Server&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmxL62/btsiFB8UfVZ/C2qk575pIMPFzWfJLaGmmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmxL62/btsiFB8UfVZ/C2qk575pIMPFzWfJLaGmmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmxL62/btsiFB8UfVZ/C2qk575pIMPFzWfJLaGmmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmxL62%2FbtsiFB8UfVZ%2FC2qk575pIMPFzWfJLaGmmk%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&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;2. 기본 브라우저로 설정된 웹 브라우저가 실행됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;localhost(로컬호스트, IP가 127.0.0.1)로 포트번호 5500으로 웹 서버가 실행됩니다. (저는 포트번호를 9000으로 변경하였습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2UyLr/btsiuAKdTzf/CIaNipsRevOcXUU8F7IzZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2UyLr/btsiuAKdTzf/CIaNipsRevOcXUU8F7IzZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2UyLr/btsiuAKdTzf/CIaNipsRevOcXUU8F7IzZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2UyLr%2FbtsiuAKdTzf%2FCIaNipsRevOcXUU8F7IzZK%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;2640&quot; height=&quot;1620&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1620&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;빈 페이지가 나올 겁니다. 아직 코드가 없어 내용이 없습니다. 정상적으로 three.js 모듈이 로드된 겁니다.&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;이어서 Scene, Geometry, Camera, Renderer를 사용하여 3D를 만들어 보겠습니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>importmap</category>
      <category>Live Server</category>
      <category>module</category>
      <category>serve</category>
      <category>Three.js</category>
      <category>UNPKG</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/287</guid>
      <comments>https://carrotweb.tistory.com/287#entry287comment</comments>
      <pubDate>Mon, 5 Jun 2023 18:03:51 +0900</pubDate>
    </item>
    <item>
      <title>three.js NPM으로 설치 - Node.js  Vite(비트 - Build Tool)</title>
      <link>https://carrotweb.tistory.com/286</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Node.js 기반으로 개발하기 위해서 윈도우에 Node.js가 설치되어 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code로 개발을 하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 Node.js 다운로드 및 설치에 대한 자세한 설명은 &quot;&lt;a style=&quot;color: #3d62ce;&quot; href=&quot;https://carrotweb.tistory.com/106&quot;&gt;윈도우 Node.js 설치 - Windows Node.js Download &amp;amp; Install - 14.x&lt;/a&gt;&quot;를 참고하시기&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: #555555; text-align: start;&quot;&gt;Visual Studio Code 다운로드 및 설치에 대한 자세한 설명은 &quot;&lt;/span&gt;&lt;a href=&quot;https://carrotweb.tistory.com/270&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Visual Studio Code 다운로드 및 설치 - 1.78 Download &amp;amp; Install - April 2023&lt;/a&gt;&quot;를 참고하시기&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: #555555; text-align: start;&quot;&gt;Visual Studio Code에서 Node 패키지 생성에 대한 자세한 설명은 &lt;/span&gt;&quot;&lt;a href=&quot;https://carrotweb.tistory.com/275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VSCode Node 개발 - 패키지 생성 및 실행, npm init&lt;/a&gt;&quot;를 참고하시기&amp;nbsp;바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Node 패키지 생성 및 모듈 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Three.js를 개발하기 위해 폴더를 생성합니다. 저는 &quot;C:\workspaces\webstudys\myworld1&quot; 폴더를 생성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하거나 Ctrl 키를 누를 상태에서 K, O를 이어서 누릅니다. (Ctrl + K, Ctrl + O) 그리고 &quot;C:\workspaces\webstudys\myworld1&quot; 폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누르면 폴더가 오픈됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eu8687/btsivhQLcRj/iRyDTASF7pCSWub9Py8Ue1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eu8687/btsivhQLcRj/iRyDTASF7pCSWub9Py8Ue1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eu8687/btsivhQLcRj/iRyDTASF7pCSWub9Py8Ue1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feu8687%2FbtsivhQLcRj%2FiRyDTASF7pCSWub9Py8Ue1%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;보안을 위해 Trust(신뢰) 확인 창이 나타납니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&quot;Yes, I Trust the authors&quot; 버튼을 누릅니다. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 Welcome(시작) 창은 닫습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;3. Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다. 그리고 Node&amp;nbsp;패키지를&amp;nbsp;생성하기&amp;nbsp;위해&amp;nbsp;Terminal(터미널)에서&amp;nbsp;npm&amp;nbsp;init&amp;nbsp;명령어를&amp;nbsp;입력하고&amp;nbsp;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciZZpG/btsisQUtFve/rqoVW2LShEmkrjl9nFTWok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciZZpG/btsisQUtFve/rqoVW2LShEmkrjl9nFTWok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciZZpG/btsisQUtFve/rqoVW2LShEmkrjl9nFTWok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciZZpG%2FbtsisQUtFve%2FrqoVW2LShEmkrjl9nFTWok%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;기본 설정으로 Node 패키지를 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;(변경하려면 입력하고 Enter 키를 누르면 됩니다. 기본 값을 사용하려면 그냥 Enter 키를 누르면 됩니다.)&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package name는 패키지 명입니다. (myworld1)는 기본 값으로 폴더 명입니다. 그냥 Enter 키를 누릅니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;version는 패키지 버전입니다. (1.0.0)는 기본 값입니다. 그냥&amp;nbsp;Enter 키를 누릅니다.&lt;/li&gt;
&lt;li&gt;description는 패키지에 대한 설명입니다. 저는 간단하게 &quot;my world&quot;를 입력하고 Enter 키를 눌렀습니다.&lt;/li&gt;
&lt;li&gt;entry point는 시작 파일 명입니다. (index.js)는 기본 값입니다. 그냥&amp;nbsp;Enter 키를 누릅니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;test command는 npm test를 호출할 때마다 실행되는 명령입니다. 그냥&amp;nbsp;Enter 키를 누릅니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;git repository는 패키지가 저장되어 있는 Git 저장소의 URL입니다. 그냥&amp;nbsp;Enter 키를 누릅니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;keywords는 패키지의 키워드입니다. 그냥&amp;nbsp;Enter 키를 누릅니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;author는 작성자의 이름입니다. 저는 계정인 &quot;carrotweb&quot;를 입력하고&amp;nbsp;Enter 키를 눌렀습니다.&lt;/li&gt;
&lt;li&gt;license는 패키지 사용에 대한 라이선스입니다. (ISC)는 기본 값입니다. 그냥&amp;nbsp;Enter 키를 누릅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&quot;Is tis OK? (yes)&quot;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Enter 키를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;누르면 package.json 파일이 생성됩니다.&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;4. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Three.js를&lt;span&gt; 설치하기 위해서 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Terminal(터미널)에서&amp;nbsp;&lt;/span&gt;npm install 명령어를 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;입력하고&amp;nbsp;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685811484134&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save three&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J9INb/btsiuAC6fp1/JIKitMMky6PpMYXncPgkR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J9INb/btsiuAC6fp1/JIKitMMky6PpMYXncPgkR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J9INb/btsiuAC6fp1/JIKitMMky6PpMYXncPgkR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ9INb%2FbtsiuAC6fp1%2FJIKitMMky6PpMYXncPgkR0%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 node_modules&amp;nbsp;폴더가&amp;nbsp;생성되고 Three.js 관련 모듈들이 추가됩니다.&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;5. vite(비트)&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;설치하기 위해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Terminal(터미널)에서&amp;nbsp;&lt;/span&gt;npm install 명령어를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;입력하고&amp;nbsp;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685811821894&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --save-dev vite&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9fGrY/btsitUhKOnk/vGaFc9NtDY9KudjVYKC9CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9fGrY/btsitUhKOnk/vGaFc9NtDY9KudjVYKC9CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9fGrY/btsitUhKOnk/vGaFc9NtDY9KudjVYKC9CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9fGrY%2FbtsitUhKOnk%2FvGaFc9NtDY9KudjVYKC9CK%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러면 node_modules 폴더에&lt;span&gt; vite&lt;/span&gt;&lt;/span&gt;&amp;nbsp;관련 모듈들이 추가됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite(비트)는 개발 중에만 사용하기 위해서 npm install에 옵션을 --save-dev로 하였습니다.&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;Vite(&lt;a href=&quot;https://vitejs.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://vitejs.dev/&lt;/a&gt;)는 빌드 도구(Build Tool)입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBQNy/btsisNpUSMr/HZNll06su99PUzKFSuWeC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBQNy/btsisNpUSMr/HZNll06su99PUzKFSuWeC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBQNy/btsisNpUSMr/HZNll06su99PUzKFSuWeC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBQNy%2FbtsisNpUSMr%2FHZNll06su99PUzKFSuWeC0%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;2298&quot; height=&quot;1500&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 설명은 한글로 설명된 Vite 사이트(&lt;a href=&quot;https://vitejs-kr.github.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://vitejs-kr.github.io/&lt;/a&gt;)를 참고하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vite(비트)를 사용하면 변경된(작업하여 저장한) 소스 코드가 로컬 웹 서버에 즉시 반영되어 웹 브라우저에서 바로 확인할 수 있습니다.&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;이제 three.js를 개발할 수 있는 기본 환경이 만들어졌습니다.&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: #555555; text-align: start;&quot;&gt;Terminal(터미널)를 닫습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;기본 HTML과 JS 파일 생성 및 실행&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. index.html&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt; 파일을 생성하기 위해서 EXPLORER(탐색기)의 MYWORLD1을 선택하고 첫 번째 아이콘(New File...(새 파일))을 클릭하고 입력란에 &quot;index.html&quot;를 입력하고 Enter 키를 눌러 파일을 생성합니다. 그리고 three.js 사이트에서 있는 샘플 내용을 복사하여 붙여 넣고 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685816385787&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;My first three.js app&amp;lt;/title&amp;gt;
		&amp;lt;style&amp;gt;
			body { margin: 0; }
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;script type=&quot;module&quot; src=&quot;/main.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vXAU5/btsitHvUlpF/xNuQsjDkO6UkPxZkRhv070/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vXAU5/btsitHvUlpF/xNuQsjDkO6UkPxZkRhv070/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vXAU5/btsitHvUlpF/xNuQsjDkO6UkPxZkRhv070/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvXAU5%2FbtsitHvUlpF%2FxNuQsjDkO6UkPxZkRhv070%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&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;2. main.js&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 생성하기 위해서 EXPLORER(탐색기)의 MYWORLD1을 선택하고 첫 번째 아이콘(New File...(새 파일))을 클릭하고 입력란에 &quot;main.js를 입력하고 Enter 키를 눌러 파일을 생성합니다. 그리고 three.js 사이트에서 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;샘플 내용을 복사하여 붙여 넣고 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685816368520&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import * as THREE from 'three';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;import를 통해 three.js 모듈을 가져옵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U45R9/btsis1nSwyl/dhiJZ2fiQA9fPKq27Jvjdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U45R9/btsis1nSwyl/dhiJZ2fiQA9fPKq27Jvjdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U45R9/btsis1nSwyl/dhiJZ2fiQA9fPKq27Jvjdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU45R9%2Fbtsis1nSwyl%2FdhiJZ2fiQA9fPKq27Jvjdk%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&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;그럼, Vite(비트)를 통해 확인해 보겠습니다.&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;3. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다. 그리고 Vite(비트)를 실행하기 위해 Terminal(터미널)에서 npx 명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1685816517331&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx vite&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/onL5H/btsiu1f7fx8/Akd0PUKpGQC0VDRWxx8k4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/onL5H/btsiu1f7fx8/Akd0PUKpGQC0VDRWxx8k4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/onL5H/btsiu1f7fx8/Akd0PUKpGQC0VDRWxx8k4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FonL5H%2Fbtsiu1f7fx8%2FAkd0PUKpGQC0VDRWxx8k4K%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 localhost(로컬호스트, IP가 127.0.0.1)로 포트번호 5173으로 웹 서버가 실행됩니다.&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: #555555; text-align: start;&quot;&gt;4. Terminal(터미널)에서 Local에 있는 URL에 마우스를 이동한 후 Ctrl 키를 누른 후 마우스를 클릭합니다. 그러면 기본 웹 브라우저가 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNCAzB/btsiBJyWCqq/7REm4H6t70bBCMR7NssNL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNCAzB/btsiBJyWCqq/7REm4H6t70bBCMR7NssNL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNCAzB/btsiBJyWCqq/7REm4H6t70bBCMR7NssNL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNCAzB%2FbtsiBJyWCqq%2F7REm4H6t70bBCMR7NssNL1%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;2636&quot; height=&quot;1620&quot; data-origin-width=&quot;2636&quot; data-origin-height=&quot;1620&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;빈 페이지가 나올 겁니다. 아직 코드가 없어 내용이 없습니다. 정상적으로 three.js 모듈이 로드된 겁니다.&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;이어서 Scene, Geometry, Camera, Renderer를 사용하여 3D를 만들어 보겠습니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>node.js</category>
      <category>Three.js</category>
      <category>ViTE</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/286</guid>
      <comments>https://carrotweb.tistory.com/286#entry286comment</comments>
      <pubDate>Mon, 5 Jun 2023 18:03:01 +0900</pubDate>
    </item>
    <item>
      <title>three.js 소개</title>
      <link>https://carrotweb.tistory.com/285</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Three.js는 자바스크립트 3D 라이브러리(JavaScript 3D library)로 웹 브라우저에서 3D를 표현(Rendering, 렌더링)할 수 있게 해 줍니다.&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;Three.js 사이트(&lt;a href=&quot;https://threejs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://threejs.org/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;1498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LL4VA/btsiusFfsGz/k8Y3XcEkwYvDZOV2ZjZkpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LL4VA/btsiusFfsGz/k8Y3XcEkwYvDZOV2ZjZkpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LL4VA/btsiusFfsGz/k8Y3XcEkwYvDZOV2ZjZkpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLL4VA%2FbtsiusFfsGz%2Fk8Y3XcEkwYvDZOV2ZjZkpk%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;2298&quot; height=&quot;1498&quot; data-origin-width=&quot;2298&quot; data-origin-height=&quot;1498&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;Three.js는 오픈 소스 프로젝트로 GitHub에 공개되어 있다. (&lt;a href=&quot;https://github.com/mrdoob/three.js/&quot;&gt;https://github.com/mrdoob/three.js/&lt;/a&gt;)&lt;/p&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Three.js는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;GitHub에서 다음처럼 설명하고 있습니다.&lt;/p&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;JavaScript 3D library&lt;br /&gt;The aim of the project is to create an easy to use, lightweight, cross-browser, general purpose 3D library.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;The current builds only include a WebGL renderer but WebGPU (experimental), SVG and CSS3D renderers are also available asaddons.&lt;/p&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;자바스크립트 3D 라이브러리&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트의 목표는 범용 3D 라이브러리로 모든 웹 브라우저(cross-browser)에서 가볍(lightweight)고 쉽게 사용(easy to use)할 수 있게 하는 겁니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현재 빌드에는 WebGL 렌더러만 포함되어 있습니다. 그러나 WebGPU(실험적), SVG 그리고 CSS3D 렌더러를 애드온으로 사용할 수 있습니다.&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;Three.js는 WebGL로 렌더링 됩니다.&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;WebGL(Web Graphics Library)은 HTML5의 Canvas 요소(&amp;lt;canvas&amp;gt;)에 OpenGL ES 2.0의 3D 그래픽 API를 이용하여 렌더링 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blkBmM/btsiFPlKdVN/ELJOmbmzsy4pttSkyrKOKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blkBmM/btsiFPlKdVN/ELJOmbmzsy4pttSkyrKOKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blkBmM/btsiFPlKdVN/ELJOmbmzsy4pttSkyrKOKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblkBmM%2FbtsiFPlKdVN%2FELJOmbmzsy4pttSkyrKOKk%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;500&quot; height=&quot;150&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;266&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉, Three.js는 WebGL를 기반으로 3D 라이브러리를 만든 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;자바스크립트로 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;웹 브라우저에서 쉽게 3D를 표현(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Rendering,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;렌더링)할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Three.js를 이용하여 개발하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://carrotweb.tistory.com/286&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Node.js로 Three.js를 설치하고 Node 패키지를 생성하여 개발&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://carrotweb.tistory.com/287&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;웹 페이지에서 &amp;lt;script&amp;gt; 태그로 CDN에 있는 Three.js를 가져와서 개발&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://carrotweb.tistory.com/288&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Three.js를 다운로드하여 웹 페이지에서&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;script&amp;gt; 태그로 로드하여 개발&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 개발하는 방법에 대해 설명하겠습니다.&lt;/p&gt;</description>
      <category>Three.js/기초튼튼</category>
      <category>Canvas</category>
      <category>html5</category>
      <category>JavaScript 3D library</category>
      <category>OpenGL</category>
      <category>Three.js</category>
      <category>webgl</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/285</guid>
      <comments>https://carrotweb.tistory.com/285#entry285comment</comments>
      <pubDate>Mon, 5 Jun 2023 18:02:23 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ WAR 만들기 - Maven Package, Community Edition</title>
      <link>https://carrotweb.tistory.com/284</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;IntelliJ Community Edition은 Ultimate Edition의 Artifacts에 있는 Web Application, JavaEE Application, EJB Application를 지원하지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTu5ZR/btshChSuKio/Txy9uPr47RRmdOyKyHQjcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTu5ZR/btshChSuKio/Txy9uPr47RRmdOyKyHQjcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTu5ZR/btshChSuKio/Txy9uPr47RRmdOyKyHQjcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTu5ZR%2FbtshChSuKio%2FTxy9uPr47RRmdOyKyHQjcK%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 직접 Maven의 package를 실행해줘야 합니다.&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;메이븐 프로젝트 패키징하기 - WAR 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;intelliJ IDE의 오른쪽에 세로로 있는 Maven를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7cEDn/btshVAJDeTv/Jp8BXSSNi4QdQRAxxqeRF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7cEDn/btshVAJDeTv/Jp8BXSSNi4QdQRAxxqeRF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7cEDn/btshVAJDeTv/Jp8BXSSNi4QdQRAxxqeRF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7cEDn%2FbtshVAJDeTv%2FJp8BXSSNi4QdQRAxxqeRF0%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;2. Maven Lifecycle에서 package를 선택하고 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Run 'test2 [package]'&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FZUqn/btshG7obKsd/HD82c4mqgn3bB1lNeVI5h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FZUqn/btshG7obKsd/HD82c4mqgn3bB1lNeVI5h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FZUqn/btshG7obKsd/HD82c4mqgn3bB1lNeVI5h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFZUqn%2FbtshG7obKsd%2FHD82c4mqgn3bB1lNeVI5h1%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;600&quot; height=&quot;848&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;848&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;그러면 target 폴더에 artifact가 출력됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DyRnq/btshFaFk6pW/uLqg1KnpKF014G7KvxSktK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DyRnq/btshFaFk6pW/uLqg1KnpKF014G7KvxSktK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DyRnq/btshFaFk6pW/uLqg1KnpKF014G7KvxSktK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDyRnq%2FbtshFaFk6pW%2FuLqg1KnpKF014G7KvxSktK%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;로그를 보면 target 폴더에 test2 폴더를 생성하여 컴파일된 클래스들과 리소스들을 출력하고 war 파일을 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685376401193&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[INFO] --- maven-war-plugin:2.2:war (default-war) @ test2 ---
[INFO] Packaging webapp
[INFO] Assembling webapp [test2] in [C:\workspaces\studyj\test2\target\test2]
[INFO] Processing war project
[INFO] Copying webapp resources [C:\workspaces\studyj\test2\src\main\webapp]
[INFO] Webapp assembled in [22 msecs]
[INFO] Building war: C:\workspaces\studyj\test2\target\test2.war&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;target 폴더에 있는 test2 폴더를 복사하거나 war 파일을 복사하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;웹 서버로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;옮기면 됩니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>IntelliJ Community</category>
      <category>artifacts</category>
      <category>maVen</category>
      <category>maven lifecycle</category>
      <category>package</category>
      <category>war</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/284</guid>
      <comments>https://carrotweb.tistory.com/284#entry284comment</comments>
      <pubDate>Tue, 30 May 2023 01:25:35 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ Maven Project Folder 구조 -  Community Edition</title>
      <link>https://carrotweb.tistory.com/283</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;메이븐 프로젝트 폴더 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. intelliJ IDE의 메뉴 File &amp;gt; Project Structure를 클릭하거나 Ctrl + Alt + Shift + S 키를&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. Project Structure 대화상자에서 Project Settings에 있는 Modules를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLQwh/btshCdbgoVe/GLNLtsOrNfyXObBktLxUPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLQwh/btshCdbgoVe/GLNLtsOrNfyXObBktLxUPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLQwh/btshCdbgoVe/GLNLtsOrNfyXObBktLxUPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLQwh%2FbtshCdbgoVe%2FGLNLtsOrNfyXObBktLxUPk%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&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;Project Structure 대화상자의 오른쪽에 붉은색으로 필요한 폴더를 보여줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YyRBe/btshA4F2CaS/yWXHnJ0gtKKJY2uoojiGf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YyRBe/btshA4F2CaS/yWXHnJ0gtKKJY2uoojiGf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YyRBe/btshA4F2CaS/yWXHnJ0gtKKJY2uoojiGf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYyRBe%2FbtshA4F2CaS%2FyWXHnJ0gtKKJY2uoojiGf0%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;400&quot; height=&quot;283&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src\main 폴더에 소스 폴더(java)가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src 폴더에 테스트 소스 폴더(test)가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src\test 폴더에 테스트 리소스(resources) 폴더가 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메이븐 프로젝트에서 필요한 폴더를 생성하도록 하겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. java 소스 폴더를 생성하기 위해 src\main 폴더를 선택하고 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;New Directory...&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxqnd/btshMVguJQw/BRylhvbl5q7cGuTROFQt3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxqnd/btshMVguJQw/BRylhvbl5q7cGuTROFQt3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxqnd/btshMVguJQw/BRylhvbl5q7cGuTROFQt3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsxqnd%2FbtshMVguJQw%2FBRylhvbl5q7cGuTROFQt3K%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 명으로 &quot;java&quot;를 입력하고 &quot;OK&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6xfkr/btshAvcD53J/Jtzqsngf32pcBuEMor8i61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6xfkr/btshAvcD53J/Jtzqsngf32pcBuEMor8i61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6xfkr/btshAvcD53J/Jtzqsngf32pcBuEMor8i61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6xfkr%2FbtshAvcD53J%2FJtzqsngf32pcBuEMor8i61%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;440&quot; height=&quot;145&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 src\main 폴더에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파란색 폴더 아이콘으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;java 폴더가 생성됩니다. 자동으로 폴더가 소스 폴더(Sources)로 설정됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생성된 java 폴더를 클릭하면 상단의 Make as에 Sources가 선택된 것을 확인할 수 있습니다. 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 보면 Sources가 체크되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cji6EJ/btshG8ADNtL/1ynM8YvTbH4fkPGRWa1kyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cji6EJ/btshG8ADNtL/1ynM8YvTbH4fkPGRWa1kyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cji6EJ/btshG8ADNtL/1ynM8YvTbH4fkPGRWa1kyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcji6EJ%2FbtshG8ADNtL%2F1ynM8YvTbH4fkPGRWa1kyk%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, Make as에 Sources가 선택되어 있지 않는다면 선택하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;test 소스 폴더를 생성하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;src 폴더를 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;New Directory...&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBmpoj/btshE0iyLUG/YnCjCGmAGIkqKchcA5wkLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBmpoj/btshE0iyLUG/YnCjCGmAGIkqKchcA5wkLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBmpoj/btshE0iyLUG/YnCjCGmAGIkqKchcA5wkLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBmpoj%2FbtshE0iyLUG%2FYnCjCGmAGIkqKchcA5wkLk%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 명으로 &quot;test&quot;를 입력하고 &quot;OK&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uUIl1/btshVAW9zp3/EwXRiPaMbDP0aSuaRh04Lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uUIl1/btshVAW9zp3/EwXRiPaMbDP0aSuaRh04Lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uUIl1/btshVAW9zp3/EwXRiPaMbDP0aSuaRh04Lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuUIl1%2FbtshVAW9zp3%2FEwXRiPaMbDP0aSuaRh04Lk%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;440&quot; height=&quot;145&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 src 폴더에&lt;span&gt; 녹색&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;폴더 아이콘으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;test 폴더가 생성됩니다. 자동으로 폴더가 테스트 폴더(Tests)로 설정됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;생성된 test 폴더를 클릭하면 상단의 Make as에 Tests가 선택된 것을 확인할 수 있습니다. 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 보면 Tests가 체크되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pm7B4/btshBi4Vagp/xVvRg9s8yjQsK7KG3IOCL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pm7B4/btshBi4Vagp/xVvRg9s8yjQsK7KG3IOCL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pm7B4/btshBi4Vagp/xVvRg9s8yjQsK7KG3IOCL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpm7B4%2FbtshBi4Vagp%2FxVvRg9s8yjQsK7KG3IOCL0%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;만약,&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Make as에 Tests가 선택되어 있지 않는다면 선택하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이이서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;생성된 test 폴더에 resources 폴더를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 src\test 폴더에&lt;span&gt;&lt;span&gt; 회색&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;폴더 아이콘으로&lt;span&gt; resources &lt;/span&gt;&lt;/span&gt;폴더가 생성됩니다. 자동으로 폴더가 테스트 리소스(Test Resources)로 설정됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;생성된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;resources&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;폴더를 클릭하면 상단의 Make as에 Test Resources가 선택된 것을 확인할 수 있습니다. 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 보면 Test Resources가 체크되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsnC9q/btshHNQCjCE/cwlGFbHmSkh40bh3mCIGn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsnC9q/btshHNQCjCE/cwlGFbHmSkh40bh3mCIGn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsnC9q/btshHNQCjCE/cwlGFbHmSkh40bh3mCIGn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsnC9q%2FbtshHNQCjCE%2FcwlGFbHmSkh40bh3mCIGn1%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&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;Project Structure 대화상자의 &quot;OK&quot; 버튼을 눌러 적용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 다시 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;intelliJ IDE의 메뉴 File &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Project Structure를 클릭하여 &lt;/span&gt;Project Structure 대화상자에서 Project Settings에 있는 Modules를 선택해서 보면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;붉은색이 &lt;/span&gt;없어진 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciGWvk/btshE0bNrUo/903aBwyEO1iFWq6oDKdnPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciGWvk/btshE0bNrUo/903aBwyEO1iFWq6oDKdnPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciGWvk/btshE0bNrUo/903aBwyEO1iFWq6oDKdnPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciGWvk%2FbtshE0bNrUo%2F903aBwyEO1iFWq6oDKdnPk%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;JUnit으로 테스트 클래스를 생성하려면 src\test 폴더에 java 폴더가 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 src\test 폴더에 java 폴더를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src\test 폴더가 테스트 폴더(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Tests)로 되어 있기 때문에 Make as로 Tests를 선택하지 않아도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLmjRs/btshBkPfPG3/NcGMznKo56E6tzQZ0fvP91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLmjRs/btshBkPfPG3/NcGMznKo56E6tzQZ0fvP91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLmjRs/btshBkPfPG3/NcGMznKo56E6tzQZ0fvP91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLmjRs%2FbtshBkPfPG3%2FNcGMznKo56E6tzQZ0fvP91%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&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;5. 프로젝트를 패키징하여 컴파일된 결과를 출력할 폴더가 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 최상위 폴더를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;New Directory...&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czkRo3/btshBkBIJII/AqcAF3Q6ps5j7asqKqYhk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czkRo3/btshBkBIJII/AqcAF3Q6ps5j7asqKqYhk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czkRo3/btshBkBIJII/AqcAF3Q6ps5j7asqKqYhk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczkRo3%2FbtshBkBIJII%2FAqcAF3Q6ps5j7asqKqYhk1%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 명으로 &quot;target&quot;를 입력하고 &quot;OK&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UjotD/btshCe9fPxj/dUtYaewTnxCfoiVVk1aVZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UjotD/btshCe9fPxj/dUtYaewTnxCfoiVVk1aVZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UjotD/btshCe9fPxj/dUtYaewTnxCfoiVVk1aVZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUjotD%2FbtshCe9fPxj%2FdUtYaewTnxCfoiVVk1aVZK%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;440&quot; height=&quot;145&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;최상위&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;폴더에&lt;span&gt;&lt;span&gt; 회색&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;폴더 아이콘으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;target 폴더가 생성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pUza1/btshTwACI8z/WM74k5QWWLKHxC4yLd2E9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pUza1/btshTwACI8z/WM74k5QWWLKHxC4yLd2E9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pUza1/btshTwACI8z/WM74k5QWWLKHxC4yLd2E9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpUza1%2FbtshTwACI8z%2FWM74k5QWWLKHxC4yLd2E9k%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;2014&quot; height=&quot;1446&quot; data-origin-width=&quot;2014&quot; data-origin-height=&quot;1446&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;이어서 WebApp를 배포하기 위해 WAR로 패키징 하는 방법에 대해 알아보겠습니다.&lt;/p&gt;</description>
      <category>IntelliJ Community</category>
      <category>Project structure</category>
      <category>Source Folder</category>
      <category>Test Resource Folder</category>
      <category>Test Source Folder</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/283</guid>
      <comments>https://carrotweb.tistory.com/283#entry283comment</comments>
      <pubDate>Tue, 30 May 2023 01:02:36 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ WebApp Maven Project 생성 - WebApp, maven-archetype-webapp, URI is not registered</title>
      <link>https://carrotweb.tistory.com/282</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;WebApp &lt;b&gt;Maven&lt;span&gt; &lt;/span&gt;&lt;/b&gt;Project(웹앱 &lt;b&gt;메이븐&lt;span&gt; &lt;/span&gt;&lt;/b&gt;프로젝트) 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;New Project&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxDol/btshFakQIJb/tUkud6Dw4WRnC9g4D7tzL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxDol/btshFakQIJb/tUkud6Dw4WRnC9g4D7tzL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxDol/btshFakQIJb/tUkud6Dw4WRnC9g4D7tzL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrxDol%2FbtshFakQIJb%2FtUkud6Dw4WRnC9g4D7tzL0%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;1578&quot; height=&quot;1288&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&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;2. New Project 대화상자에서 Generators에 있는 Maven Archetype를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk4lfR/btshHNJEbNV/CZdczcm0zbRM3inTZoTdOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk4lfR/btshHNJEbNV/CZdczcm0zbRM3inTZoTdOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk4lfR/btshHNJEbNV/CZdczcm0zbRM3inTZoTdOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk4lfR%2FbtshHNJEbNV%2FCZdczcm0zbRM3inTZoTdOk%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;1578&quot; height=&quot;1320&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1320&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;저는 프로젝트 이름(Name)을 &amp;nbsp;&quot;test2&quot;로 입력하였습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;프로젝트 경로(Location)는 &quot;C:\workspaces\studyj&quot;로 하였습니다. (&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Git 연동은 다음에 하도록 하겠습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;JDK는 이전에 설치한 &quot;Eclipse Temurin Version 1.8.0_372&quot;를 선택하였습니다.&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;(&quot;Eclipse Temurin Version 1.8.0_372&quot; 버전 JDK 설치는 여기(&lt;a href=&quot;https://carrotweb.tistory.com/280&quot;&gt;https://carrotweb.tistory.com/280&lt;/a&gt;)를 참고하시기 바랍니다.&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;메이븐 카탈로그(Catalog)는 &quot;Internal&quot;를 선택하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;메이븐 카탈로그(Catalog)는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Internal: 메이븐 배포판에 있는 시스템 카탈로그&lt;/li&gt;
&lt;li&gt;Default Local: 나의 시스템의 .m2 디렉터리에 있는 카탈로그&lt;/li&gt;
&lt;li&gt;Maven Central: 메이븐 중앙 저장소에 있는 카탈로그&lt;/li&gt;
&lt;/ul&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;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;메이븐 아키타입(Archetype)은 &quot;&lt;/span&gt;org.apache.maven.archetypes:maven-archetype-webapp&quot;를 선택하였습니다.&lt;/span&gt;&lt;/p&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;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;메이븐 아키타입(&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;Archetype&lt;/span&gt;)란, &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;사전적 의미로 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;&quot;원형&quot;입니다. 이 &quot;원형&quot;은 복사본을 만들 수 있는 &quot;원본&quot;을 뜻합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;즉, 메이븐 &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;아키타입(Archetype)을&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt; 사용하면 &lt;/span&gt;이미 만들어진 구성으로 동일하게 프로젝트를 만들 수 있어 편리합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;(메이븐 아키타입(&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;Archetype&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;)은 메이븐 카탈로그(Catalog)에 따라 달라집니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;메이븐&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;아키타입 &lt;/span&gt;버전(Version)은 &quot;1.0&quot;를 선택하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bihqqX/btshPpaw0g7/plikydkkX6zKPG32FxFDBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bihqqX/btshPpaw0g7/plikydkkX6zKPG32FxFDBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bihqqX/btshPpaw0g7/plikydkkX6zKPG32FxFDBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbihqqX%2FbtshPpaw0g7%2FplikydkkX6zKPG32FxFDBK%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;1578&quot; height=&quot;1320&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1320&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;&quot;Advanced Setting&quot;를 클릭하여 Artifact(아티팩트)를 설정하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;GroupId&quot;는 &quot;com.home.study&quot;으로 입력하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;ArtifactId&quot;는 기본적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로젝트 이름(Name)으로 되어 있습니다. 그대로 사용하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Version&quot;은 기본값인 &quot;1.0-SNAPSHOT&quot;으로 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Y9YQ/btshCbElyYg/yxTcibzoZmBmnUMkOx8qjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Y9YQ/btshCbElyYg/yxTcibzoZmBmnUMkOx8qjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Y9YQ/btshCbElyYg/yxTcibzoZmBmnUMkOx8qjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Y9YQ%2FbtshCbElyYg%2FyxTcibzoZmBmnUMkOx8qjK%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;1578&quot; height=&quot;1536&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Create&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. intelliJ IDE에&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Maven 프로젝트로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;WebApp을 만들 수 있는 샘플 코드와 함께 &lt;/span&gt;생성됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5j3KM/btshRxsHDuo/kNAKOEJVu3BbWxbgKvIvK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5j3KM/btshRxsHDuo/kNAKOEJVu3BbWxbgKvIvK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5j3KM/btshRxsHDuo/kNAKOEJVu3BbWxbgKvIvK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5j3KM%2FbtshRxsHDuo%2FkNAKOEJVu3BbWxbgKvIvK0%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 생성되자마자 maven-archetype-plugin-3.2.1을 다운로드하고 plugin과 관련된 모듈들을 다운로드합니다.&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;pom.xml를 보면 New Project 대화상자에서 설정한 정보들로 설정된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685355884540&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
  &amp;lt;groupId&amp;gt;com.home.study&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;test2&amp;lt;/artifactId&amp;gt;
  &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
  &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
  &amp;lt;name&amp;gt;test2 Maven Webapp&amp;lt;/name&amp;gt;
  &amp;lt;url&amp;gt;http://maven.apache.org&amp;lt;/url&amp;gt;
  &amp;lt;dependencies&amp;gt;
    &amp;lt;dependency&amp;gt;
      &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
      &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
      &amp;lt;version&amp;gt;3.8.1&amp;lt;/version&amp;gt;
      &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
    &amp;lt;/dependency&amp;gt;
  &amp;lt;/dependencies&amp;gt;
  &amp;lt;build&amp;gt;
    &amp;lt;finalName&amp;gt;test2&amp;lt;/finalName&amp;gt;
  &amp;lt;/build&amp;gt;
&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;packaging&amp;gt;는 기본값으로 &quot;war&quot;로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Package는 프로젝트의 패키징 방식으로 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;jar(Java Archive)는 여러 개의 자바 클래스나 리소스, 메타데이터 등을 하나의 파일로 압축합니다.&lt;/li&gt;
&lt;li&gt;pom(Project Object Model)는 프로젝트의 라이브러리 의존성(dependencies), 모듈(modules), 정보(properties), 저장소(repositories), 빌드(build) 등을 관리하는 관리 파일입니다.&lt;/li&gt;
&lt;li&gt;war(Web application ARchive)는 자바 클래스, 서버 페이지(jsp), XML, HTML, 스크립트, 이미지 등 웹 프로젝트의 모든 파일을 하나의 파일로 압축합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;dependencies&amp;gt;를 보면 &quot;junit&quot;이 기본적으로 추가되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JUnit은 자바 프로젝트에서 생성되는 클래스의 메서드를 테스트하는 단위 테스트 도구입니다. 이름 그래로 &quot;Java Unit Test&quot;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;web.xml를 열어보면 &quot;URI is not registered (Settings | Languages &amp;amp; Frameworks | Schemas and DTDs)&quot; URI가 등록되어 있지 않다는 에러가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFq1Z/btshRxfb07h/HXGpAQfdTjTddqyHNGcXU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFq1Z/btshRxfb07h/HXGpAQfdTjTddqyHNGcXU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFq1Z/btshRxfb07h/HXGpAQfdTjTddqyHNGcXU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFq1Z%2FbtshRxfb07h%2FHXGpAQfdTjTddqyHNGcXU1%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;이 URI에 마우스를 클릭하고 조금 있으면 붉은색 전구 아이콘이 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JBSlC/btshCcQRDlY/IwYz7KJNcQ1lkUYyrekCIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JBSlC/btshCcQRDlY/IwYz7KJNcQ1lkUYyrekCIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JBSlC/btshCcQRDlY/IwYz7KJNcQ1lkUYyrekCIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJBSlC%2FbtshCcQRDlY%2FIwYz7KJNcQ1lkUYyrekCIk%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJK5X/btshBkBzjsB/xOu6kK8akNNtDKEmdsBzwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJK5X/btshBkBzjsB/xOu6kK8akNNtDKEmdsBzwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJK5X/btshBkBzjsB/xOu6kK8akNNtDKEmdsBzwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJK5X%2FbtshBkBzjsB%2FxOu6kK8akNNtDKEmdsBzwk%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 아이콘을 클릭하면 에러를 처리할 방법이 나타납니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Fetch external resource (외부 리소스 가져오기)&lt;/li&gt;
&lt;li&gt;Ignore external resource (외부 리소스 무시)&lt;/li&gt;
&lt;li&gt;Manually&amp;nbsp;set&amp;nbsp;up&amp;nbsp;external&amp;nbsp;resource&amp;nbsp;(외부&amp;nbsp;리소스&amp;nbsp;수동&amp;nbsp;설정)&lt;/li&gt;
&lt;/ul&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;여기서는 &quot;Fetch external resource&quot;를 클릭합니다.&amp;nbsp;그러면 URI가 등록되고 에러가 없어집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWvevi/btshBmGhzGI/ZkRBeaxZgWomKZWS5KzLrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWvevi/btshBmGhzGI/ZkRBeaxZgWomKZWS5KzLrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWvevi/btshBmGhzGI/ZkRBeaxZgWomKZWS5KzLrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWvevi%2FbtshBmGhzGI%2FZkRBeaxZgWomKZWS5KzLrK%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;web.xml에는 간단히 웹앱의 이름으로 &quot;Archetype Created Web Application - &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: justify;&quot;&gt;아키타입으로 만들어진 웹&amp;nbsp;애플리케이션&lt;/span&gt;&quot;으로 되어 있습니다. 원하시는 이름으로 변경하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685357132026&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE web-app PUBLIC
 &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot;
 &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot; &amp;gt;

&amp;lt;web-app&amp;gt;
  &amp;lt;display-name&amp;gt;Archetype Created Web Application&amp;lt;/display-name&amp;gt;
&amp;lt;/web-app&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.jsp 파일을 보면 간단하게 &quot;Hello World!&quot;가 출력되게 되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMnLs/btshPpBE9QG/bDt5AcDKrwjyKKfPLefS30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMnLs/btshPpBE9QG/bDt5AcDKrwjyKKfPLefS30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMnLs/btshPpBE9QG/bDt5AcDKrwjyKKfPLefS30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMnLs%2FbtshPpBE9QG%2FbDt5AcDKrwjyKKfPLefS30%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685358592233&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h2&amp;gt;Hello World!&amp;lt;/h2&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pom.xml를 열어 &amp;lt;dependencies&amp;gt;에 javax.servlet를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685360147053&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
	&amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
	&amp;lt;artifactId&amp;gt;javax.servlet-api&amp;lt;/artifactId&amp;gt;
	&amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;
	&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zRWQt/btshPp2IetE/JP468qzcsNvaEPuulEN4Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zRWQt/btshPp2IetE/JP468qzcsNvaEPuulEN4Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zRWQt/btshPp2IetE/JP468qzcsNvaEPuulEN4Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzRWQt%2FbtshPp2IetE%2FJP468qzcsNvaEPuulEN4Y0%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오른쪽 상단에 있는 &quot;Load Maven Changes&quot; 버튼을 누르면 Maven이 업데이트됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAf0vm/btshA5ERdDi/ZNrocZQp2Sd1ch64a0rPR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAf0vm/btshA5ERdDi/ZNrocZQp2Sd1ch64a0rPR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAf0vm/btshA5ERdDi/ZNrocZQp2Sd1ch64a0rPR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAf0vm%2FbtshA5ERdDi%2FZNrocZQp2Sd1ch64a0rPR0%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;300&quot; height=&quot;161&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Maven이 업데이트되면서 External Libraries(외부 라이브러리)에 &quot;javax.servlet:javax.servlet-api:3.1.0&quot;이 추가가 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vSoDe/btshA0pUTB8/x6QYkHB3hahV6tLykr7vS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vSoDe/btshA0pUTB8/x6QYkHB3hahV6tLykr7vS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vSoDe/btshA0pUTB8/x6QYkHB3hahV6tLykr7vS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvSoDe%2FbtshA0pUTB8%2Fx6QYkHB3hahV6tLykr7vS1%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;이제 WebApp를 Maven기반으로 만들 수 있게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서 메이븐 프로젝트을 위한 폴더 구조에 대해 알아보겠습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>IntelliJ Community</category>
      <category>Archetype</category>
      <category>Maven Project</category>
      <category>maven update</category>
      <category>URI is not registered</category>
      <category>webapp</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/282</guid>
      <comments>https://carrotweb.tistory.com/282#entry282comment</comments>
      <pubDate>Mon, 29 May 2023 23:20:00 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ General Maven Project 생성 - Artifact, maven.compiler.source</title>
      <link>https://carrotweb.tistory.com/281</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;General Maven Project(기본 메이븐 프로젝트) 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. &quot;New Project&quot;를 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4UhRB/btshz1veVcL/c4yYXEWLYr62hHWgDIKkJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4UhRB/btshz1veVcL/c4yYXEWLYr62hHWgDIKkJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4UhRB/btshz1veVcL/c4yYXEWLYr62hHWgDIKkJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4UhRB%2Fbtshz1veVcL%2Fc4yYXEWLYr62hHWgDIKkJ1%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;860&quot; height=&quot;702&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&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;span style=&quot;color: #333333;&quot;&gt;2. New Project 대화상자에서 프로젝트 이름(Name)을 입력하고 프로젝트 경로(Location), 개발언어(Language), 빌드 시스템(Build system), JDK를 선택하고 &quot;Create&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSoglt/btshAZXYqLX/nAMkKZ21olskfHH5ZdBkKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSoglt/btshAZXYqLX/nAMkKZ21olskfHH5ZdBkKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSoglt/btshAZXYqLX/nAMkKZ21olskfHH5ZdBkKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSoglt%2FbtshAZXYqLX%2FnAMkKZ21olskfHH5ZdBkKK%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&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;span style=&quot;color: #333333;&quot;&gt;저는 프로젝트 이름(Name)을 &amp;nbsp;&quot;test1&quot;로 입력하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;프로젝트 경로(Location)는 &quot;C:\workspaces\studyj&quot;로 변경하였습니다. (&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Git 연동은 다음에 하도록 하겠습니다.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;개발언어(Language)는 &quot;Java&quot;로 선택하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빌드 시스템(Build system)은 &quot;Maven&quot;를 선택하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JDK는 이전에 설치한 &quot;Eclipse Temurin Version 1.8.0_372&quot;를 선택하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(이전(&lt;a href=&quot;https://carrotweb.tistory.com/280&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://carrotweb.tistory.com/280&lt;/a&gt;)에서 설명한 것처럼 &lt;span style=&quot;text-align: start;&quot;&gt;&quot;Eclipse Temurin Version 1.8.0_372&quot;를 선택하기 위해서 &quot;JDK&quot;의 셀렉트박스를 클릭하여 &quot;Add JDK...&quot;를 선택하고 &lt;span style=&quot;text-align: start;&quot;&gt;JDK의 홈 디렉터리를 선택하는 대화상자에서 JDK가 다운로드된&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;폴더를&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;선택하고 &quot;OK&quot; 버튼을&amp;nbsp;&lt;/span&gt;누릅니다.&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n2mNg/btshHMQN8sE/BavQOrEDfoRpbcc4fbv27k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n2mNg/btshHMQN8sE/BavQOrEDfoRpbcc4fbv27k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n2mNg/btshHMQN8sE/BavQOrEDfoRpbcc4fbv27k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn2mNg%2FbtshHMQN8sE%2FBavQOrEDfoRpbcc4fbv27k%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&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;&quot;Advanced Setting&quot;를 클릭하여 Artifact(아티팩트)를 설정하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1N7t3/btshz0iJEjM/pzx8nXQaC8okIDpXj7GxKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1N7t3/btshz0iJEjM/pzx8nXQaC8okIDpXj7GxKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1N7t3/btshz0iJEjM/pzx8nXQaC8okIDpXj7GxKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1N7t3%2Fbtshz0iJEjM%2Fpzx8nXQaC8okIDpXj7GxKK%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&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;&quot;GroupId&quot;는 프로젝트 또는 라이브러리를 식별하기 위해 네임스페이스(namespace)로 &quot;Artifact&quot;들이 저장되는 그룹입니다. (다른 그룹과 구분되는 고유 값이어야 합니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 &quot;GroupId&quot;는 회사나 조직 이름 또는 대표 도메인(URL 주소인 도메인을 역순으로 적용)을 많이 사용합니다.&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;개인적인 프로젝트임으로 가상 도메인인 &quot;www.home.com&quot;을 역순으로 적용한 &quot;com.home&quot;과 학습을 위한 프로젝트 임으로 &quot;study&quot;을 결합하여 사용하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &quot;GroupId&quot;를 &quot;com.home.study&quot;으로 입력하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;ArtifactId&quot;는 제품명(산출물명)이자 프로젝트 명입니다.&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;&quot;ArtifactId&quot;는 기본적으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;프로젝트 이름(Name)으로 되어 있습니다. 그대로 사용하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WQQYd/btshE1gtTat/fSEzoSnBP16Uo0QxkLoKa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WQQYd/btshE1gtTat/fSEzoSnBP16Uo0QxkLoKa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WQQYd/btshE1gtTat/fSEzoSnBP16Uo0QxkLoKa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWQQYd%2FbtshE1gtTat%2FfSEzoSnBP16Uo0QxkLoKa1%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Create&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. intelliJ IDE에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Maven 프로젝트로 샘플 코딩과 함께 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FMYXE/btshAzeicjI/k8PvUhPU5ACeulXthxprD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FMYXE/btshAzeicjI/k8PvUhPU5ACeulXthxprD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FMYXE/btshAzeicjI/k8PvUhPU5ACeulXthxprD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFMYXE%2FbtshAzeicjI%2Fk8PvUhPU5ACeulXthxprD1%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;샘플 코딩은 간단하게 문자열(&quot;Hello and welcome!&quot;)을 출력하는 부분과 for문을 사용하여 1부터 5까지 출력하는 부분으로 되어 있습니다. 그리고 for문에서 출력되는 부분에 디버깅(Debugging)을 위한 Breakpoint(브레이크 포인트, 중단점)가 설정되어 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1685199252635&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Press Alt+Enter with your caret at the highlighted text to see how
// IntelliJ IDEA suggests fixing it.
System.out.printf(&quot;Hello and welcome!&quot;);

// Press Shift+F10 or click the green arrow button in the gutter to run the code.
for (int i = 1; i &amp;lt;= 5; i++) {
    // Press Shift+F9 to start debugging your code. We have set one breakpoint
    // for you, but you can always add more by pressing Ctrl+F8.
    System.out.println(&quot;i = &quot; + i);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 pom.xml를 보면 New Project 대화상자에서 설정한 정보들로 설정된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cknJGn/btshBjBVm6o/Vg5RLk0DahcW2GjfNRXTyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cknJGn/btshBjBVm6o/Vg5RLk0DahcW2GjfNRXTyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cknJGn/btshBjBVm6o/Vg5RLk0DahcW2GjfNRXTyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcknJGn%2FbtshBjBVm6o%2FVg5RLk0DahcW2GjfNRXTyk%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1685199753476&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&amp;gt;
    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

    &amp;lt;groupId&amp;gt;com.home.study&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;test1&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;maven.compiler.source&amp;gt;8&amp;lt;/maven.compiler.source&amp;gt;
        &amp;lt;maven.compiler.target&amp;gt;8&amp;lt;/maven.compiler.target&amp;gt;
        &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;
    &amp;lt;/properties&amp;gt;

&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;Version&amp;gt;은 &quot;Artifact&quot;의 버전입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 &quot;1.0-SNAPSHOT&quot;으로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;-SNAPSHOT&quot;은 버전이 개발 버전인 것을 알려줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 정식 배포 버전이 만들어지면 &quot;-RELEASE&quot;를 붙입니다. (&quot;1.0-RELEASE&quot;),&amp;nbsp;&quot;-RELEASE&quot;는 생략할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;properties&amp;gt;에는 &amp;lt;maven.compiler.source&amp;gt;와 &amp;lt;maven.compiler.target&amp;gt;으로 Java Compiler 버전이 설정되어 있습니다. 그리고 &quot;UTF-8&quot;로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;인코딩이 &lt;/span&gt;설정되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Compiler 설정에 대한 내용은 &quot;&lt;a href=&quot;https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html&lt;/a&gt;&quot;를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Normal Maven Project(메이븐 프로젝트) 실행(Run)하기&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: #333333; text-align: start;&quot;&gt;1. intelliJ IDE에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&quot;Main.&lt;span style=&quot;color: #333333;&quot;&gt;java&quot; 파일에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Run 'Main.main()'&quot;를 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s9AUY/btshy5EVXsp/aWAzVPTA8UHNn7bAekZpxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s9AUY/btshy5EVXsp/aWAzVPTA8UHNn7bAekZpxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s9AUY/btshy5EVXsp/aWAzVPTA8UHNn7bAekZpxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs9AUY%2Fbtshy5EVXsp%2FaWAzVPTA8UHNn7bAekZpxk%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 상단 툴바(Toolbar)에서 녹색 실행(Run)을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CYGLj/btshCbRP3bJ/g6pWpG1DQc2JkFwYpfpDg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CYGLj/btshCbRP3bJ/g6pWpG1DQc2JkFwYpfpDg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CYGLj/btshCbRP3bJ/g6pWpG1DQc2JkFwYpfpDg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCYGLj%2FbtshCbRP3bJ%2Fg6pWpG1DQc2JkFwYpfpDg1%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;2. 하단에 Run 탭이 나타나고 출력문으로 출력된 내용을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RWFWh/btshAzFlCmy/kap8RtKNlGgYAdA9bLHEZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RWFWh/btshAzFlCmy/kap8RtKNlGgYAdA9bLHEZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RWFWh/btshAzFlCmy/kap8RtKNlGgYAdA9bLHEZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRWFWh%2FbtshAzFlCmy%2Fkap8RtKNlGgYAdA9bLHEZk%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플 코드에서 &quot;Hello and welcome!&quot;의 출력문으로 System.out.printf 보다는 System.out.println으로 하는 게 맞는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Normal Maven Project(메이븐 프로젝트) 디버깅(Debugging)하기&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: #333333; text-align: start;&quot;&gt;1. intelliJ IDE에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&quot;Main.&lt;span style=&quot;color: #333333;&quot;&gt;java&quot; 파일에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Debug 'Main.main()'&quot;를 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dywkZA/btshCdCcu0F/kfIupVfQDgjAx8A78KvkU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dywkZA/btshCdCcu0F/kfIupVfQDgjAx8A78KvkU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dywkZA/btshCdCcu0F/kfIupVfQDgjAx8A78KvkU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdywkZA%2FbtshCdCcu0F%2FkfIupVfQDgjAx8A78KvkU0%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또는 &lt;/span&gt;상단 툴바(Toolbar)에서 녹색 디버그(Debug)를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR8Oe1/btshz2asPmf/OT6ceH5kuawepeSeejCgA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR8Oe1/btshz2asPmf/OT6ceH5kuawepeSeejCgA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR8Oe1/btshz2asPmf/OT6ceH5kuawepeSeejCgA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR8Oe1%2Fbtshz2asPmf%2FOT6ceH5kuawepeSeejCgA1%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&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;2. 하단에 Debug 탭이 나타나고 Debugger 탭에는 Breakpoint(브레이크 포인트, 중단점)가 있는 라인에 대한 정보가 나타납니다. 그리고 Console 탭을 누르면 출력문으로 출력된 내용을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOt9Wb/btshA5knBfK/9KcQDA73W9ANugcPsydlRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOt9Wb/btshA5knBfK/9KcQDA73W9ANugcPsydlRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOt9Wb/btshA5knBfK/9KcQDA73W9ANugcPsydlRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOt9Wb%2FbtshA5knBfK%2F9KcQDA73W9ANugcPsydlRk%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;2778&quot; height=&quot;1780&quot; data-origin-width=&quot;2778&quot; data-origin-height=&quot;1780&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디버그 컨트롤(Debug Controls) 설명 상자는 &quot;Got it&quot;를 누르면 사라집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하지만 기본적인 Maven 프로젝트를 생성할 수 있습니다.&lt;/p&gt;</description>
      <category>IntelliJ Community</category>
      <category>artifact</category>
      <category>Artifact Id</category>
      <category>Group Id</category>
      <category>Maven Project</category>
      <category>maven.compiler.source</category>
      <category>maven.compiler.target</category>
      <category>New Project</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/281</guid>
      <comments>https://carrotweb.tistory.com/281#entry281comment</comments>
      <pubDate>Mon, 29 May 2023 23:13:57 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ JDK 설정 - Eclipse Temurin (AdoptOpenJDK HotSpot) 1.8.0_372, JBR-17.0.6+10-829.9-jcef</title>
      <link>https://carrotweb.tistory.com/280</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IntelliJ IDEA Community 2023.1을 설치하면 자동으로 JBR-17.0.6가 설치됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JBR-17.0.6이 설치된 경로는 IntelliJ가 설치된 폴더에 &quot;jbr&quot; 폴더입니다. (저는 &quot;C:\workspaces\IntelliJ\jbr&quot;입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JBR은 JetBrains Runtime으로 OpenJDK 17.0.6을 기반으로 만들어졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉,&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;JetBrains이 IDE(Integrated Development Environment, 통합&amp;nbsp;개발&amp;nbsp;환경)에서 사용할 목적으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;OpenJDK(Open Java Development Kit)를 가져와서 기능을 추가하고 개선한 JDK입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JetBrains Runtime에는 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;크롬&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;임베디드 기능과&amp;nbsp;향상된 클래스 재정의 기능이 포함되어 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JCEF(Java Chromium Embedded Framework, 자바 크롬 임베이드 프레임워크)로 JVM 기반 애플리케이션에 크롬 기반 브라우저를 임베드할 수 있게 해 줍니다.&lt;/li&gt;
&lt;li&gt;클래스 재정의(Enhanced class re-definition) 기능을 향상시키기 위해서 DCEVM(Dynamic Code Evolution Virtual Machine - 런타임(Runtime)에서 로드된 클래스를 재정의할 수 있는 Java HotSpot VM을 수정하여 만듦) 기술을 이용하여&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;JVM(Java Virtual Machine)를 다시 시작하지 않아도 변경된 코드가 다시 로드되게 처리하였습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JBR-17.0.6(17.0.6-b829.9)은 2023년 4월 10일에 릴리스 되어 IDE 버전 2023.1에 적용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용은 &quot;&lt;a href=&quot;https://github.com/JetBrains/JetBrainsRuntime/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/JetBrains/JetBrainsRuntime/releases&lt;/a&gt;&quot;에서 &quot;Release 17.0.6-b829.9&quot;를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;New Project에서 JDK 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;New Project&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3DtDn/btshAqBkArb/Dm4T2xukvZVz6aRqmMOew0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3DtDn/btshAqBkArb/Dm4T2xukvZVz6aRqmMOew0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3DtDn/btshAqBkArb/Dm4T2xukvZVz6aRqmMOew0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3DtDn%2FbtshAqBkArb%2FDm4T2xukvZVz6aRqmMOew0%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;860&quot; height=&quot;702&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 &quot;New Project&quot; 대화상자 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;New Project&quot; 대화상자에서 &quot;JDK&quot;를 보면 &quot;JetBrains Runtime version 17.0.6&quot;인 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sDytf/btshz1atVXU/O70I0SLDkAyaq1l5bqmPBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sDytf/btshz1atVXU/O70I0SLDkAyaq1l5bqmPBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sDytf/btshz1atVXU/O70I0SLDkAyaq1l5bqmPBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsDytf%2Fbtshz1atVXU%2FO70I0SLDkAyaq1l5bqmPBK%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&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;여기서는 Eclipse Temurin (AdoptOpenJDK HotSpot) 1.8.0_372 버전을 다운로드하여 설치하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분의 프로젝트 환경에 맞게 JDK 버전을 선택하시기 바랍니다.&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. &quot;JDK&quot;의 셀렉트박스를 클릭하여 &quot;Download JDK...&quot;를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dy6klz/btshA4LiTkH/EUwNZF8jcHwdoBBIxNtwvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dy6klz/btshA4LiTkH/EUwNZF8jcHwdoBBIxNtwvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dy6klz/btshA4LiTkH/EUwNZF8jcHwdoBBIxNtwvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdy6klz%2FbtshA4LiTkH%2FEUwNZF8jcHwdoBBIxNtwvk%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 설치 가능한 JDK의 버전별 리스트를 다운로드합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;1312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxW3aN/btshzBXoNfJ/okrKwELKo3DuWZ5NqbHSZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxW3aN/btshzBXoNfJ/okrKwELKo3DuWZ5NqbHSZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxW3aN/btshzBXoNfJ/okrKwELKo3DuWZ5NqbHSZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxW3aN%2FbtshzBXoNfJ%2FokrKwELKo3DuWZ5NqbHSZK%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;1596&quot; height=&quot;1312&quot; data-origin-width=&quot;1596&quot; data-origin-height=&quot;1312&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;3. &quot;Download JDK&quot; 대화상자에서 &quot;Version&quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;셀렉트박스를 클릭하여 &quot;1.8&quot;를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfBy8p/btshBmyaPVD/ZdjpCZHbjPa4PJFqrlqNt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfBy8p/btshBmyaPVD/ZdjpCZHbjPa4PJFqrlqNt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfBy8p/btshBmyaPVD/ZdjpCZHbjPa4PJFqrlqNt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfBy8p%2FbtshBmyaPVD%2FZdjpCZHbjPa4PJFqrlqNt0%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;600&quot; height=&quot;240&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddTEPG/btshy8urFBl/HpQga8W0oKnzpd5aeNk9I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddTEPG/btshy8urFBl/HpQga8W0oKnzpd5aeNk9I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddTEPG/btshy8urFBl/HpQga8W0oKnzpd5aeNk9I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddTEPG%2Fbtshy8urFBl%2FHpQga8W0oKnzpd5aeNk9I0%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;600&quot; height=&quot;361&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehF4AG/btshzCILIBF/YewRlBsji7enUC87XI3NY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehF4AG/btshzCILIBF/YewRlBsji7enUC87XI3NY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehF4AG/btshzCILIBF/YewRlBsji7enUC87XI3NY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehF4AG%2FbtshzCILIBF%2FYewRlBsji7enUC87XI3NY0%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;600&quot; height=&quot;242&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;386&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;&quot;Vendor&quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;셀렉트박스를 클릭하여 &quot;Eclipse Temurin (AdoptOpenJDK HotSpot) 1.8.0_372&quot;를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg0aY8/btshzBQGr4t/IUBwFKhdFgZHignNHTMWx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg0aY8/btshzBQGr4t/IUBwFKhdFgZHignNHTMWx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg0aY8/btshzBQGr4t/IUBwFKhdFgZHignNHTMWx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg0aY8%2FbtshzBQGr4t%2FIUBwFKhdFgZHignNHTMWx0%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;600&quot; height=&quot;465&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;762&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;Eclipse Temurin(이클립스 테무린)란 이클립스 재단에서 OpenJDK를 기반으로 개발한 JDK로 이클립스 재단의&amp;nbsp; Adoptium(어댑티움) 프로젝트로 진행되고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 AdoptOpenJDK 1.8부터 AdoptOpenJDK 2.0까지 릴리즈 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;설치할 &quot;Location&quot;를 변경하지 않을 경우&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&quot;Download&quot; 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LoWEg/btshzBb4k3y/kuzXBjEe8A6ENKrTuPSzK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LoWEg/btshzBb4k3y/kuzXBjEe8A6ENKrTuPSzK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LoWEg/btshzBb4k3y/kuzXBjEe8A6ENKrTuPSzK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLoWEg%2FbtshzBb4k3y%2FkuzXBjEe8A6ENKrTuPSzK1%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;600&quot; height=&quot;242&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &quot;Location&quot;를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&quot;C:\workspaces\adoptopenjdk\temurin-1.8.0_372&quot;로 변경하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs9acN/btshyAEZWa1/zPXxFyGLWtycImhqPIxLT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs9acN/btshyAEZWa1/zPXxFyGLWtycImhqPIxLT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs9acN/btshyAEZWa1/zPXxFyGLWtycImhqPIxLT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs9acN%2FbtshyAEZWa1%2FzPXxFyGLWtycImhqPIxLT1%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;600&quot; height=&quot;240&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;382&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;그러면 &quot;Eclipse Temurin (AdoptOpenJDK HotSpot) 1.8.0_372&quot;이 다운로드됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c95gHh/btshChi5KkZ/J03eZQ2lFoACouUnqARlr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c95gHh/btshChi5KkZ/J03eZQ2lFoACouUnqARlr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c95gHh/btshChi5KkZ/J03eZQ2lFoACouUnqARlr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc95gHh%2FbtshChi5KkZ%2FJ03eZQ2lFoACouUnqARlr0%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;600&quot; height=&quot;119&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;224&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;다운로드가 완료되면 &quot;JDK&quot;가 &quot;Eclipse Temurin Version 1.8.0_372&quot;로 변경된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0dQYx/btshAzLAca5/aEw9rgRZQM1lDozKG4PqLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0dQYx/btshAzLAca5/aEw9rgRZQM1lDozKG4PqLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0dQYx/btshAzLAca5/aEw9rgRZQM1lDozKG4PqLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0dQYx%2FbtshAzLAca5%2FaEw9rgRZQM1lDozKG4PqLK%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;New Project&quot;를 다시 하면 조금 전에 다운로드한 &quot;Eclipse Temurin Version 1.8.0_372&quot;가 보이지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgxwaL/btshzlU9ueA/rnC8gim0KKHGr0yQWUzNLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgxwaL/btshzlU9ueA/rnC8gim0KKHGr0yQWUzNLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgxwaL/btshzlU9ueA/rnC8gim0KKHGr0yQWUzNLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgxwaL%2FbtshzlU9ueA%2FrnC8gim0KKHGr0yQWUzNLk%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&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;그래서 다운로드한 &quot;Eclipse Temurin Version 1.8.0_372&quot;를 선택하기 위해서 &quot;JDK&quot;의 셀렉트박스를 클릭하여 &quot;Add JDK...&quot;를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bouTmU/btshArN6qGA/aPZdjZN2wzMhZHkUtMuNfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bouTmU/btshArN6qGA/aPZdjZN2wzMhZHkUtMuNfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bouTmU/btshArN6qGA/aPZdjZN2wzMhZHkUtMuNfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbouTmU%2FbtshArN6qGA%2FaPZdjZN2wzMhZHkUtMuNfK%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&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;그러면 JDK의 홈 디렉터리를 선택하는 대화상자가 나타납니다. JDK가 다운로드된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;폴더를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;선택하고 &quot;OK&quot; 버튼을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;누릅니다. 저는 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&quot;C:\workspaces\adoptopenjdk\temurin-1.8.0_372&quot; 폴더에 선택하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck0NFT/btshBlzymw1/FLHrpMIxazUaofj8SAdo6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck0NFT/btshBlzymw1/FLHrpMIxazUaofj8SAdo6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck0NFT/btshBlzymw1/FLHrpMIxazUaofj8SAdo6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck0NFT%2FbtshBlzymw1%2FFLHrpMIxazUaofj8SAdo6k%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;600&quot; height=&quot;680&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;964&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;&quot;JDK&quot;에 &quot;Eclipse Temurin Version 1.8.0_372&quot;가 추가된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LzxdN/btshy9mMQcz/hcfOSjFvafMF5Ni301Fq8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LzxdN/btshy9mMQcz/hcfOSjFvafMF5Ni301Fq8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LzxdN/btshy9mMQcz/hcfOSjFvafMF5Ni301Fq8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLzxdN%2Fbtshy9mMQcz%2FhcfOSjFvafMF5Ni301Fq8K%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;1578&quot; height=&quot;1218&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>IntelliJ Community</category>
      <category>AdoptOpenJDK 1.8.0_372</category>
      <category>dcevm</category>
      <category>jbr</category>
      <category>JCEF</category>
      <category>JetBrainsRuntime</category>
      <category>temurin</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/280</guid>
      <comments>https://carrotweb.tistory.com/280#entry280comment</comments>
      <pubDate>Sat, 27 May 2023 22:38:09 +0900</pubDate>
    </item>
    <item>
      <title>IntelliJ 다운로드 및 설치 - IntelliJ IDEA Download &amp;amp; Install - 2023.1.2</title>
      <link>https://carrotweb.tistory.com/279</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;IntelliJ IDEA 다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. JET BRANS 사이트(&lt;a href=&quot;https://www.jetbrains.com/idea/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.jetbrains.com/idea/&lt;/a&gt;)에 접속합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d07EPH/btshxEtMDTz/kHNo2VZx7H5r6LJ7dzHEB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d07EPH/btshxEtMDTz/kHNo2VZx7H5r6LJ7dzHEB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d07EPH/btshxEtMDTz/kHNo2VZx7H5r6LJ7dzHEB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd07EPH%2FbtshxEtMDTz%2FkHNo2VZx7H5r6LJ7dzHEB1%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;2520&quot; height=&quot;1728&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 최신버전은 2023.1.2입니다. &lt;br /&gt;&lt;br /&gt;&amp;nbsp;2. 오른쪽 상단에 있는 Download나 페이지에 있는 Download를 클릭하면 Download IntelliJ IDEA 페이지로 이동합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvQCY2/btshy6h7Lmy/rXjjKEmVXS9qJk70L9l7x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvQCY2/btshy6h7Lmy/rXjjKEmVXS9qJk70L9l7x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvQCY2/btshy6h7Lmy/rXjjKEmVXS9qJk70L9l7x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvQCY2%2Fbtshy6h7Lmy%2FrXjjKEmVXS9qJk70L9l7x1%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;2520&quot; height=&quot;1728&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버전을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다운로드할&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ultimate는 유료 버전으로 입니다. 30일간은 무료로 이용한 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후에는 라이선스 구매해서 등록해야 사용할 수 있습니다. 현재 개인 라이선스 비용은 1년에 169달러입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzCCY/btshzYD8bcg/EKMvAPHwyKeDU8SienkzUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzCCY/btshzYD8bcg/EKMvAPHwyKeDU8SienkzUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzCCY/btshzYD8bcg/EKMvAPHwyKeDU8SienkzUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvzCCY%2FbtshzYD8bcg%2FEKMvAPHwyKeDU8SienkzUK%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;2520&quot; height=&quot;1728&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&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;Communiry Edition는 무료 버전입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ultimate에 비해 지원 가능한 개발 언어, 프레임워크, 도구들이 제한되어 있습니다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;Java나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Kotlin으로 웹 프로그램을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;개발하는 데는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Communiry Edition으로도 충분하나&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;개발 환경(언어, 프레임워크, 도구)에 따라&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Ultimate가 아니면 개발하는데 문제가 있을 수 있습니다.&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;Ultimate와 Communiry Edition를 자세하게 비교해서 설명한 &quot;&lt;a href=&quot;https://www.jetbrains.com/products/compare/?product=idea&amp;amp;product=idea-ce&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;IntelliJ&amp;nbsp;IDEA&amp;nbsp;Ultimate&amp;nbsp;vs&amp;nbsp;IntelliJ&amp;nbsp;IDEA&amp;nbsp;Community&amp;nbsp;Edition&lt;/a&gt;&quot;에서 확인해 보시길 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 여기서는 무료버전인 Communiry Edition을 다운로드하겠습니다. Communiry Edition에 있는 Download버튼을 클릭하면 감사페이지로 이동되고 IntelliJ 설치 파일(ideaIC-2023.1.2.exe)이 다운로드됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnuGA/btshAuW3Ve2/hcbCbiDwRekkzthhXk9bZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnuGA/btshAuW3Ve2/hcbCbiDwRekkzthhXk9bZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnuGA/btshAuW3Ve2/hcbCbiDwRekkzthhXk9bZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnuGA%2FbtshAuW3Ve2%2FhcbCbiDwRekkzthhXk9bZK%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;2520&quot; height=&quot;1728&quot; data-origin-width=&quot;2520&quot; data-origin-height=&quot;1728&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;IntelliJ IDEA&lt;/b&gt;&amp;nbsp;설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 웹 브라우저 하단에 있는 다운로드된 파일을 클릭하거나 다운로드 폴더에서 다운로드 ideaIC-2023.1.2.exe 파일을 클릭합니다. 그러면 &quot;이 앱이 디바이스를 변경할 수 있도록 허용하시겠어요?&quot;라는 보안 확인 창이 나타납니다. &quot;예&quot; 버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;806&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sck22/btshAuW6cfS/6mmpkgIRUTKlyi6R2VeW10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sck22/btshAuW6cfS/6mmpkgIRUTKlyi6R2VeW10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sck22/btshAuW6cfS/6mmpkgIRUTKlyi6R2VeW10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSck22%2FbtshAuW6cfS%2F6mmpkgIRUTKlyi6R2VeW10%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;400&quot; height=&quot;347&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;806&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Installer가 실행됩니다. &quot;Next &amp;gt;&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJLI5/btshytehh43/7oftjwPQQrfi4Jx9vW5GQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJLI5/btshytehh43/7oftjwPQQrfi4Jx9vW5GQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJLI5/btshytehh43/7oftjwPQQrfi4Jx9vW5GQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJLI5%2Fbtshytehh43%2F7oftjwPQQrfi4Jx9vW5GQk%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&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;이전에 IntelliJ IDEA를 설치하였다면 이전 버전을 삭제할지 물어봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 버전을 삭제하려면 설치 경로를 체크하고 &quot;Next &amp;gt; &quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p77Tn/btshx8BNgR5/fQ83WYtWzbu28gdgJ4KDV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p77Tn/btshx8BNgR5/fQ83WYtWzbu28gdgJ4KDV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p77Tn/btshx8BNgR5/fQ83WYtWzbu28gdgJ4KDV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp77Tn%2Fbtshx8BNgR5%2FfQ83WYtWzbu28gdgJ4KDV0%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&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;2. IntelliJ IDEA를 설치할 경로를 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 &quot;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.1.2&quot;로 되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 경로를 변경하지 않을 경우 &quot;Next &amp;gt;&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkLirz/btshzBvIc2h/rvBj2C26yS5eoAA4HQzjAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkLirz/btshzBvIc2h/rvBj2C26yS5eoAA4HQzjAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkLirz/btshzBvIc2h/rvBj2C26yS5eoAA4HQzjAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkLirz%2FbtshzBvIc2h%2FrvBj2C26yS5eoAA4HQzjAk%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;600&quot; height=&quot;744&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &quot;C:\workspaces\IntelliJ&quot;로 변경하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ThBtD/btshytrVuPa/B3xGBQ1gutB8jkpkqKibC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ThBtD/btshytrVuPa/B3xGBQ1gutB8jkpkqKibC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ThBtD/btshytrVuPa/B3xGBQ1gutB8jkpkqKibC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThBtD%2FbtshytrVuPa%2FB3xGBQ1gutB8jkpkqKibC0%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&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;3. 설치 옵션(바탕화면에 바로가기를 생성, 시스템 환경 변수의 PATH에 IntelliJ의 &quot;bin&quot; 폴더 경로 추가, 콘텍스트 메뉴에 추가)을 선택합니다. 그리고 &quot;Next &amp;gt;&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zpg8h/btshzZDgzWT/dG16kvtgllCeAKnjwCqK51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zpg8h/btshzZDgzWT/dG16kvtgllCeAKnjwCqK51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zpg8h/btshzZDgzWT/dG16kvtgllCeAKnjwCqK51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzpg8h%2FbtshzZDgzWT%2FdG16kvtgllCeAKnjwCqK51%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&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;4. 시작 메뉴 폴더명을 입력합니다. 그리고 &quot;Install&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl1AyW/btshzDUEhkx/IwwbGUHmUbHbOzcevRSBF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl1AyW/btshzDUEhkx/IwwbGUHmUbHbOzcevRSBF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl1AyW/btshzDUEhkx/IwwbGUHmUbHbOzcevRSBF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl1AyW%2FbtshzDUEhkx%2FIwwbGUHmUbHbOzcevRSBF1%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&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;5. 설치가&amp;nbsp;진행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxYunp/btshAuQpASp/D3YsGXHposJQWuqJKKug41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxYunp/btshAuQpASp/D3YsGXHposJQWuqJKKug41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxYunp/btshAuQpASp/D3YsGXHposJQWuqJKKug41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxYunp%2FbtshAuQpASp%2FD3YsGXHposJQWuqJKKug41%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&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;6. 설치가 완료되면 &quot;Finish&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca4Qcz/btshyeoeE8R/4u5KkKKpZnrzqXAuZuiCB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca4Qcz/btshyeoeE8R/4u5KkKKpZnrzqXAuZuiCB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca4Qcz/btshyeoeE8R/4u5KkKKpZnrzqXAuZuiCB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca4Qcz%2FbtshyeoeE8R%2F4u5KkKKpZnrzqXAuZuiCB1%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;600&quot; height=&quot;447&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;IntelliJ IDEA &lt;/b&gt;&lt;/b&gt;실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 바탕화면에서 IntelliJ IDEA Community Edition 2023.1.2를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7cE3w/btshMWGemzk/WgdB0qBC6VE9NlS9MRHgYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7cE3w/btshMWGemzk/WgdB0qBC6VE9NlS9MRHgYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7cE3w/btshMWGemzk/WgdB0qBC6VE9NlS9MRHgYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7cE3w%2FbtshMWGemzk%2FWgdB0qBC6VE9NlS9MRHgYk%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;100&quot; height=&quot;162&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 윈도우 시작 버튼을 클릭하고 &quot;IntelliJ&quot;를 입력하고 IntelliJ IDEA Community Edition 2023.1.2 앱을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXH9vB/btshAqAFISe/EB7QlaLXxxKVYF5nFaRwgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXH9vB/btshAqAFISe/EB7QlaLXxxKVYF5nFaRwgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXH9vB/btshAqAFISe/EB7QlaLXxxKVYF5nFaRwgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXH9vB%2FbtshAqAFISe%2FEB7QlaLXxxKVYF5nFaRwgk%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;600&quot; height=&quot;563&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &quot;C:\workspaces\IntelliJ\bin&quot; 폴더에서 idea64.exe를 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 IntelliJ IDEA Community 2023.1이 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cP2bVD/btshzDG707x/XQJHaxRBCz3ChJMmUHGGX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cP2bVD/btshzDG707x/XQJHaxRBCz3ChJMmUHGGX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cP2bVD/btshzDG707x/XQJHaxRBCz3ChJMmUHGGX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcP2bVD%2FbtshzDG707x%2FXQJHaxRBCz3ChJMmUHGGX1%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;600&quot; height=&quot;375&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Welcome 화면이 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zRMHJ/btshBkNOLet/vC1IDfkUaBSwTE9ysZgz51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zRMHJ/btshBkNOLet/vC1IDfkUaBSwTE9ysZgz51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zRMHJ/btshBkNOLet/vC1IDfkUaBSwTE9ysZgz51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzRMHJ%2FbtshBkNOLet%2FvC1IDfkUaBSwTE9ysZgz51%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;600&quot; height=&quot;490&quot; data-origin-width=&quot;1578&quot; data-origin-height=&quot;1288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IntelliJ Community</category>
      <category>2023.1.2</category>
      <category>Communiry</category>
      <category>download</category>
      <category>idea</category>
      <category>install</category>
      <category>IntelliJ</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/279</guid>
      <comments>https://carrotweb.tistory.com/279#entry279comment</comments>
      <pubDate>Sat, 27 May 2023 22:36:36 +0900</pubDate>
    </item>
    <item>
      <title>VSCode Extension 개발 3 - Clock Extension, Status Bar Item createStatusBarItem context.subscriptions.push</title>
      <link>https://carrotweb.tistory.com/278</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio Code의 Status Bar(상태 표시줄)에 시계를 만들어 추가하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;시계 Extension 개발&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 메뉴 Terminal(터미널)에서 yo code 명령어로 개발할 시계 Extension 정보를 입력하여 Node 프로젝트를 생성합니다. (yo code 명령어에 대한 자세한 설명은 &lt;a href=&quot;https://carrotweb.tistory.com/277&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://carrotweb.tistory.com/277&lt;/a&gt;를 참고하시기 바랍니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLHIdy/btsgEe83kQe/0W37fuRJdGKcyxjfLx2P5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLHIdy/btsgEe83kQe/0W37fuRJdGKcyxjfLx2P5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLHIdy/btsgEe83kQe/0W37fuRJdGKcyxjfLx2P5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLHIdy%2FbtsgEe83kQe%2F0W37fuRJdGKcyxjfLx2P5k%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684488686592&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS C:\workspaces\webstudys\extension1&amp;gt; yo code

     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |     
   __'.___.'__   
 &amp;acute;   `  |&amp;deg; &amp;acute; Y ` 

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? Clock
? What's the identifier of your extension? clock
? What's the description of your extension? Clock
? Enable JavaScript type checking in 'jsconfig.json'? Yes
? Initialize a git repository? No
? Which package manager to use? npm&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;2. package.json 파일을 오픈하여 &quot;command&quot;를 &quot;clock.helloWorld&quot;에서 &quot;clock.MyClock&quot;으로 변경하고 &quot;title&quot;를 &quot;Hello World&quot;에서 &quot;My Clock&quot;으로 변경하고 저장합니다. 그러면 명령 팔레트(Command Palette)에서 &quot;My Clock&quot;으로 실행할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF4Lzj/btsgCpX72oZ/7qd3RQqyH3HjnKdSMKg0FK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF4Lzj/btsgCpX72oZ/7qd3RQqyH3HjnKdSMKg0FK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF4Lzj/btsgCpX72oZ/7qd3RQqyH3HjnKdSMKg0FK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF4Lzj%2FbtsgCpX72oZ%2F7qd3RQqyH3HjnKdSMKg0FK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684488900029&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;contributes&quot;: {
  &quot;commands&quot;: [{
    &quot;command&quot;: &quot;clock.MyClock&quot;,
    &quot;title&quot;: &quot;My Clock&quot;
  }]
},&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3.&lt;span&gt; extension.js&lt;/span&gt;&lt;/span&gt; 파일을 오픈하여 &quot;vscode.commands.registerCommand&quot;의 &quot;clock.helloWorld&quot;를 &quot;clock.MyClock&quot;으로 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684494628733&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// The command has been defined in the package.json file
// Now provide the implementation of the command with  registerCommand
// The commandId parameter must match the command field in package.json
let disposable = vscode.commands.registerCommand('clock.MyClock', function () {&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 메시지가 노출되는 부분은 주석처리합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684494665487&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Display a message box to the user
//vscode.window.showInformationMessage('Hello World from Clock!');&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;Status Bar(상태 표시줄)에 아이템을 추가하기 위해서는 StatusBarItem(상태 표시줄 아이템)를 생성해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StatusBarItem은 createStatusBarItem 함수로 생성할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684495419231&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;createStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;createStatusBarItem 함수의 첫 번째 파라미터는 Status Bar(상태 표시줄)에서의 StatusBarItem(상태 표시줄 아이템)의 위치를 설정합니다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;위치는 &lt;/span&gt;왼쪽(vscode.StatusBarAlignment.Left) 또는 오른쪽(vscode.StatusBarAlignment.Right)으로 설정할 수 있습니다. 두 번째 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파라미터는&lt;span&gt; StatusBarItem(상태 표시줄 아이템)의 우선순위입니다. 우선순위는 값이 클수록 왼쪽에 위치하게 됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biBEQf/btsgCBqDWRp/leOZkkKV59uYl7svK4yrp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biBEQf/btsgCBqDWRp/leOZkkKV59uYl7svK4yrp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biBEQf/btsgCBqDWRp/leOZkkKV59uYl7svK4yrp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiBEQf%2FbtsgCBqDWRp%2FleOZkkKV59uYl7svK4yrp1%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;2446&quot; height=&quot;1610&quot; data-origin-width=&quot;2446&quot; data-origin-height=&quot;1610&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;StatusBarItem(상태 표시줄 아이템)을 왼쪽으로&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;우선순위 값을 크게 줄 경우&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;78&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWUUxr/btsgEg7e7QR/z650utPCWqcg3kuxZuuZwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWUUxr/btsgEg7e7QR/z650utPCWqcg3kuxZuuZwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWUUxr/btsgEg7e7QR/z650utPCWqcg3kuxZuuZwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWUUxr%2FbtsgEg7e7QR%2Fz650utPCWqcg3kuxZuuZwk%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;2070&quot; height=&quot;78&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;78&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StatusBarItem(상태 표시줄 아이템)을 왼쪽으로 우선순위 값을 낮게 줄 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clJiF8/btsgCGyP9Sp/0gf6qU20P7i95QHr6BIqkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clJiF8/btsgCGyP9Sp/0gf6qU20P7i95QHr6BIqkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clJiF8/btsgCGyP9Sp/0gf6qU20P7i95QHr6BIqkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclJiF8%2FbtsgCGyP9Sp%2F0gf6qU20P7i95QHr6BIqkk%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;2090&quot; height=&quot;72&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StatusBarItem(상태 표시줄 아이템)을 오른쪽으로 우선순위 값을 크게 줄 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7a3B1/btsgCCiMNcT/Ha3R71ZTasr4LHM9KgxZYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7a3B1/btsgCCiMNcT/Ha3R71ZTasr4LHM9KgxZYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7a3B1/btsgCCiMNcT/Ha3R71ZTasr4LHM9KgxZYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7a3B1%2FbtsgCCiMNcT%2FHa3R71ZTasr4LHM9KgxZYk%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;2088&quot; height=&quot;80&quot; data-origin-width=&quot;2088&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StatusBarItem(상태 표시줄 아이템)을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오른쪽으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;우선순위 값을 낮게 줄 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3leYp/btsgDOwoKKp/x10reuvmh3fM7li9ztZ1e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3leYp/btsgDOwoKKp/x10reuvmh3fM7li9ztZ1e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3leYp/btsgDOwoKKp/x10reuvmh3fM7li9ztZ1e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3leYp%2FbtsgDOwoKKp%2Fx10reuvmh3fM7li9ztZ1e1%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;2090&quot; height=&quot;80&quot; data-origin-width=&quot;2090&quot; data-origin-height=&quot;80&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;StatusBarItem(상태 표시줄 아이템)을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;오른쪽으로&lt;span&gt; 맨 마지막에 위치하게 &lt;/span&gt;&lt;/span&gt;우선순위 값을 낮게 주겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684495132443&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 상태 표시줄 아이템 생성 - 오른쪽 마지막으로 배정
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 생성된 statusBarItem에 시간과 분이 표시되게 하고 말풍선(ToolTip, 툴팁)에는 시간, 분, 초가 표시되게 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684496932932&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;statusBarItem.text = &quot;12:00&quot;;
statusBarItem.tooltip = &quot;12:00:00&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 Status Bar(상태 표시줄)에 StatusBarItem(상태 표시줄 아이템)이 표시되게 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684496574644&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 상태 표시줄 아이템 표시
statusBarItem.show();

// 상태 표시줄에 추가
context.subscriptions.push(statusBarItem);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IcyuL/btsgBWa5j5x/xgbs9nZogmqCZghW0aOEPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IcyuL/btsgBWa5j5x/xgbs9nZogmqCZghW0aOEPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IcyuL/btsgBWa5j5x/xgbs9nZogmqCZghW0aOEPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIcyuL%2FbtsgBWa5j5x%2Fxgbs9nZogmqCZghW0aOEPk%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Run(실행) &amp;gt; Start Debugging(디버깅 시작)를 클릭하거나 기능키 F5&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;버튼을 누릅니다. 그리고 &lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;새로운 Visual Studio Code의 메뉴 View &amp;gt; Command Palette... 를 클릭하거나 Ctrl + Shift + P를 눌러 명령 팔레트(Command Palette)를 실행시킨 후 입력란에서 &quot;My Clock&quot;를 입력하고 검색된 결과에서 &quot;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;My Clock&lt;/span&gt;를 선택합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AAIVy/btsgDMd76Xe/ek6WPrnrtyJCJsjAuJbd50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AAIVy/btsgDMd76Xe/ek6WPrnrtyJCJsjAuJbd50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AAIVy/btsgDMd76Xe/ek6WPrnrtyJCJsjAuJbd50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAAIVy%2FbtsgDMd76Xe%2Fek6WPrnrtyJCJsjAuJbd50%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;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Status Bar(상태 표시줄)의 오른쪽에 시간과 분이 표시되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HfJFn/btsgCF7PGhh/9HAg9jDHvAYEqHYUPkGJqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HfJFn/btsgCF7PGhh/9HAg9jDHvAYEqHYUPkGJqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HfJFn/btsgCF7PGhh/9HAg9jDHvAYEqHYUPkGJqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHfJFn%2FbtsgCF7PGhh%2F9HAg9jDHvAYEqHYUPkGJqk%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;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;오픈된 Visual Studio Code를 닫습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;StatusBarItem(상태 표시줄 아이템)에는 현재 시간의 시간과 분이 표시되게 하고&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;말풍선(ToolTip, 툴&lt;/span&gt;팁)에는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 현재 시간의 &lt;/span&gt;&lt;/span&gt;시간, 분, 초가 표시되게 처리하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 현재 시간을 표시하는 함수를 생성합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684497695988&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function clock(statusBarItem) {
	// 현재 날짜/시간
	let today = new Date();

	// 현재 시
	let todayHours = today.getHours();
	// 현재 분
	let todayMinutes = today.getMinutes();
	// 현재 초
	let todaySeconds = today.getSeconds();

	let todayString = &quot;&quot;;
	if (todayHours &amp;lt; 10) {
		todayString += &quot;0&quot;;
	}
	todayString += todayHours + &quot;:&quot;;

	if (todayMinutes &amp;lt; 10) {
		todayString += &quot;0&quot;;
	}
	todayString += todayMinutes;
	
	statusBarItem.text = todayString;
	
	todayString += &quot;:&quot;;
	if (todaySeconds &amp;lt; 10) {
		todayString += &quot;0&quot;;
	}
	todayString += todaySeconds;
	
	statusBarItem.tooltip = todayString;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 현재 시간을 표시하는 함수가 호출되게 변경합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684497782513&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 상태 표시줄 아이템 생성 - 오른쪽 마지막으로 배정
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 0);

// 현재 시간 적용
clock(statusBarItem);

// 상태 표시줄 아이템 표시
statusBarItem.show();

// 상태 표시줄에 추가
context.subscriptions.push(statusBarItem);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blBXXE/btsgB2oWH3A/Yhndf1VubKATc8NWsf8SKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blBXXE/btsgB2oWH3A/Yhndf1VubKATc8NWsf8SKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blBXXE/btsgB2oWH3A/Yhndf1VubKATc8NWsf8SKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblBXXE%2FbtsgB2oWH3A%2FYhndf1VubKATc8NWsf8SKK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;위의 4번과 같이 디버깅하면 Status Bar(상태 표시줄)의 오른쪽에 현재 시간이 표시되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPvaHx/btsgEhyl7Z3/qw4LijJTQc57ffC6hYce2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPvaHx/btsgEhyl7Z3/qw4LijJTQc57ffC6hYce2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPvaHx/btsgEhyl7Z3/qw4LijJTQc57ffC6hYce2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPvaHx%2FbtsgEhyl7Z3%2Fqw4LijJTQc57ffC6hYce2k%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;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;오픈된 Visual Studio Code를 닫습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 현재 시간으로 StatusBarItem(상태 표시줄 아이템)에 시간과 분이 표시되게 하고&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;말풍선(ToolTip, 툴&lt;/span&gt;팁)에는&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;시간, 분, 초가 표시되게 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1초마다 현재 시간을 표시하는 함수를 호출하게 변경합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684498378438&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 상태 표시줄 아이템 생성 - 오른쪽 마지막으로 배정
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 0);

// 현재 시간 적용
clock(statusBarItem);

// 상태 표시줄 아이템 표시
statusBarItem.show();

// 1초 마다 현재 시간 적용
setInterval(() =&amp;gt; {
	clock(statusBarItem);
	}, 1000);

// 상태 표시줄에 추가
context.subscriptions.push(statusBarItem);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0uK5c/btsgE6wiOjP/s3GMiSli0ZDDFS023YYER1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0uK5c/btsgE6wiOjP/s3GMiSli0ZDDFS023YYER1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0uK5c/btsgE6wiOjP/s3GMiSli0ZDDFS023YYER1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0uK5c%2FbtsgE6wiOjP%2Fs3GMiSli0ZDDFS023YYER1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 4번과 같이 디버깅하면 Status Bar(상태 표시줄)의 오른쪽에 현재 시간이 1초마다 변경되면서 표시되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q3CkQ/btsgC2hitF3/phKVzmsSr7xjtaxuFV71xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q3CkQ/btsgC2hitF3/phKVzmsSr7xjtaxuFV71xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q3CkQ/btsgC2hitF3/phKVzmsSr7xjtaxuFV71xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq3CkQ%2FbtsgC2hitF3%2FphKVzmsSr7xjtaxuFV71xk%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;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;오픈된 Visual Studio Code를 닫습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;7. StatusBarItem(상태 표시줄 아이템)이 Status Bar(상태 표시줄)에서 구분되게 색상과 배경색을 설정합니다. 테마 색상은 &lt;a href=&quot;https://code.visualstudio.com/api/references/theme-color&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://code.visualstudio.com/api/references/theme-color&lt;/a&gt;를 참고하시기 바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684498634261&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 상태 표시줄 아이템 색상
statusBarItem.color = new vscode.ThemeColor('statusBarItem.warningForeground');
statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eewcFK/btsgEf1DPJh/wKllxpAYYLIkXVFIN10dvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eewcFK/btsgEf1DPJh/wKllxpAYYLIkXVFIN10dvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eewcFK/btsgEf1DPJh/wKllxpAYYLIkXVFIN10dvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeewcFK%2FbtsgEf1DPJh%2FwKllxpAYYLIkXVFIN10dvK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 4번과 같이 디버깅하면 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;StatusBarItem(상태 표시줄 아이템)의 색상이 변경된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emsApU/btsgBVQPmOO/xNLUAsVDL7smzbOC9oEEv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emsApU/btsgBVQPmOO/xNLUAsVDL7smzbOC9oEEv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emsApU/btsgBVQPmOO/xNLUAsVDL7smzbOC9oEEv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemsApU%2FbtsgBVQPmOO%2FxNLUAsVDL7smzbOC9oEEv1%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;2048&quot; height=&quot;1536&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>clock</category>
      <category>context.subscriptions.push</category>
      <category>createStatusBarItem</category>
      <category>extension</category>
      <category>Status Bar Item</category>
      <category>Visual Studio Code</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/278</guid>
      <comments>https://carrotweb.tistory.com/278#entry278comment</comments>
      <pubDate>Fri, 19 May 2023 21:27:54 +0900</pubDate>
    </item>
    <item>
      <title>VSCode Extension 개발 2 - Hello World</title>
      <link>https://carrotweb.tistory.com/277</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;기본 Extension 개발&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Extension&amp;nbsp;개발을&amp;nbsp;위해&amp;nbsp;Terminal(터미널)에서&amp;nbsp;yo&amp;nbsp;code&amp;nbsp;명령어를&amp;nbsp;입력하고&amp;nbsp;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684065125016&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yo code&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fc2zo/btsfjIYo9Au/jL3Nrpp6WlEATyRd0xgZf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fc2zo/btsfjIYo9Au/jL3Nrpp6WlEATyRd0xgZf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fc2zo/btsfjIYo9Au/jL3Nrpp6WlEATyRd0xgZf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFc2zo%2FbtsfjIYo9Au%2FjL3Nrpp6WlEATyRd0xgZf0%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684065233410&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? (Use arrow keys)
&amp;gt; New Extension (TypeScript)
  New Extension (JavaScript)
  New Color Theme
  New Language Support
  New Code Snippets
  New Keymap
  New Extension Pack
  New Language Pack (Localization)
  New Web Extension (TypeScript)
  New Notebook Renderer (TypeScript)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;What type of extension do you want to create? (어떤 타입의 확장 프로그램으로 만들기를 원하십니까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키보드의 상/하 방향키로 선택하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 New Extension (JavaScript)를 선택하고 Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gind6/btsfA4fmvbp/0DudddbRBMwd9ouUlW1DrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gind6/btsfA4fmvbp/0DudddbRBMwd9ouUlW1DrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gind6/btsfA4fmvbp/0DudddbRBMwd9ouUlW1DrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGind6%2FbtsfA4fmvbp%2F0DudddbRBMwd9ouUlW1DrK%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684065654406&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? ()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;What's the name of your extension? (확장&amp;nbsp;프로그램의&amp;nbsp;이름은&amp;nbsp;무엇입니까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;helloworld&quot; 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKOPL/btsfjKaQVgj/SrQlZnjcpHWyKhD3ANtoQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKOPL/btsfjKaQVgj/SrQlZnjcpHWyKhD3ANtoQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKOPL/btsfjKaQVgj/SrQlZnjcpHWyKhD3ANtoQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKOPL%2FbtsfjKaQVgj%2FSrQlZnjcpHWyKhD3ANtoQ1%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684065758243&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? helloworld
? What's the identifier of your extension? (helloworld)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;What's the identifier of your extension? (확장&amp;nbsp;프로그램의&amp;nbsp;식별자는&amp;nbsp;무엇입니까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서는 기본값인 (&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;helloworld)를 사용하기 위해 &lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYqK1Z/btsfghGOtB3/T3jkMh4rVvDHQVykeUSCQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYqK1Z/btsfghGOtB3/T3jkMh4rVvDHQVykeUSCQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYqK1Z/btsfghGOtB3/T3jkMh4rVvDHQVykeUSCQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYqK1Z%2FbtsfghGOtB3%2FT3jkMh4rVvDHQVykeUSCQ1%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684065878912&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? helloworld
? What's the identifier of your extension? helloworld
? What's the description of your extension? ()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;What's the description of your extension? (확장&amp;nbsp;프로그램에&amp;nbsp;대한&amp;nbsp;설명은&amp;nbsp;무엇입니까?)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;Extension Test&quot; 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4sQyJ/btsfA2BOTVH/k2vnTlWOviXrSKqJj3IWvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4sQyJ/btsfA2BOTVH/k2vnTlWOviXrSKqJj3IWvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4sQyJ/btsfA2BOTVH/k2vnTlWOviXrSKqJj3IWvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4sQyJ%2FbtsfA2BOTVH%2Fk2vnTlWOviXrSKqJj3IWvk%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684065969280&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? helloworld
? What's the identifier of your extension? helloworld
? What's the description of your extension? Extension Test
? Enable JavaScript type checking in 'jsconfig.json'? (y/N)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enable JavaScript type checking in 'jsconfig.json'? ('jsconfig.json'으로 JavaScript 타입을 체크하도록 하락하시겠습니까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;Y&quot; 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1GKD/btsfdWwEOgj/RK0Hnig8kjHGjd5r1qZgQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1GKD/btsfdWwEOgj/RK0Hnig8kjHGjd5r1qZgQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1GKD/btsfdWwEOgj/RK0Hnig8kjHGjd5r1qZgQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1GKD%2FbtsfdWwEOgj%2FRK0Hnig8kjHGjd5r1qZgQ0%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684066216123&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? helloworld
? What's the identifier of your extension? helloworld
? What's the description of your extension? Extension Test
? Enable JavaScript type checking in 'jsconfig.json'? Yes
? Initialize a git repository? (Y/n)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Initialize a git repository? (git 저장소를 초기화하시겠습니까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;여기서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&quot;N&quot; 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjA3Bo/btsfA3AJQEQ/6vwsofiUbee5JMW21KhaM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjA3Bo/btsfA3AJQEQ/6vwsofiUbee5JMW21KhaM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjA3Bo/btsfA3AJQEQ/6vwsofiUbee5JMW21KhaM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjA3Bo%2FbtsfA3AJQEQ%2F6vwsofiUbee5JMW21KhaM0%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684066298754&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;     _-----_     ╭──────────────────────────╮
    |       |    │   Welcome to the Visual  │
    |--(o)--|    │   Studio Code Extension  │
   `---------&amp;acute;   │        generator!        │
    ( _&amp;acute;U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 &amp;acute;   `  |&amp;deg; &amp;acute; Y `

? What type of extension do you want to create? New Extension (JavaScript)
? What's the name of your extension? helloworld
? What's the identifier of your extension? helloworld
? What's the description of your extension? Extension Test
? Enable JavaScript type checking in 'jsconfig.json'? Yes
? Initialize a git repository? No
? Which package manager to use? (Use arrow keys)
&amp;gt; npm 
  yarn 
  pnpm&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Which package manager to use? (사용할&amp;nbsp;패키지&amp;nbsp;관리자는&amp;nbsp;무엇입니까?)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키보드의 상/하 방향키로 선택하면 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;npm를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;선택하고&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&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;그러면 &quot;helloworld'라는 폴더가 생성되고 Node 패키지 관련 모듈과 파일들이 설치됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lqv7W/btsfCrVUlzy/1S0CBjZ9FjJ0EvWIYEjLxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lqv7W/btsfCrVUlzy/1S0CBjZ9FjJ0EvWIYEjLxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lqv7W/btsfCrVUlzy/1S0CBjZ9FjJ0EvWIYEjLxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flqv7W%2FbtsfCrVUlzy%2F1S0CBjZ9FjJ0EvWIYEjLxK%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&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;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cckweT/btsfvokURLl/U36s6w56IKXGJb1xpCEmRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cckweT/btsfvokURLl/U36s6w56IKXGJb1xpCEmRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cckweT/btsfvokURLl/U36s6w56IKXGJb1xpCEmRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcckweT%2FbtsfvokURLl%2FU36s6w56IKXGJb1xpCEmRK%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684066554132&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;? Do you want to open the new folder with Visual Studio Code? (Use arrow keys)
&amp;gt; Open with `code`
  Skip&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Do you want to open the new folder with Visual Studio Code? (Visual&amp;nbsp;Studio&amp;nbsp;Code로&amp;nbsp;새&amp;nbsp;폴더를&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서는&lt;span&gt; skip&lt;/span&gt;를&lt;span&gt;&amp;nbsp;&lt;/span&gt;선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;Enter&amp;nbsp;키를&amp;nbsp;누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxOxDf/btsfOHRxzI3/LkAdIz3WR6lSdtPM3hm90k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxOxDf/btsfOHRxzI3/LkAdIz3WR6lSdtPM3hm90k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxOxDf/btsfOHRxzI3/LkAdIz3WR6lSdtPM3hm90k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxOxDf%2FbtsfOHRxzI3%2FLkAdIz3WR6lSdtPM3hm90k%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&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;여기서 Open with `code`를 선택하고 Enter 키를 누르면 새로운 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Visual&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Studio Code가 오픈됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rYnon/btsfWW8EPO5/AjsBlQNrtZ5wZtKSaQLZkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rYnon/btsfWW8EPO5/AjsBlQNrtZ5wZtKSaQLZkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rYnon/btsfWW8EPO5/AjsBlQNrtZ5wZtKSaQLZkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrYnon%2FbtsfWW8EPO5%2FAjsBlQNrtZ5wZtKSaQLZkk%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;2053&quot; height=&quot;1262&quot; data-origin-width=&quot;2053&quot; data-origin-height=&quot;1262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그래서 Visual&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Studio Code의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Terminal(터미널)에서 yo code 명령어를 실행할 경우에는 skip를 선택하시기 바랍니다.&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. Terminal(터미널)를 닫고 EXPLORER(탐색기)에서 &quot;hellowold&quot; 폴더에 있는 'extension.js&quot;를 클릭하여 오픈해 보면 기본적인 코딩이 되어 있는 것을 학인 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MW1cd/btsfezVtOeT/Afr0fBKDRjvISZng71MjWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MW1cd/btsfezVtOeT/Afr0fBKDRjvISZng71MjWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MW1cd/btsfezVtOeT/Afr0fBKDRjvISZng71MjWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMW1cd%2FbtsfezVtOeT%2FAfr0fBKDRjvISZng71MjWK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684067759317&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// The command has been defined in the package.json file
// Now provide the implementation of the command with  registerCommand
// The commandId parameter must match the command field in package.json
let disposable = vscode.commands.registerCommand('helloworld.helloWorld', function () {
	// The code you place here will be executed every time your command is executed
	// Display a message box to the user
	vscode.window.showInformationMessage('Hello World from helloworld!');
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 코딩은 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;명령 팔레트(Command Palette)에서 &quot;Hello World&quot;를 입력하고 선택되어 실행되면 메시지 박스가 나타나게 되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;package.json 파일을 오픈하여 보면 &quot;title&quot;이 &quot;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Hello World&quot;로 되어 있습니다, 이 부분을 수정하면 명령어가 변경됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684069097741&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;contributes&quot;: {
  &quot;commands&quot;: [{
    &quot;command&quot;: &quot;helloworld.helloWorld&quot;,
    &quot;title&quot;: &quot;Hello World&quot;
  }]
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;3. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Run(실행) &amp;gt; Start Debugging(디버깅 시작)를 클릭하거나 기능키 F5&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;버튼을 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그러면 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;디버깅을 위해 실행될 환경을 선택할 수 있는 창이 나타납니다.&lt;span&gt; Extension를 테스트하기 위해서 &quot;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;VS Code E&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;xtension Development&lt;/span&gt;&quot;를 선택합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjGoXR/btsfegPcRgX/YR99J25c0MkzWHvz8d4nkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjGoXR/btsfegPcRgX/YR99J25c0MkzWHvz8d4nkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjGoXR/btsfegPcRgX/YR99J25c0MkzWHvz8d4nkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjGoXR%2FbtsfegPcRgX%2FYR99J25c0MkzWHvz8d4nkk%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 새로운 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code가 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfqTLQ/btsfeAfLQIa/ncha2o7g4FAEH0DBw6NvPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfqTLQ/btsfeAfLQIa/ncha2o7g4FAEH0DBw6NvPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfqTLQ/btsfeAfLQIa/ncha2o7g4FAEH0DBw6NvPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfqTLQ%2FbtsfeAfLQIa%2Fncha2o7g4FAEH0DBw6NvPK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;4. 새로운 Visual Studio Code의 메뉴 View &amp;gt; Command Palette... 를 클릭하거나 Ctrl + Shift + P를 눌러 명령 팔레트(Command Palette)를 실행시킨 후 입력란에서 &quot;Hello&quot;를 입력합니다. 그리고 검색된 결과에서 &quot;Hello World&quot;를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJi4YJ/btsfvo6juKE/mn2KrbpZposA60jUnF4Wk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJi4YJ/btsfvo6juKE/mn2KrbpZposA60jUnF4Wk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJi4YJ/btsfvo6juKE/mn2KrbpZposA60jUnF4Wk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJi4YJ%2Fbtsfvo6juKE%2Fmn2KrbpZposA60jUnF4Wk1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 오른쪽 상태바 위에 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;메시지 박스가&lt;span&gt; 나타납니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btWLTv/btsfA2WayLX/2MhjEK2IRmeBnYs49fiDQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btWLTv/btsfA2WayLX/2MhjEK2IRmeBnYs49fiDQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btWLTv/btsfA2WayLX/2MhjEK2IRmeBnYs49fiDQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtWLTv%2FbtsfA2WayLX%2F2MhjEK2IRmeBnYs49fiDQ0%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Extension를 개발할 수 있게 되었습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>extension</category>
      <category>Visual Studio Code</category>
      <category>yo code</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/277</guid>
      <comments>https://carrotweb.tistory.com/277#entry277comment</comments>
      <pubDate>Sun, 14 May 2023 22:04:35 +0900</pubDate>
    </item>
    <item>
      <title>VSCode Extension 개발 1 - 실행 정책 변경(Set-ExecutionPolicy), Yeoman, VS Code Extension Generator 설치</title>
      <link>https://carrotweb.tistory.com/276</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Yeoman과 VS Code Extension Generator 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다. Yeoman과 VS Code Extension Generator를 설치&lt;span style=&quot;text-align: start;&quot;&gt;하기 위해 Terminal(터미널)에서 npm install -g yo generator-code 명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684054637293&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install -g yo generator-code&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czD1cI/btsfvnGbQiU/4aq4oax94IbpsQRSObJpd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czD1cI/btsfvnGbQiU/4aq4oax94IbpsQRSObJpd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czD1cI/btsfvnGbQiU/4aq4oax94IbpsQRSObJpd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczD1cI%2FbtsfvnGbQiU%2F4aq4oax94IbpsQRSObJpd1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;설치가 진행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c001Gb/btsfjJpnJ7Z/7cPVVUs1UQJZXIhK1txsrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c001Gb/btsfjJpnJ7Z/7cPVVUs1UQJZXIhK1txsrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c001Gb/btsfjJpnJ7Z/7cPVVUs1UQJZXIhK1txsrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc001Gb%2FbtsfjJpnJ7Z%2F7cPVVUs1UQJZXIhK1txsrK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Extension 개발&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Extension 개발을 위해 작업 폴더를 생성합니다. 저는 &quot;C:\workspaces\webstudys\extension1&quot; 폴더를 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하거나 Ctrl 키를 누를 상태에서 K, O를 이어서 누릅니다. (Ctrl + K, Ctrl + O) 그리고 &quot;C:\workspaces\webstudys\extension1&quot; 폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VcAuE/btsfPCWS4cI/34gGp5gYAd4kcW6jSk6ok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VcAuE/btsfPCWS4cI/34gGp5gYAd4kcW6jSk6ok0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VcAuE/btsfPCWS4cI/34gGp5gYAd4kcW6jSk6ok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVcAuE%2FbtsfPCWS4cI%2F34gGp5gYAd4kcW6jSk6ok0%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;2640&quot; height=&quot;1630&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1630&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;3.&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;EXPLORER(탐색기)에 오픈한 폴더의 이름이 대문자(EXTENSION1)로 적용되어 오픈됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 보안을 위해 Trust(신뢰) 확인 창이 나타납니다.&amp;nbsp;&lt;span style=&quot;text-align: start;&quot;&gt;&quot;Yes, I Trust the authors&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LPyrA/btsfez8Trqo/ND8kK7E2brHjqZK9zW1fJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LPyrA/btsfez8Trqo/ND8kK7E2brHjqZK9zW1fJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LPyrA/btsfez8Trqo/ND8kK7E2brHjqZK9zW1fJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLPyrA%2Fbtsfez8Trqo%2FND8kK7E2brHjqZK9zW1fJk%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;4.&amp;nbsp;&lt;/span&gt;Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다. 그리고 &lt;span style=&quot;text-align: start;&quot;&gt;Extension&amp;nbsp;개발을&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt; 위해 Terminal(터미널)에서 yo code 명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684058660251&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yo code&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F44xA/btsfe6yDxGm/2nG0y24zFRgbW30DBKAwT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F44xA/btsfe6yDxGm/2nG0y24zFRgbW30DBKAwT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F44xA/btsfe6yDxGm/2nG0y24zFRgbW30DBKAwT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF44xA%2Fbtsfe6yDxGm%2F2nG0y24zFRgbW30DBKAwT1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러면 보안 문제(스크립트 실행 제한)로 실행되지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YdzH1/btsfg3IqsWF/TAgQhxaYprGHUtFL1E3NhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YdzH1/btsfg3IqsWF/TAgQhxaYprGHUtFL1E3NhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YdzH1/btsfg3IqsWF/TAgQhxaYprGHUtFL1E3NhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYdzH1%2Fbtsfg3IqsWF%2FTAgQhxaYprGHUtFL1E3NhK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684058715003&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yo : 이 시스템에서 스크립트를 실행할 수 없으므로 C:\Users\carro\AppData\Roaming\npm\yo.ps1 파일을 로드할 수 
없습니다. 자세한 내용은 about_Execution_Policies(https://go.microsoft.com/fwlink/?LinkID=135170)를 참조하십시
오.
위치 줄:1 문자:1
+ yo code
+ ~~
    + CategoryInfo          : 보안 오류: (:) [], PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;스크립트 실행 제한 확인 및 변경&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PowerShell의 실행 정책은 PowerShell이 구성 파일을 로드하고 스크립트를 실행하는 조건을 제어하는 안전 기능입니다. 이 안전 기능은 악성 스크립트의 실행을 방지하는 데 도움이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 현재 PowerShell 세션에 대한 실행 정책을 확인하기 위해 Terminal(터미널)에 Get-ExecutionPolicy &lt;span style=&quot;text-align: start;&quot;&gt;명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684058936652&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get-ExecutionPolicy&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CP4j5/btsfOH4ZTjB/OH5GTnQWXITJ93wATC2V71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CP4j5/btsfOH4ZTjB/OH5GTnQWXITJ93wATC2V71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CP4j5/btsfOH4ZTjB/OH5GTnQWXITJ93wATC2V71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCP4j5%2FbtsfOH4ZTjB%2FOH5GTnQWXITJ93wATC2V71%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Terminal(터미널)에 &quot;&lt;/span&gt;Restricted&quot;이라고 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Restricted은 윈도우 클라이언트 컴퓨터에 대한 기본 실행 정책으로 개별 명령을 허용하지만 스크립트는 허용하지 않습니다. 그래서 &lt;span style=&quot;text-align: start;&quot;&gt;yo code 명령어가 실행되지 않았습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 자세하게 현재 세션에 영향을 주는 모든 실행 정책을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;확인하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Terminal(터미널)에 Get-ExecutionPolicy&amp;nbsp;-List&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령어를 입력하고 Enter 키를 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684059653423&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get-ExecutionPolicy -List&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmoIuS/btsfPDVOdDM/AnFrt9PSJtKw8ndJoRKUh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmoIuS/btsfPDVOdDM/AnFrt9PSJtKw8ndJoRKUh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmoIuS/btsfPDVOdDM/AnFrt9PSJtKw8ndJoRKUh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmoIuS%2FbtsfPDVOdDM%2FAnFrt9PSJtKw8ndJoRKUh1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 정책 범위(Scope)로 실행 정책(ExecutionPolicy)이 출력됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684059765121&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       Undefined&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;PowerShell 실행 정책을 변경하려면 Set-ExecutionPolicy 명령어를 사용해야 합니다. Set-ExecutionPolicy 명령어가 실행되면 변경된 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실행 정책으로 &lt;/span&gt;즉시 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 실행 정책 범위(Scope)에만 실행 정책을 변경하기 위해서는 매개 변수로 Scope를 사용해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684060773370&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy -Scope &amp;lt;scope&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell 실행 정책 범위 (Scope)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MachinePolicy - 컴퓨터의 모든 사용자에 대한 그룹 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;정책으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설정합니다.&lt;/li&gt;
&lt;li&gt;UserPolicy - 컴퓨터의 현재 사용자에 대한 그룹 정책으로 설정됩니다.&lt;/li&gt;
&lt;li&gt;Process - 현재 프로세스에만 설정됩니다.&lt;/li&gt;
&lt;li&gt;CurrentUser - 현재 사용자에게만 설정됩니다.&lt;/li&gt;
&lt;li&gt;LocalMachine - 현재&amp;nbsp;컴퓨터의&amp;nbsp;모든&amp;nbsp;사용자에게 설정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 정책을 변경&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하기 위해서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;매개 변수로 ExecutionPolicy를 사용해야 합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684060758860&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy -ExecutionPolicy &amp;lt;PolicyName&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell 실행 정책 (PolicyName)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AllSigned - 모든 스크립트에는 신뢰할 수 있는 작성자의 서명이 있어야 스크립트가 실행됩니다.&lt;/li&gt;
&lt;li&gt;Bypass - 아무것도 차단되지 않으며 경고 또는 프롬프트 없이 스크립트기 실행됩니다.&lt;/li&gt;
&lt;li&gt;Default - 기본 실행 정책으로 윈도우 클라이언트이면 Restricted이 윈도우 서버이면 RemoteSigned으로 설정됩니다.&lt;/li&gt;
&lt;li&gt;RemoteSigned - 로컬 컴퓨터에 작성되면 작성자의 서명이 없어도 스크립트 파일이 실행됩니다. 그렇지만 인터넷에서 다운로드한 스크립트 파일은 작성자의 서명이 필요합니다.&lt;/li&gt;
&lt;li&gt;Restricted - 개별 명령을 실행되지만 스크립트 파일은 실행을 허용하지 않습니다.&lt;/li&gt;
&lt;li&gt;Undefined - 실행 정책이 설정되어 있지 않아서 스크립트가 실행됩니다.&lt;/li&gt;
&lt;li&gt;Unrestricted -&amp;nbsp; 서명되지 않은 스크립트를 실행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;사용자에게만 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실행 정책을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;변경하기 위해 &amp;lt;scope&amp;gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;CurrentUser로 &amp;lt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;PolicyName&amp;gt;은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;RemoteSigned으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;설정하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684060011957&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;3. 실행 정책을&lt;span&gt; 변경&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Terminal(터미널)에 Set-ExecutionPolicy&amp;nbsp;-Scope&amp;nbsp;CurrentUser&amp;nbsp;-ExecutionPolicy&amp;nbsp;RemoteSigned&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령어를 입력하고 Enter 키를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh1ib2/btsfehtLtBg/uMv5umA6FxK5KWM5eCQPF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh1ib2/btsfehtLtBg/uMv5umA6FxK5KWM5eCQPF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh1ib2/btsfehtLtBg/uMv5umA6FxK5KWM5eCQPF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh1ib2%2FbtsfehtLtBg%2FuMv5umA6FxK5KWM5eCQPF1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;lt;scope&amp;gt;를 LocalMachine으로 할 경우 PowerShell를 관리자 권한으로 실행해야 합니다. 그렇지 않으면 실행되지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684063781868&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecQADr/btsfdcfg1c3/gSYv73pKJ5DmIKzw8Ta5tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecQADr/btsfdcfg1c3/gSYv73pKJ5DmIKzw8Ta5tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecQADr/btsfdcfg1c3/gSYv73pKJ5DmIKzw8Ta5tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecQADr%2Fbtsfdcfg1c3%2FgSYv73pKJ5DmIKzw8Ta5tK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684060119849&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy : 레지스트리 키 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'
에 대한 액세스가 거부되었습니다. 기본(LocalMachine) Scope에 대한 실행 정책을 변경하려면 &quot;관리자 권한으로 실행&quot; 옵션으로
 Windows PowerShell을 시작하십시오. 현재 사용자에 대한 실행 정책을 변경하려면 &quot;Set-ExecutionPolicy -Scope CurrentUser&quot;
를 실행하십시오.
위치 줄:1 문자:1
+ Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;PowerShell를 관리자 권한으로 실행하여 LocalMachine의 실행 정책 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 윈도우 &quot;시작&quot;(start)버튼을 클릭하고 &quot;PowerShell&quot;를 검색하여 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;권리자 권한으로 실행&quot;을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqkv6R/btsfpe3T3IB/J3Oo5t67y6nk74eKTueeS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqkv6R/btsfpe3T3IB/J3Oo5t67y6nk74eKTueeS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqkv6R/btsfpe3T3IB/J3Oo5t67y6nk74eKTueeS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqkv6R%2Fbtsfpe3T3IB%2FJ3Oo5t67y6nk74eKTueeS0%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;600&quot; height=&quot;563&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1500&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;2. 실행 정책을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;변경&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;하기 위해&lt;span&gt; PowerShell&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에&lt;span&gt;&amp;nbsp;&lt;/span&gt;Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령어를 입력하고 Enter 키를 누릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684064289144&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1958&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIvksb/btsfpev3APx/29MmvzK1teJispehbeCwR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIvksb/btsfpev3APx/29MmvzK1teJispehbeCwR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIvksb/btsfpev3APx/29MmvzK1teJispehbeCwR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIvksb%2Fbtsfpev3APx%2F29MmvzK1teJispehbeCwR1%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;1958&quot; height=&quot;1190&quot; data-origin-width=&quot;1958&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 실행 정책을 변경할 것인지 확인을 합니다. &quot;Y&quot;를 입력하고 Enter 키를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1958&quot; data-origin-height=&quot;1190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn8VPN/btsfeh8jEy1/i4U0bPkUjmWQ5RVi3xlIn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn8VPN/btsfeh8jEy1/i4U0bPkUjmWQ5RVi3xlIn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn8VPN/btsfeh8jEy1/i4U0bPkUjmWQ5RVi3xlIn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn8VPN%2Fbtsfeh8jEy1%2Fi4U0bPkUjmWQ5RVi3xlIn0%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;1958&quot; height=&quot;1190&quot; data-origin-width=&quot;1958&quot; data-origin-height=&quot;1190&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1684064382692&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;실행 규칙 변경
실행 정책은 신뢰하지 않는 스크립트로부터 사용자를 보호합니다. 실행 정책을 변경하면 about_Execution_Policies 도움말
항목(https://go.microsoft.com/fwlink/?LinkID=135170)에 설명된 보안 위험에 노출될 수 있습니다. 실행 정책을
변경하시겠습니까?
[Y] 예(Y)  [A] 모두 예(A)  [N] 아니요(N)  [L] 모두 아니요(L)  [S] 일시 중단(S)  [?] 도움말 (기본값은 &quot;N&quot;): Y&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;3. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실행 정책이 변경 되었는지 &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;확인하기 위해&lt;span&gt; PowerShell&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;에 Get-ExecutionPolicy&amp;nbsp;-List&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령어를 입력하고 Enter 키를 누릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684064653253&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Get-ExecutionPolicy -List&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;929&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djJw1E/btsfWUCZeGs/4DyHuTTxOYZmjDERbykpT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djJw1E/btsfWUCZeGs/4DyHuTTxOYZmjDERbykpT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djJw1E/btsfWUCZeGs/4DyHuTTxOYZmjDERbykpT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjJw1E%2FbtsfWUCZeGs%2F4DyHuTTxOYZmjDERbykpT1%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;1529&quot; height=&quot;929&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;929&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;LocalMachine에 실행 정책이 변경된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>ExecutionPolicy</category>
      <category>get-ExecutionPolicy</category>
      <category>RemoteSigned</category>
      <category>scope</category>
      <category>Set-ExecutionPolicy</category>
      <category>Visual Studio Code</category>
      <category>VS Code Extension Generator</category>
      <category>yeoman</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/276</guid>
      <comments>https://carrotweb.tistory.com/276#entry276comment</comments>
      <pubDate>Sun, 14 May 2023 20:47:47 +0900</pubDate>
    </item>
    <item>
      <title>VSCode Node 개발 - 패키지 생성 및 실행, npm init</title>
      <link>https://carrotweb.tistory.com/275</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio Code에서 Node.js 기반의 프로그램을 개발하기 위해서 윈도우에 Node.js가 설치되어 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;윈도우에 Node.js 다운로드 및 설치&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;윈도우 Node.js 다운로드 및 설치에 대한 자세한 설명은 &quot;&lt;a href=&quot;https://carrotweb.tistory.com/106&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;윈도우 Node.js 설치 - Windows Node.js Download &amp;amp; Install - 14.x&lt;/a&gt;&quot;를 참고하시기&amp;nbsp;바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Node.js의 2023년 4월 12일 버전은 18.16.0 LTS입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Node 패키지 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Node를 위해 작업 폴더를 생성합니다. 저는 &quot;C:\workspaces\webstudys\node1&quot; 폴더를 생성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기)를 클릭하거나 Ctrl 키를 누를 상태에서 K, O를 이어서 누릅니다. (Ctrl + K, Ctrl + O) 그리고 &quot;C:\workspaces\webstudys\node1&quot; 폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckKY7K/btsfcNNj3yN/QgW5A9YyVj8CRW5NJkAHrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckKY7K/btsfcNNj3yN/QgW5A9YyVj8CRW5NJkAHrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckKY7K/btsfcNNj3yN/QgW5A9YyVj8CRW5NJkAHrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckKY7K%2FbtsfcNNj3yN%2FQgW5A9YyVj8CRW5NJkAHrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1630&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1630&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;EXPLORER(탐색기)에 오픈한 폴더의 이름이 대문자(NODE1)로 적용되어 오픈됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 보안을 위해 Trust(신뢰) 확인 창이 나타납니다. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&quot;Yes, I Trust the authors&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HMsRI/btsfg2QaWRM/q3fMQoVZp5z5OlpqakqUk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HMsRI/btsfg2QaWRM/q3fMQoVZp5z5OlpqakqUk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HMsRI/btsfg2QaWRM/q3fMQoVZp5z5OlpqakqUk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHMsRI%2Fbtsfg2QaWRM%2Fq3fMQoVZp5z5OlpqakqUk1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trust Confirm에 대한 자세한 내용은 &quot;&lt;a href=&quot;https://carrotweb.tistory.com/273&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VSCode Web Project - Trust Confirm (Do you trust the authors of the files in this folder?)&lt;/a&gt;&quot;를 참고하시기&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: #555555; text-align: start;&quot;&gt;그리고 Welcome(시작) 창은 닫습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;4. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Terminal(터미널) &amp;gt; New Terminal(새 터미널)를 클릭하거나 Ctrl + Shift + `(backtick) 키를 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbdlWc/btsfg3avVBO/OTKutEWtJy5P73o7kdh3W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbdlWc/btsfg3avVBO/OTKutEWtJy5P73o7kdh3W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbdlWc/btsfg3avVBO/OTKutEWtJy5P73o7kdh3W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbdlWc%2Fbtsfg3avVBO%2FOTKutEWtJy5P73o7kdh3W0%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;5. Node 패키지를 생성하기 위해 Terminal(터미널)에서 npm init 명령어를 입력하고 Enter 키를 누릅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684054666111&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wc0i6/btsfjIRvaz4/OrNfl4tiZGfVAIFNVc04IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wc0i6/btsfjIRvaz4/OrNfl4tiZGfVAIFNVc04IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wc0i6/btsfjIRvaz4/OrNfl4tiZGfVAIFNVc04IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWc0i6%2FbtsfjIRvaz4%2FOrNfl4tiZGfVAIFNVc04IK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm(Node&amp;nbsp;Package&amp;nbsp;Manager)는&amp;nbsp;Node.js로&amp;nbsp;만들어진&amp;nbsp;모듈을&amp;nbsp;설치하고&amp;nbsp;관리해&amp;nbsp;주는&amp;nbsp;프로그램입니다. &lt;br /&gt;npm int는 패키지(애플리케이션)를 생성(초기화) 해주는 명령어입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oB4MY/btsfOIQj1da/uCbyBrokGuTVvEE5NpEnw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oB4MY/btsfOIQj1da/uCbyBrokGuTVvEE5NpEnw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oB4MY/btsfOIQj1da/uCbyBrokGuTVvEE5NpEnw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoB4MY%2FbtsfOIQj1da%2FuCbyBrokGuTVvEE5NpEnw1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;6. 기본 설정으로 처리하겠습니다. &lt;br /&gt;변경하려면 입력하고 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Enter&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;키를 누르면 됩니다. 기본 값을 사용하려면 Enter 키를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;누르면 됩니다.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;​&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;package name는 패키지 명입니다. (node1)는 기본 값으로 폴더 명입니다.&lt;/li&gt;
&lt;li&gt;version는 패키지 버전입니다. (1.0.0)는 기본 값입니다.&lt;/li&gt;
&lt;li&gt;description는 패키지에 대한 설명입니다.&lt;/li&gt;
&lt;li&gt;entry point는 시작 파일 명입니다. (index.js)는 기본 값입니다.&lt;/li&gt;
&lt;li&gt;test command는 npm test를 호출할 때마다 실행되는 명령입니다.&lt;/li&gt;
&lt;li&gt;git repository는 패키지가 저장되어 있는 Git 저장소의 URL입니다.&lt;/li&gt;
&lt;li&gt;keywords는 패키지의 키워드입니다.&lt;/li&gt;
&lt;li&gt;author는 작성자의 이름입니다. 여러분의 이름이나 아이디를 입력하면 됩니다.&lt;/li&gt;
&lt;li&gt;license는 패키지 사용에 대한 라이선스입니다. (ISC)는 기본 값입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmplk3/btsfdcffg6B/ZYY7B36ANgJJr6UFhzrcbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmplk3/btsfdcffg6B/ZYY7B36ANgJJr6UFhzrcbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmplk3/btsfdcffg6B/ZYY7B36ANgJJr6UFhzrcbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmplk3%2Fbtsfdcffg6B%2FZYY7B36ANgJJr6UFhzrcbK%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Is tis OK? (yes)&quot;에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Enter 키를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;누르면 package.json 파일이 생성됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwHMcp/btsfvod1fCs/c9tv45TTpu8CZw8C0VdgFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwHMcp/btsfvod1fCs/c9tv45TTpu8CZw8C0VdgFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwHMcp/btsfvod1fCs/c9tv45TTpu8CZw8C0VdgFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwHMcp%2Fbtsfvod1fCs%2Fc9tv45TTpu8CZw8C0VdgFk%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Node 패키지에 Entry Point 파일 만들기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Entry Point 파일인 index.js 파일을 생성하기 위해서 EXPLORER(탐색기)의 NODE1에서 첫 번째 아이콘(New File...(새 파일))을 클릭하고 입력란에 &quot;index.js&quot;를 입력하고 Enter 키를 눌러 파일을 생성합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjMtBO/btsfez19vhi/igLTJ1urt2mv7oTqR9FHM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjMtBO/btsfez19vhi/igLTJ1urt2mv7oTqR9FHM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjMtBO/btsfez19vhi/igLTJ1urt2mv7oTqR9FHM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjMtBO%2Fbtsfez19vhi%2FigLTJ1urt2mv7oTqR9FHM0%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;2. 간단하게 &quot;Hello World!&quot;가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;콘솔로 출력되게&lt;span&gt; &lt;/span&gt;&lt;/span&gt;만들겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ju6ZB/btsfcljemmZ/03Xc5IpRIuDoQk2QpMuF6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ju6ZB/btsfcljemmZ/03Xc5IpRIuDoQk2QpMuF6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ju6ZB/btsfcljemmZ/03Xc5IpRIuDoQk2QpMuF6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJu6ZB%2FbtsfcljemmZ%2F03Xc5IpRIuDoQk2QpMuF6K%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&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;size18&quot;&gt;&lt;b&gt;Node 패키지 실행하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Terminal(터미널)에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;node index.js를 입력하고 Enter 키를 눌러 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1684054687951&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node index.js&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mB2f1/btsfg3IoPmP/yKRBUkyWdaKxtpcfbocDS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mB2f1/btsfg3IoPmP/yKRBUkyWdaKxtpcfbocDS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mB2f1/btsfg3IoPmP/yKRBUkyWdaKxtpcfbocDS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmB2f1%2Fbtsfg3IoPmP%2FyKRBUkyWdaKxtpcfbocDS1%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;2628&quot; height=&quot;1616&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Node가 실행되면서 Terminal(터미널)에 &quot;Hello World!&quot;가 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Node.js로 REST API 서버 개발에 대한 자세한 개발 설명은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&quot;&lt;a href=&quot;https://carrotweb.tistory.com/category/Vue.js%203%20%26%20NodeJS/NodeJS&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Node.js&lt;/a&gt;&quot;를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;참고하시기&amp;nbsp;바랍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>Node</category>
      <category>npm init</category>
      <category>package</category>
      <category>terminal</category>
      <category>Visual Studio Code</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/275</guid>
      <comments>https://carrotweb.tistory.com/275#entry275comment</comments>
      <pubDate>Sun, 14 May 2023 17:42:39 +0900</pubDate>
    </item>
    <item>
      <title>VSCode 웹 서버 설치, 포트 변경 - 라이브 서버(Live Server)</title>
      <link>https://carrotweb.tistory.com/274</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브 서버(Live Server) 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 왼쪽에 있는 Activity Bar(작업 표시줄)에서 Extensions(학장) 버튼을 클릭하거나 Ctrl + Shift + X를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqqTRo/btsftJWiGN7/dLTMG3LjkKkFVwR4JNtkQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqqTRo/btsftJWiGN7/dLTMG3LjkKkFVwR4JNtkQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqqTRo/btsftJWiGN7/dLTMG3LjkKkFVwR4JNtkQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqqTRo%2FbtsftJWiGN7%2FdLTMG3LjkKkFVwR4JNtkQK%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;2. 라이브 서버를 설치하기 위해 입력란에 &quot;Live Server&quot;를 입력하여 검색합니다. 검색된 결과 리스트에서 &quot;Live Server&quot;를&amp;nbsp;선택하고&amp;nbsp;&quot;Install&quot;버튼을&amp;nbsp;클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EaZbA/btsffvYTWmS/kf0RCO0fJl9JdBpOBXOCg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EaZbA/btsffvYTWmS/kf0RCO0fJl9JdBpOBXOCg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EaZbA/btsffvYTWmS/kf0RCO0fJl9JdBpOBXOCg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEaZbA%2FbtsffvYTWmS%2Fkf0RCO0fJl9JdBpOBXOCg0%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;3. &amp;nbsp;설치하는데&amp;nbsp; 조금 시간이 걸립니다. (저는 약 50초 걸렸습니다.) 설치가 완료됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw3RBv/btsfe7RkxtG/9NLVLGcb2pbZoVJiFfiqx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw3RBv/btsfe7RkxtG/9NLVLGcb2pbZoVJiFfiqx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw3RBv/btsfe7RkxtG/9NLVLGcb2pbZoVJiFfiqx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw3RBv%2Fbtsfe7RkxtG%2F9NLVLGcb2pbZoVJiFfiqx1%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;4. Activity Bar(작업 표시줄)에서 Extensions(학장) 버튼을 클릭하여 닫습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브 서버(Live Server) 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 왼쪽에 있는 Activity Bar(작업 표시줄)에서 Explorer(탐색기) 버튼을 클릭하거나 Ctrl + Shift + E를 누릅니다. 그리고 &quot;index.html&quot;파일에서 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴에서 &quot;Open with Live Server&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Om94f/btsfaJqQVaY/n7ZSO7kGTjRJveIzMg1c0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Om94f/btsfaJqQVaY/n7ZSO7kGTjRJveIzMg1c0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Om94f/btsfaJqQVaY/n7ZSO7kGTjRJveIzMg1c0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOm94f%2FbtsfaJqQVaY%2Fn7ZSO7kGTjRJveIzMg1c0K%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;또는 &quot;index.html&quot;파일 편집기에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;마우스 오른쪽 버튼을 눌러&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;콘텍스트&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메뉴에서 &quot;Open with Live Server&quot;를 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCdu7j/btsfghfj7QW/81x2OvI9eUr1BkUnDkGaS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCdu7j/btsfghfj7QW/81x2OvI9eUr1BkUnDkGaS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCdu7j/btsfghfj7QW/81x2OvI9eUr1BkUnDkGaS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCdu7j%2Fbtsfghfj7QW%2F81x2OvI9eUr1BkUnDkGaS0%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;2. 보안 경고창이 나타납니다. &quot;액세스 허용(A)&quot;버튼을 눌러 차단을 허용해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AQAMy/btsfbjyUIuW/eyFgxKmjZuCsFvuHYxF4J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AQAMy/btsfbjyUIuW/eyFgxKmjZuCsFvuHYxF4J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AQAMy/btsfbjyUIuW/eyFgxKmjZuCsFvuHYxF4J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAQAMy%2FbtsfbjyUIuW%2FeyFgxKmjZuCsFvuHYxF4J0%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;495&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;870&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;3. 기본 브라우저로 설정된 웹 브라우저가 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localhost(로컬호스트, IP가 127.0.0.1)로 포트번호 5500으로 웹 서버가 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2218&quot; data-origin-height=&quot;1496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pLpSI/btsfghGocKP/Yjy1Nfvp51qAE3fmnGTaP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pLpSI/btsfghGocKP/Yjy1Nfvp51qAE3fmnGTaP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pLpSI/btsfghGocKP/Yjy1Nfvp51qAE3fmnGTaP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpLpSI%2FbtsfghGocKP%2FYjy1Nfvp51qAE3fmnGTaP0%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;2218&quot; height=&quot;1496&quot; data-origin-width=&quot;2218&quot; data-origin-height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 디버깅(Run(실행)&amp;nbsp;&amp;gt;&amp;nbsp;Start&amp;nbsp;Debugging(디버깅&amp;nbsp;시작))과 다르게 index.html 파일(file:///C:/workspaces/webstudys/web1/index.html)이 아닌 URL(http://127.0.0.1:5500/index.html)로 실행됩니다. 즉 웹 서버가 실행된 겁니다.&lt;/p&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 data-ke-size=&quot;size16&quot;&gt;4. index.html 파일을 수정하고 저장하면 바로 실행된 웹 브라우저에 반영이 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1683990504960&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- 변경 전 --&amp;gt;
&amp;lt;h1&amp;gt;Hello World!&amp;lt;/h1&amp;gt;

&amp;lt;!-- 변경 후 --&amp;gt;
&amp;lt;h1&amp;gt;Hello World!!&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rkbtI/btsfclJ1nTw/XGjEKrebaKA09enx2q7XHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rkbtI/btsfclJ1nTw/XGjEKrebaKA09enx2q7XHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rkbtI/btsfclJ1nTw/XGjEKrebaKA09enx2q7XHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrkbtI%2FbtsfclJ1nTw%2FXGjEKrebaKA09enx2q7XHK%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;일반적으로 웹 브라우저에서 새로고침을 해야 변경되지만 Live Server는 파일이 변경되어 저장되면 자동으로 새로고침 됩니다. 이 기능이 Live Server의 장점입니다. (A Quick Development Live Server with live browser reload.)&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;(Start or Stop server by a single click from status bar.)&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;Live Server가 설치되면 Visual Studio Code의 Status Bar(상태&amp;nbsp;표시줄)에 &quot;Go Live&quot;로 표시됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkFhP6/btsfe8iBaoU/HZyGsHBhVY9OF17gBWwmT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkFhP6/btsfe8iBaoU/HZyGsHBhVY9OF17gBWwmT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkFhP6/btsfe8iBaoU/HZyGsHBhVY9OF17gBWwmT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkFhP6%2Fbtsfe8iBaoU%2FHZyGsHBhVY9OF17gBWwmT0%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;600&quot; height=&quot;56&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;82&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;&quot;Go Live&quot;를 클릭하면 현재 편집기의 파일이 Live Server로 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYZEVd/btsfclp0ez0/ShvN8Suqkt9kCsFMfojTQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYZEVd/btsfclp0ez0/ShvN8Suqkt9kCsFMfojTQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYZEVd/btsfclp0ez0/ShvN8Suqkt9kCsFMfojTQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYZEVd%2Fbtsfclp0ez0%2FShvN8Suqkt9kCsFMfojTQK%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;600&quot; height=&quot;100&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sLL8o/btsfg3n1kvp/wtqm0LWQKcePbwjIHMIf30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sLL8o/btsfg3n1kvp/wtqm0LWQKcePbwjIHMIf30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sLL8o/btsfg3n1kvp/wtqm0LWQKcePbwjIHMIf30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsLL8o%2Fbtsfg3n1kvp%2Fwtqm0LWQKcePbwjIHMIf30%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;600&quot; height=&quot;58&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Live Server가 실행되면 Status Bar(상태&amp;nbsp;표시줄)에 설정된 포트번호(&quot;Port : 5500&quot;)로 표시됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mf5Eo/btsfaNNB8Wu/k3uKnY7XeKvFGSfHmjjoXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mf5Eo/btsfaNNB8Wu/k3uKnY7XeKvFGSfHmjjoXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mf5Eo/btsfaNNB8Wu/k3uKnY7XeKvFGSfHmjjoXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmf5Eo%2FbtsfaNNB8Wu%2Fk3uKnY7XeKvFGSfHmjjoXk%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;600&quot; height=&quot;56&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;84&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;Status Bar(상태&amp;nbsp;표시줄)에서 포트번호(&quot;Port : 5500&quot;)를 클릭하면 Live Server가 종료됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jhzzh/btsfcNzJ5xC/YdRHrsptdB0Pib8dkAkRM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jhzzh/btsfcNzJ5xC/YdRHrsptdB0Pib8dkAkRM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jhzzh/btsfcNzJ5xC/YdRHrsptdB0Pib8dkAkRM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJhzzh%2FbtsfcNzJ5xC%2FYdRHrsptdB0Pib8dkAkRM1%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;600&quot; height=&quot;100&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KVqE5/btsfdWQH5Ej/TQOgS5pzpEoLyyWpQfDHuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KVqE5/btsfdWQH5Ej/TQOgS5pzpEoLyyWpQfDHuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KVqE5/btsfdWQH5Ej/TQOgS5pzpEoLyyWpQfDHuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKVqE5%2FbtsfdWQH5Ej%2FTQOgS5pzpEoLyyWpQfDHuK%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;600&quot; height=&quot;53&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Live Server가 종료되면 Status Bar(상태&amp;nbsp;표시줄)에 &quot;Go Live&quot;로 표시됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9H31E/btsfggAUNNI/uK9HByT3ldHWKfvK7jAjKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9H31E/btsfggAUNNI/uK9HByT3ldHWKfvK7jAjKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9H31E/btsfggAUNNI/uK9HByT3ldHWKfvK7jAjKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9H31E%2FbtsfggAUNNI%2FuK9HByT3ldHWKfvK7jAjKK%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;600&quot; height=&quot;57&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;라이브 서버(Live Server) 포트 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 메뉴 File(파일) &amp;gt; Preferences(기본 설정) &amp;gt; Settings(설정)를 클릭하거나 Ctrl + , (콤마) 키를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwWaHS/btsfvnziM98/XeECKSEHi6U5kTdPbTCJGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwWaHS/btsfvnziM98/XeECKSEHi6U5kTdPbTCJGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwWaHS/btsfvnziM98/XeECKSEHi6U5kTdPbTCJGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwWaHS%2FbtsfvnziM98%2FXeECKSEHi6U5kTdPbTCJGK%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;2628&quot; height=&quot;1612&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&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;2. Settings(설정)의 Extensions(학장)에서 Live Server Config를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci3xdx/btsffuzoIDB/NP9hT6pzLSuGj8xnDHajU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci3xdx/btsffuzoIDB/NP9hT6pzLSuGj8xnDHajU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci3xdx/btsffuzoIDB/NP9hT6pzLSuGj8xnDHajU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci3xdx%2FbtsffuzoIDB%2FNP9hT6pzLSuGj8xnDHajU1%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;2628&quot; height=&quot;1612&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&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;Live Server Config에서 Settings: Port로 이동하고 &quot;Edit in settings.json(settings.json에서 편집)&quot;를 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beNnL1/btsfg2JpAPI/kbn4kOaLVGN9ZroZh9QlHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beNnL1/btsfg2JpAPI/kbn4kOaLVGN9ZroZh9QlHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beNnL1/btsfg2JpAPI/kbn4kOaLVGN9ZroZh9QlHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeNnL1%2Fbtsfg2JpAPI%2Fkbn4kOaLVGN9ZroZh9QlHk%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;2628&quot; height=&quot;1612&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&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;3. &quot;liveServer.settings.port&quot;에 변경하고 싶은 포트번호를 입력하고 저장합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;liveServer.settings.port&quot;를 0으로 입력하고 저장하면 Live Server가 실행될 때마다 랜덤으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;포트번호가 변경됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;settings.json 파일은 C:\Users\{사용자계정}\AppData\Roaming\Code\User\settings.json에 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpPSDE/btsfcl4yr88/m19cTr0LDikfS04e06ibS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpPSDE/btsfcl4yr88/m19cTr0LDikfS04e06ibS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpPSDE/btsfcl4yr88/m19cTr0LDikfS04e06ibS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpPSDE%2Fbtsfcl4yr88%2Fm19cTr0LDikfS04e06ibS1%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;2628&quot; height=&quot;1612&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&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;저는 포트번호를 9000으로 입력하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ty31L/btsfcMVaUxu/eRsWulgwGIQZQnrdY60Q3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ty31L/btsfcMVaUxu/eRsWulgwGIQZQnrdY60Q3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ty31L/btsfcMVaUxu/eRsWulgwGIQZQnrdY60Q3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTy31L%2FbtsfcMVaUxu%2FeRsWulgwGIQZQnrdY60Q3k%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;2628&quot; height=&quot;1612&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1612&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;4. 웹 브라우저가 http://127.0.0.1:9000/index.html로 변경되어 실행되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그리고 Visual Studio Code의 Status Bar(상태&amp;nbsp;표시줄)에도 &quot;Port : 9000&quot;으로 변경되어 표시됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW5K87/btsfehNGDqn/fk6AmaoKpVqkDaaml026pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW5K87/btsfehNGDqn/fk6AmaoKpVqkDaaml026pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW5K87/btsfehNGDqn/fk6AmaoKpVqkDaaml026pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW5K87%2FbtsfehNGDqn%2Ffk6AmaoKpVqkDaaml026pk%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;포트번호를 기존 5500으로 사용하고 싶을 경우에는 &quot;liveServer.settings.port&quot;를 삭제하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Extension &lt;/span&gt;개발을 위해&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Visual Studio Code의 Extension 들은 Node.js 기반으로 Yeoman과 VS Code Extension Generator을 사용하여 만들어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 내용은 Visual Studio Code의 &lt;span style=&quot;background-color: #ffffff; color: #242424; text-align: start;&quot;&gt;Extension API &lt;/span&gt;(&lt;a href=&quot;https://code.visualstudio.com/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://code.visualstudio.com/api&lt;/a&gt;)를 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Live Server는 Open Source로 GitHub에 오픈되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/ritwickdey&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/ritwickdey&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Extension를 만들어 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/274</guid>
      <comments>https://carrotweb.tistory.com/274#entry274comment</comments>
      <pubDate>Sun, 14 May 2023 01:34:31 +0900</pubDate>
    </item>
    <item>
      <title>VSCode Web Project - Trust Confirm (Do you trust the authors of the files in this folder?)</title>
      <link>https://carrotweb.tistory.com/273</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code에서 Web Project는 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;프로젝트가 아닌 파일 단위로 &lt;/span&gt;별도의 확장 기능 설치 없이 바로 작업을 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Web Project 생성&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: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;1. Web Project를 위해 작업 &lt;/span&gt;폴더를 생성합니다. 저는 &quot;C:\workspaces\webstudys\web1&quot; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;폴더를 생성하였습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;2. Visual Studio Code의 메뉴 File(파일) &amp;gt; Open Folder...(폴더 열기) 를 클릭하거나 Ctrl 키를 누를 상태에서 K, O를 이어서 누릅니다. (Ctrl + K, Ctrl + O) 그리고 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&quot;C:\workspaces\webstudys\web1&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;폴더로 이동하고 &quot;폴더 선택&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqQU5z/btsfdrPNqxD/JWkb5oQcK3O8ZvCTOeEu01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqQU5z/btsfdrPNqxD/JWkb5oQcK3O8ZvCTOeEu01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqQU5z/btsfdrPNqxD/JWkb5oQcK3O8ZvCTOeEu01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqQU5z%2FbtsfdrPNqxD%2FJWkb5oQcK3O8ZvCTOeEu01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2644&quot; height=&quot;1622&quot; data-origin-width=&quot;2644&quot; data-origin-height=&quot;1622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;또는 Activity Bar(작업 표시줄)에서 Extensions(학장) 버튼을 클릭한 후 &quot;Open Folder&quot; 버튼을 눌러 작업 폴더(&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&quot;C:\workspaces\webstudys\web1&quot;)&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;로 이동하고 &quot;폴더 선택&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FCwOJ/btse960hPHs/kUMdaURrhyAraChl1ZAyF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FCwOJ/btse960hPHs/kUMdaURrhyAraChl1ZAyF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FCwOJ/btse960hPHs/kUMdaURrhyAraChl1ZAyF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFCwOJ%2Fbtse960hPHs%2FkUMdaURrhyAraChl1ZAyF1%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;2640&quot; height=&quot;1622&quot; data-origin-width=&quot;2640&quot; data-origin-height=&quot;1622&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;3. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;EXPLORER(탐색기)에 오픈한 폴더의 이름이 대문자(WEB1)로 적용되어 오픈됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 보안을 위해 Trust(신뢰) 확인 창이 나타납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그 이유는 오픈하려는 폴더에 있는 파일들에 악성 코드가 있을 수 있기 때문입니다. 그래서 파일들의 작성자를 신뢰할 수 있는지 확인이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baW4Dx/btsfcj5IRxx/THf3FIOhKuFGX7Daisw6JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baW4Dx/btsfcj5IRxx/THf3FIOhKuFGX7Daisw6JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baW4Dx/btsfcj5IRxx/THf3FIOhKuFGX7Daisw6JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaW4Dx%2Fbtsfcj5IRxx%2FTHf3FIOhKuFGX7Daisw6JK%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;확인 창의 내용을 번역하면&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Do you trust the authors of the files in this folder?&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;이 폴더에 있는 파일들의 작성자를 신뢰하십니까?&lt;/span&gt;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Code&amp;nbsp;provides&amp;nbsp;features&amp;nbsp;that&amp;nbsp;may&amp;nbsp;automatically&amp;nbsp;execute&amp;nbsp;files&amp;nbsp;in&amp;nbsp;this&amp;nbsp;folder.&lt;br /&gt;코드는&amp;nbsp;이&amp;nbsp;폴더에&amp;nbsp;있는&amp;nbsp;파일들이&amp;nbsp;자동으로&amp;nbsp;실행될&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;기능으로&amp;nbsp;제공됩니다.&lt;br /&gt;&lt;br /&gt;If&amp;nbsp;you&amp;nbsp;dont't&amp;nbsp;trust&amp;nbsp;the&amp;nbsp;authors&amp;nbsp;of&amp;nbsp;these&amp;nbsp;files,&amp;nbsp;we&amp;nbsp;recommend&amp;nbsp;to&amp;nbsp;continue&amp;nbsp;in&amp;nbsp;restricted&amp;nbsp;mode&amp;nbsp;as&amp;nbsp;the&amp;nbsp;files&amp;nbsp;may&amp;nbsp;be&amp;nbsp;malicious.&lt;br /&gt;만약&amp;nbsp;파일들의&amp;nbsp;작성자를&amp;nbsp;신뢰할&amp;nbsp;수&amp;nbsp;없다면&amp;nbsp;파일이&amp;nbsp;악성일&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;우리는&amp;nbsp;제한&amp;nbsp;모드로&amp;nbsp;진행하는&amp;nbsp;것을&amp;nbsp;추천합니다.&lt;br /&gt;&lt;br /&gt;See&amp;nbsp;our&amp;nbsp;docs&amp;nbsp;to&amp;nbsp;learn&amp;nbsp;more.&lt;br /&gt;더&amp;nbsp;알아보기&amp;nbsp;위해서&amp;nbsp;문서를&amp;nbsp;참조하세요.&lt;/span&gt;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;우리는 외부에서 파일을 가져와 오픈하지 않고 직접 코드를 작성할 것이기 때문에 신뢰에 문제가 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그래서 &quot;Yes, I Trust the authors&quot; 버튼을 누릅니다.&lt;/span&gt;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;(만약, 외부 파일을 가져와서 오픈할 경우라면 파일에 문제가 있을 수 있으니 제한 모드인 오픈하기 위해서 &quot;No, I don't trust the authors&quot;버튼을 누르시기 바랍니다.)&lt;/span&gt;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 체크 박스는 체크하지 않는 것을 권장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;그 이유는 향후에 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;외부 파일을 가져와서 작업할 수 있기 때문에 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;상위 폴더를 신뢰하는 것은 문제가 될 수 있기 때문입니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;체크 박스의&lt;/span&gt;&amp;nbsp;&lt;/span&gt;내용을 번역하면&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Trust&amp;nbsp;the&amp;nbsp;authors&amp;nbsp;of&amp;nbsp;all&amp;nbsp;files&amp;nbsp;in&amp;nbsp;the&amp;nbsp;parent&amp;nbsp;folder&amp;nbsp;'webstudys' &lt;br /&gt;상위&amp;nbsp;폴더(webstudys)에&amp;nbsp;있는&amp;nbsp;모든&amp;nbsp;파일의&amp;nbsp;작성자를&amp;nbsp;신뢰합니다.&lt;/span&gt;&lt;/p&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;그리고 Welcome(시작) 창은 닫습니다.&lt;/span&gt;&lt;/p&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;4. HTML 파일을 생성하기 위해서 EXPLORER(탐색기)의 WEB1에서 첫 번째 아이콘(New File...(새 파일))을 클릭하고 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;입력란에 &quot;index.html&quot;를 입력하고 Enter 키를 눌러 파일을 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwiPiy/btsfckcAvoG/60UaOKKT9lfFESNllknkRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwiPiy/btsfckcAvoG/60UaOKKT9lfFESNllknkRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwiPiy/btsfckcAvoG/60UaOKKT9lfFESNllknkRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwiPiy%2FbtsfckcAvoG%2F60UaOKKT9lfFESNllknkRk%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F7Nbk/btse92cHoUS/yBdlbASkk3mpMjJ6T5hj71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F7Nbk/btse92cHoUS/yBdlbASkk3mpMjJ6T5hj71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F7Nbk/btse92cHoUS/yBdlbASkk3mpMjJ6T5hj71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF7Nbk%2Fbtse92cHoUS%2FyBdlbASkk3mpMjJ6T5hj71%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Ctrl + Alt + Windows + N를 누르고 &quot;New File...&quot;의 입력란에 &quot;index.html&quot;를 입력하고 Enter 키를 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;눌러 파일을 생성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7m576/btse99JALge/bc5cYTbxRjIHK9vQ1I1zQk/img.png&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot; data-is-animation=&quot;false&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;5. 간단하게 &quot;Hello World!&quot;로 내용을 만들겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1683893559807&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;Hello World!&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Hello World!&amp;lt;/h1&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nl4Xn/btsfdqjaYTX/Dw7ijXltoF3IRjRI0hqpNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nl4Xn/btsfdqjaYTX/Dw7ijXltoF3IRjRI0hqpNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nl4Xn/btsfdqjaYTX/Dw7ijXltoF3IRjRI0hqpNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNl4Xn%2FbtsfdqjaYTX%2FDw7ijXltoF3IRjRI0hqpNk%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Web Project 실행 - Debugging&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Visual Studio Code의 메뉴 Run(실행) &amp;gt; Start Debugging(디버깅 시작)를 클릭하거나 기능키 F5 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;버튼을 누릅니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXDGM6/btse98400TY/2Hk65dkXDWTiVzmutbK2B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXDGM6/btse98400TY/2Hk65dkXDWTiVzmutbK2B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXDGM6/btse98400TY/2Hk65dkXDWTiVzmutbK2B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXDGM6%2Fbtse98400TY%2F2Hk65dkXDWTiVzmutbK2B0%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;2. 그러면 디버깅을 위해 실행될 웹 브라우저를 선택할 수 있는 창이 나타납니다. 크롬으로 할 경우 &quot;Web App(웹앱) (Chrome)&quot;를 선택하고 Edge로 할 경우 &quot;Web App(웹앱) (Edge)&quot;를 선택하면 됩니다. 저는 &quot;Web App(웹앱) (Chrome)&quot;를 선택하겠습니다. (웹 브라우저는 처음 한 번만 물어봅니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P40Kz/btse97ykadj/n49r08PP8OlSR2i9UUrPH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P40Kz/btse97ykadj/n49r08PP8OlSR2i9UUrPH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P40Kz/btse97ykadj/n49r08PP8OlSR2i9UUrPH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP40Kz%2Fbtse97ykadj%2Fn49r08PP8OlSR2i9UUrPH1%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;Activity Bar(작업 표시줄)에서 &quot;Run and Debug(실행 및 디버그)&quot; 버튼을 클릭&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;하거나 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;Ctrl + Shift + D를&lt;/span&gt;&amp;nbsp;누른&lt;/span&gt;&amp;nbsp;후 &quot;Run and Debug&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;(실행 및 디버그)&lt;/span&gt;&quot; 버튼을 누릅니다. 그러면 디버깅을 위해 실행될 웹 브라우저를 선택할 수 있는 창이 나타납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOBOMn/btse94Pd9XG/aZKR5XOnfJkUAQtbCTpeaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOBOMn/btse94Pd9XG/aZKR5XOnfJkUAQtbCTpeaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOBOMn/btse94Pd9XG/aZKR5XOnfJkUAQtbCTpeaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOBOMn%2Fbtse94Pd9XG%2FaZKR5XOnfJkUAQtbCTpeaK%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&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;3. 그러면 크롬 브라우저로 index.html 파일(file:///C:/workspaces/webstudys/web1/index.html)이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOc3x/btsffuL6Wzj/ZmGg5JWvduTHcK5HAexio0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOc3x/btsffuL6Wzj/ZmGg5JWvduTHcK5HAexio0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOc3x/btsffuL6Wzj/ZmGg5JWvduTHcK5HAexio0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOc3x%2FbtsffuL6Wzj%2FZmGg5JWvduTHcK5HAexio0%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;2628&quot; height=&quot;1608&quot; data-origin-width=&quot;2628&quot; data-origin-height=&quot;1608&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>Visual Studio Code</category>
      <category>web project</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/273</guid>
      <comments>https://carrotweb.tistory.com/273#entry273comment</comments>
      <pubDate>Fri, 12 May 2023 23:17:42 +0900</pubDate>
    </item>
    <item>
      <title>VSCode 색 테마 변경 - Color Theme, Dark / Light Modern</title>
      <link>https://carrotweb.tistory.com/272</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;색 테마(Color Theme) 변경&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 메뉴 File(파일) &amp;gt; Preferences(기본 설정) &amp;gt; Theme(테마) &amp;gt; Color Theme(색 테마)를 클릭하거나 Ctrl 키를 누를 상태에서 K, T를 이어서 누릅니다. (Ctrl + K, Ctrl + T)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgUzCd/btse9JYlJkp/6nNO0Bwo8djx4kxI9xkSik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgUzCd/btse9JYlJkp/6nNO0Bwo8djx4kxI9xkSik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgUzCd/btse9JYlJkp/6nNO0Bwo8djx4kxI9xkSik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgUzCd%2Fbtse9JYlJkp%2F6nNO0Bwo8djx4kxI9xkSik%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;2. 색 테마를 선택할 수 있는 Picker가 나타납니다. (현재 색 테마가 선택되어 있습니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MstYa/btsfe8vcjLk/x6X9lj6xQSPCOnALfjZslK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MstYa/btsfe8vcjLk/x6X9lj6xQSPCOnALfjZslK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MstYa/btsfe8vcjLk/x6X9lj6xQSPCOnALfjZslK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMstYa%2Fbtsfe8vcjLk%2Fx6X9lj6xQSPCOnALfjZslK%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;3. 키보드의 상/하 방향 버튼을 누르면 색 테마가 이동하면서 변경됩니다. 이동한 색 테마에서 Enter 키를 누르면 적용됩니다. 또는 마우스를 색 테마를 선택하면 바로 변경됩니다.&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;라이트 - Light (Visual Studio), Light Modern, Light+, Quiet Light, Solarized Light&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다크 - Dark (Visual Studio), Dark Modern, Dark+, Kimbie Dark, Monokai, Monokai Dimmed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼라 - Abyss, Red, Solarized Dark, Tomorrow Night Blue&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고대비 - Dark&amp;nbsp;High&amp;nbsp;Contrast,&amp;nbsp;Light&amp;nbsp;High&amp;nbsp;Contrast&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;Dark (Visual Studio)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7hUeP/btse99JjhtX/EtKmdBS1o03FnaU8moBDok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7hUeP/btse99JjhtX/EtKmdBS1o03FnaU8moBDok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7hUeP/btse99JjhtX/EtKmdBS1o03FnaU8moBDok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7hUeP%2Fbtse99JjhtX%2FEtKmdBS1o03FnaU8moBDok%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;Abyss&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDfiel/btsfbzOcJCw/PvzaJmt1L09jjKpkvYX4iK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDfiel/btsfbzOcJCw/PvzaJmt1L09jjKpkvYX4iK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDfiel/btsfbzOcJCw/PvzaJmt1L09jjKpkvYX4iK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDfiel%2FbtsfbzOcJCw%2FPvzaJmt1L09jjKpkvYX4iK%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;Light Modern&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bveijG/btse9fDlXdG/PV3iQFRC3Ac7qJxLW90Ge0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bveijG/btse9fDlXdG/PV3iQFRC3Ac7qJxLW90Ge0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bveijG/btse9fDlXdG/PV3iQFRC3Ac7qJxLW90Ge0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbveijG%2Fbtse9fDlXdG%2FPV3iQFRC3Ac7qJxLW90Ge0%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;Light (Visual Studio)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYVYJ5/btsfdcryihn/qUyt6z8uPnxkjMIJWVGCJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYVYJ5/btsfdcryihn/qUyt6z8uPnxkjMIJWVGCJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYVYJ5/btsfdcryihn/qUyt6z8uPnxkjMIJWVGCJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYVYJ5%2Fbtsfdcryihn%2FqUyt6z8uPnxkjMIJWVGCJ0%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;2624&quot; height=&quot;1604&quot; data-origin-width=&quot;2624&quot; data-origin-height=&quot;1604&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;저는 개인적으로 Dark (Visual Studio)가 좋은 것&amp;nbsp;같습니다.&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>color theme</category>
      <category>Dark (Visual Studio)</category>
      <category>Light Modern</category>
      <category>picker</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/272</guid>
      <comments>https://carrotweb.tistory.com/272#entry272comment</comments>
      <pubDate>Fri, 12 May 2023 19:18:51 +0900</pubDate>
    </item>
    <item>
      <title>VSCode 한국어 설정 - 표시 언어 구성(Configure Display Language)</title>
      <link>https://carrotweb.tistory.com/271</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;한국어 언어 팩(Korean Language Pack) 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 왼쪽에 있는 Activity Bar(작업 표시줄)에서 Extensions(학장) 버튼을 클릭하거나 Ctrl + Shift + X를 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkg2jl/btsfbj4WqlF/vo8t7xLJwYvAo7Q696ZGe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkg2jl/btsfbj4WqlF/vo8t7xLJwYvAo7Q696ZGe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkg2jl/btsfbj4WqlF/vo8t7xLJwYvAo7Q696ZGe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkg2jl%2Fbtsfbj4WqlF%2Fvo8t7xLJwYvAo7Q696ZGe0%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;2050&quot; height=&quot;1250&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&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;2. 한국어 언어 팩을 설치하기 위해 입력란에 &quot;Korean Language&quot;를 입력하여 검색합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vibu1/btse9A0MCha/7ikZC0Zoe0aHKJc5kVcZJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vibu1/btse9A0MCha/7ikZC0Zoe0aHKJc5kVcZJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vibu1/btse9A0MCha/7ikZC0Zoe0aHKJc5kVcZJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVibu1%2Fbtse9A0MCha%2F7ikZC0Zoe0aHKJc5kVcZJK%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;2050&quot; height=&quot;1250&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&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;3. &quot;Korean Language Pack for Visual Studio Code&quot;를 선택하고 &quot;Install&quot;버튼을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tsM14/btse94AuqPn/ReM9TlI6nkKdNskldsNYOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tsM14/btse94AuqPn/ReM9TlI6nkKdNskldsNYOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tsM14/btse94AuqPn/ReM9TlI6nkKdNskldsNYOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtsM14%2Fbtse94AuqPn%2FReM9TlI6nkKdNskldsNYOk%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;2050&quot; height=&quot;1250&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&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;4. 그러면 한국어 언어 팩이 설치됩니다. 그리고 하단에 언어 변경을 위한 &quot;Change Language and Restart&quot;버튼이 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OoVL4/btse9J4ppSC/80GXwKFe1mDGAq6qsrZnW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OoVL4/btse9J4ppSC/80GXwKFe1mDGAq6qsrZnW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OoVL4/btse9J4ppSC/80GXwKFe1mDGAq6qsrZnW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOoVL4%2Fbtse9J4ppSC%2F80GXwKFe1mDGAq6qsrZnW0%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;2050&quot; height=&quot;1250&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&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;5. &quot;Change Language and Restart&quot; 버튼을 클릭하면 Visual Studio Code가 한국어로 변경되어 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgrOu/btse99u0aU0/bReXXx1h01361dkManLsvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgrOu/btse99u0aU0/bReXXx1h01361dkManLsvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgrOu/btse99u0aU0/bReXXx1h01361dkManLsvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgrOu%2Fbtse99u0aU0%2FbReXXx1h01361dkManLsvk%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;명령 팔레트(Command Palette)로 설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code의 메뉴 View &amp;gt; Command Palette... 를 클릭하거나 Ctrl + Shift + P를 눌러 명령 팔레트(Command Palette)를 실행시킨 후 입력란에서 &quot;language&quot;를 입력합니다. 그리고 검색된 결과에서 Configure Display Language(표시 언어 구성)를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kFadt/btse9IR1hiy/U1CrNNuv2gInK0UUyz4ycK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kFadt/btse9IR1hiy/U1CrNNuv2gInK0UUyz4ycK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kFadt/btse9IR1hiy/U1CrNNuv2gInK0UUyz4ycK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkFadt%2Fbtse9IR1hiy%2FU1CrNNuv2gInK0UUyz4ycK%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&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;2. 언어 목록에서 한국어를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FTy0N/btseVNAlkQe/ecMQ1UrwcqI5Tfm99LEuTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FTy0N/btseVNAlkQe/ecMQ1UrwcqI5Tfm99LEuTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FTy0N/btseVNAlkQe/ecMQ1UrwcqI5Tfm99LEuTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFTy0N%2FbtseVNAlkQe%2FecMQ1UrwcqI5Tfm99LEuTK%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&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;3. 그러면 한국어 언어 팩이 설치되고 언어 변경을 위한 Restart 확인이 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2071&quot; data-origin-height=&quot;1273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ds4pVe/btsfbztdMtz/235zZuOd7qTft2LcLKFGUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ds4pVe/btsfbztdMtz/235zZuOd7qTft2LcLKFGUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ds4pVe/btsfbztdMtz/235zZuOd7qTft2LcLKFGUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fds4pVe%2FbtsfbztdMtz%2F235zZuOd7qTft2LcLKFGUK%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;2071&quot; height=&quot;1273&quot; data-origin-width=&quot;2071&quot; data-origin-height=&quot;1273&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;4. &quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Restart&lt;span&gt;&quot; &lt;/span&gt;&lt;/span&gt;버튼을 클릭하면 Visual Studio Code가 한국어로 변경되어 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4PGg/btsfaKohVAs/M88MaRvUvXqbf9zKGu89S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4PGg/btsfaKohVAs/M88MaRvUvXqbf9zKGu89S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4PGg/btsfaKohVAs/M88MaRvUvXqbf9zKGu89S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4PGg%2FbtsfaKohVAs%2FM88MaRvUvXqbf9zKGu89S0%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;한국어에서 영어로 변경&lt;/b&gt;&lt;/p&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;1. Ctrl + Shift + P를 눌러&lt;span&gt; &lt;/span&gt;명령 팔레트(Command Palette)를 실행시킨 후 입력란에서 &quot;language&quot;를 입력합니다. 그리고 검색된 결과에서&lt;span&gt; 표시 언어 구성(&lt;/span&gt;Configure Display Language)을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFRcRq/btse9JDuxs2/wvNSpxKT2RfkmrbTQoAH90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFRcRq/btse9JDuxs2/wvNSpxKT2RfkmrbTQoAH90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFRcRq/btse9JDuxs2/wvNSpxKT2RfkmrbTQoAH90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFRcRq%2Fbtse9JDuxs2%2FwvNSpxKT2RfkmrbTQoAH90%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&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;2. 언어 목록에서 English를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q9BwA/btse966fOSk/YS57edUpqKbX834QKd00Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q9BwA/btse966fOSk/YS57edUpqKbX834QKd00Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q9BwA/btse966fOSk/YS57edUpqKbX834QKd00Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ9BwA%2Fbtse966fOSk%2FYS57edUpqKbX834QKd00Bk%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 그러면 언어 변경을 위한 Restart 확인이 나타납니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2061&quot; data-origin-height=&quot;1265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2i8N/btsfaHLWAzk/GJzGADzbWStW4NS5bPpqM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2i8N/btsfaHLWAzk/GJzGADzbWStW4NS5bPpqM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2i8N/btsfaHLWAzk/GJzGADzbWStW4NS5bPpqM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2i8N%2FbtsfaHLWAzk%2FGJzGADzbWStW4NS5bPpqM0%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;2061&quot; height=&quot;1265&quot; data-origin-width=&quot;2061&quot; data-origin-height=&quot;1265&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;4. &quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다시 시작(R)&lt;span&gt;&quot;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;버튼을 클릭하면 Visual Studio Code가 영어로 변경되어 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wyiqF/btsfcMMEyze/wJ73YCm7Ga2ge6AnzSLH70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wyiqF/btsfcMMEyze/wJ73YCm7Ga2ge6AnzSLH70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wyiqF/btsfcMMEyze/wJ73YCm7Ga2ge6AnzSLH70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwyiqF%2FbtsfcMMEyze%2FwJ73YCm7Ga2ge6AnzSLH70%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;2050&quot; height=&quot;1253&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1253&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>Command Palette</category>
      <category>Extensions</category>
      <category>Korean Language Pack</category>
      <category>Visual Studio Code</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/271</guid>
      <comments>https://carrotweb.tistory.com/271#entry271comment</comments>
      <pubDate>Fri, 12 May 2023 19:18:13 +0900</pubDate>
    </item>
    <item>
      <title>Visual Studio Code 다운로드 및 설치 - 1.78 Download &amp;amp; Install - April 2023</title>
      <link>https://carrotweb.tistory.com/270</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Visual&amp;nbsp;Studio&amp;nbsp;Code&amp;nbsp;다운로드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code 사이트(&lt;a href=&quot;https://code.visualstudio.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://code.visualstudio.com&lt;/a&gt;)에 접속합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tf6xx/btsfaKIbgcN/pPJn9yeC7aQwC0S6kSdtD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tf6xx/btsfaKIbgcN/pPJn9yeC7aQwC0S6kSdtD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tf6xx/btsfaKIbgcN/pPJn9yeC7aQwC0S6kSdtD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTf6xx%2FbtsfaKIbgcN%2FpPJn9yeC7aQwC0S6kSdtD0%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;1941&quot; height=&quot;1247&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1247&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;현재 최신버전은 1.78입니다.&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. 운영체계가 Windows인 경우 사이트 왼쪽 중간에 있는 &quot;Download for Windows&quot;를 클릭하면 Docs 페이지로 이동하고 설치 파일(VSCodeUserSetup-x64-1.78.2.exe)을 다운로드됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQD23/btsfbz0Fthi/ICW6K4HqpCDRk9eKAoKN91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQD23/btsfbz0Fthi/ICW6K4HqpCDRk9eKAoKN91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQD23/btsfbz0Fthi/ICW6K4HqpCDRk9eKAoKN91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQD23%2Fbtsfbz0Fthi%2FICW6K4HqpCDRk9eKAoKN91%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;1941&quot; height=&quot;1247&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1247&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;또는&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사이트 오른쪽 상단에 있는 &quot;Download&quot;를 클릭하면 운영체제(OS, Operating System)에 맞게 다운로드할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;1596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjHJ6A/btseV8deVNS/ceUbYk3neoAPShTaBOAkrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjHJ6A/btseV8deVNS/ceUbYk3neoAPShTaBOAkrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjHJ6A/btseV8deVNS/ceUbYk3neoAPShTaBOAkrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjHJ6A%2FbtseV8deVNS%2FceUbYk3neoAPShTaBOAkrK%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;2486&quot; height=&quot;1596&quot; data-origin-width=&quot;2486&quot; data-origin-height=&quot;1596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;Visual&amp;nbsp;Studio&amp;nbsp;Code&lt;/b&gt;&amp;nbsp;설치&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 웹 브라우저 하단에 있는 다운로드된 파일을 클릭하거나 다운로드 폴더에서 다운로드 &quot;VSCodeUserSetup-x64-1.78.2.exe&quot;파일을 클릭합니다. 그러면 Installer가 실행되고 사용권계약이 나타납니다. &quot;동의합니다&quot;를 선택하고 &quot;다음(N)&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3d5pQ/btsfaHSiYeW/mMWSZcuykhK7NHNsOEX4U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3d5pQ/btsfaHSiYeW/mMWSZcuykhK7NHNsOEX4U1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3d5pQ/btsfaHSiYeW/mMWSZcuykhK7NHNsOEX4U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3d5pQ%2FbtsfaHSiYeW%2FmMWSZcuykhK7NHNsOEX4U1%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&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;2. VS Code를 설치할 경로를 선택합니다. 기본적으로 &quot;C:\Users\사용자계정\AppData\Local\Programs\Microsoft VS Code&quot;로 되어 있습니다. 설치 경로를 변경하지 않을 경우 &quot;다음(N)&quot; 버튼을 누릅니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbco2j/btseVN7RgRZ/dWQBMjCQjNAAakRXU2TuzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbco2j/btseVN7RgRZ/dWQBMjCQjNAAakRXU2TuzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbco2j/btseVN7RgRZ/dWQBMjCQjNAAakRXU2TuzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbco2j%2FbtseVN7RgRZ%2FdWQBMjCQjNAAakRXU2TuzK%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 &quot;C:\workspaces\VSCode&quot;로 변경하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uDB1F/btse8NzgmBG/wkMgl9kgqjdEk45dhOnUdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDB1F/btse8NzgmBG/wkMgl9kgqjdEk45dhOnUdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDB1F/btse8NzgmBG/wkMgl9kgqjdEk45dhOnUdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDB1F%2Fbtse8NzgmBG%2FwkMgl9kgqjdEk45dhOnUdK%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&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;3. 시작 메뉴 폴더를 생성합니다. &quot;다음(N)&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DlguK/btse96EPt1k/OlqggNoXyLKEi85v3hhRK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DlguK/btse96EPt1k/OlqggNoXyLKEi85v3hhRK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DlguK/btse96EPt1k/OlqggNoXyLKEi85v3hhRK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDlguK%2Fbtse96EPt1k%2FOlqggNoXyLKEi85v3hhRK0%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&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;4. 기본 편집기로 등록합니다. &quot;다음(N)&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXnQYX/btsfaL8gkuv/rWJlVR6rpWqzNYSRRqoezK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXnQYX/btsfaL8gkuv/rWJlVR6rpWqzNYSRRqoezK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXnQYX/btsfaL8gkuv/rWJlVR6rpWqzNYSRRqoezK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXnQYX%2FbtsfaL8gkuv%2FrWJlVR6rpWqzNYSRRqoezK%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&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;5. 설치를 위해 &quot;설치(I)&quot; 버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEUnMk/btse7mB1zSa/HGMAP8thh2fTXRHsyhzrlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEUnMk/btse7mB1zSa/HGMAP8thh2fTXRHsyhzrlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEUnMk/btse7mB1zSa/HGMAP8thh2fTXRHsyhzrlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEUnMk%2Fbtse7mB1zSa%2FHGMAP8thh2fTXRHsyhzrlK%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&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;6. 설치가 진행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVvkS9/btsfaIjrxIc/pnrVLe77ksQlTKIPhF9WKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVvkS9/btsfaIjrxIc/pnrVLe77ksQlTKIPhF9WKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVvkS9/btsfaIjrxIc/pnrVLe77ksQlTKIPhF9WKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVvkS9%2FbtsfaIjrxIc%2FpnrVLe77ksQlTKIPhF9WKK%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&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;7. 설치가 완료되면 &quot;종료(F)&quot;버튼을 누릅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lAfI9/btse8h8mnmP/BnENMIKV2gy5J8TzmFrV3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAfI9/btse8h8mnmP/BnENMIKV2gy5J8TzmFrV3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAfI9/btse8h8mnmP/BnENMIKV2gy5J8TzmFrV3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAfI9%2Fbtse8h8mnmP%2FBnENMIKV2gy5J8TzmFrV3K%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;520&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;Visual Studio Code&lt;/b&gt;&lt;/b&gt;&amp;nbsp;실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 윈도우 &quot;시작&quot; 버튼을 클릭하고 &quot;Visual Studio Code&quot;를 입력하고 앱을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVFeGQ/btse4moDBmv/8fzeukJIca35GDKVkNKbzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVFeGQ/btse4moDBmv/8fzeukJIca35GDKVkNKbzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVFeGQ/btse4moDBmv/8fzeukJIca35GDKVkNKbzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVFeGQ%2Fbtse4moDBmv%2F8fzeukJIca35GDKVkNKbzK%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;656&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &quot;C:\workspaces\VSCode&quot;폴더에서 &quot;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Code.exe&quot;를 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 Visual Studio Code가 Dark Modern으로 실행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRUfvC/btse98bEQpy/hbjkjld8Tphisnd5pg72Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRUfvC/btse98bEQpy/hbjkjld8Tphisnd5pg72Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRUfvC/btse98bEQpy/hbjkjld8Tphisnd5pg72Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRUfvC%2Fbtse98bEQpy%2Fhbjkjld8Tphisnd5pg72Ek%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;1500&quot; height=&quot;1125&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1125&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;Visual Studio Code를 Light Modern으로 변경하셔도 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQPv39/btse96dPs2T/PQmBA5j1kvzpfVwdAZlk70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQPv39/btse96dPs2T/PQmBA5j1kvzpfVwdAZlk70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQPv39/btse96dPs2T/PQmBA5j1kvzpfVwdAZlk70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQPv39%2Fbtse96dPs2T%2FPQmBA5j1kvzpfVwdAZlk70%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;1500&quot; height=&quot;1125&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;b&gt;Menu Bar, Command Center, Layout Controls 숨김 처리&lt;/b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Visual Studio Code 상단에서 마우스 오른쪽 버튼을 클릭하여 Menu Bar(메뉴 모음)나 Command Center(명령 센터), Layout Controls(레이아웃 컨틀ㄹ)를 숨기(Hide) 거나 표시(Show)되게 처리할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg3QMn/btseVMaa2mB/IHvUoDYSaWVYpb8pbcvoB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg3QMn/btseVMaa2mB/IHvUoDYSaWVYpb8pbcvoB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg3QMn/btseVMaa2mB/IHvUoDYSaWVYpb8pbcvoB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg3QMn%2FbtseVMaa2mB%2FIHvUoDYSaWVYpb8pbcvoB0%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;1625&quot; height=&quot;169&quot; data-origin-width=&quot;1625&quot; data-origin-height=&quot;169&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;2. Command Center(명령 센터)에서 &quot;Back(돌아가기)&quot; 버튼이나 &quot;Forward(앞으로 이동)&quot; 버튼, Quick Open를 선택하여 숨기(Hide) 거나 표시(Show)되게 처리할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;522&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ln5Vn/btse93O3gUE/bQsFQpvbYoAeP4pgupVih0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ln5Vn/btse93O3gUE/bQsFQpvbYoAeP4pgupVih0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ln5Vn/btse93O3gUE/bQsFQpvbYoAeP4pgupVih0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fln5Vn%2Fbtse93O3gUE%2FbQsFQpvbYoAeP4pgupVih0%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;2652&quot; height=&quot;522&quot; data-origin-width=&quot;2652&quot; data-origin-height=&quot;522&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;저는 Command Center(명령 센터)를 자주 사용하지 않기 때문에 Command Center(명령 센터)를 숨김처리하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L3lJI/btse9IEjMEG/0ybK6l5Nw1aKeqsOIBKFt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L3lJI/btse9IEjMEG/0ybK6l5Nw1aKeqsOIBKFt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L3lJI/btse9IEjMEG/0ybK6l5Nw1aKeqsOIBKFt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL3lJI%2Fbtse9IEjMEG%2F0ybK6l5Nw1aKeqsOIBKFt0%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;2050&quot; height=&quot;1250&quot; data-origin-width=&quot;2050&quot; data-origin-height=&quot;1250&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Visual Studio Code</category>
      <category>1.78</category>
      <category>download</category>
      <category>install</category>
      <category>Visual Studio Code</category>
      <category>vscode</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/270</guid>
      <comments>https://carrotweb.tistory.com/270#entry270comment</comments>
      <pubDate>Fri, 12 May 2023 19:17:40 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 게시물 업데이트, 삭제 처리 - Update, Delete</title>
      <link>https://carrotweb.tistory.com/269</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에는 CRUD의 U(Update)와 D(Delete)로 게시물을 수정하고 삭제하는 UI와 UPDATE / DELETE Query, DAO, Service, Controller를 추가하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Mapper XML에 Update, Delete Query 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 수정(update) 하기 위해서 &amp;lt;update&amp;gt;으로 쿼리문을 생성하고 데이터(게시물)를 삭제(delete) 하기 위해서 &amp;lt;delete&amp;gt;으로 쿼리문을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;update&amp;gt;와 &amp;lt;delete&amp;gt;의 id 속성은 update와 delete를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다. id 속성은 DAO에서 구문을 찾을 때 사용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;update&amp;gt;와 &amp;lt;delete&amp;gt;안에는 UPDATE와 DELETE구문을 사용하여 데이터베이스에서 &lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;게시물의 시퀀스를 기준으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터를 수정하고 삭제하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;update&amp;gt;와&amp;nbsp;&amp;lt;delete&amp;gt;의&amp;nbsp;parameterType&amp;nbsp;속성은&amp;nbsp;전송된&amp;nbsp;데이터를&amp;nbsp;받을&amp;nbsp;Model(모델)&amp;nbsp;명을&amp;nbsp;입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1682937299561&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--
	게시물을 수정합니다.
--&amp;gt;
&amp;lt;update id=&quot;updateBoardItem&quot; parameterType=&quot;Board&quot;&amp;gt;
	UPDATE INT_BOARD_TB
	   SET BRD_SUBJECT = #{subject},
	       BRD_CONTENT = #{content},
	       MOD_ID = #{modificationId},
	       MOD_DTM = NOW()
	 WHERE BRD_SEQ = #{sequence}
&amp;lt;/update&amp;gt;

&amp;lt;!--
	게시물을 삭제합니다.
--&amp;gt;
&amp;lt;delete id=&quot;deleteBoardItem&quot; parameterType=&quot;Board&quot;&amp;gt;
	DELETE
	  FROM INT_BOARD_TB
	 WHERE BRD_SEQ = #{sequence}
&amp;lt;/delete&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 DAO - Board Interface에 update, delete 메서드 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Java&amp;nbsp;Resource&amp;nbsp;&amp;gt;&amp;nbsp;src/main/java에서&amp;nbsp;com.home.study.test1.board.dao 패키지에&amp;nbsp;있는&amp;nbsp;IBoardDao&amp;nbsp;Interface(인터페이스)를&amp;nbsp;오픈합니다.&amp;nbsp;(IBoardDao.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;수정(update), 삭제(delete)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;하기 위해 updateBoardItem, deleteBoardItem 메서드를 선언합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682937699606&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.dao;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardDao {

	int selectBoardListCount(BoardSearch boardSearch);
	
	List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch);
	
	int insertBoardItem(Board board);
	
	Board selectBoardItem(Board board);
	
	int updateBoardItem(Board board);
	
	int deleteBoardItem(Board board);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;b&gt;Maven Spring Project의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Dao - Board Implement에 update, delete 메서드 구현 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.dao.impl 패키지에 있는 BoardDaoImpl 클래스를 오픈합니다. (BoardDaoImpl.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. BoardDaoImpl 클래스에서 IBoardDao Interface(인터페이스)의&lt;span&gt; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;updateBoardItem,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;deleteBoardItem&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;메서드를 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682937744112&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

@Repository(&quot;BoardDaoImpl&quot;)
public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = &quot;com.home.study.test1.board.mapper.mariadb.BoardMapper.&quot;;

	@Autowired
	@Qualifier(&quot;sqlSessionMariaDB&quot;)
	private SqlSession sqlSession;

	@Override
	public int selectBoardListCount(BoardSearch boardSearch) {
		return ((Integer)sqlSession.selectOne(SQL_FILE_PATH + &quot;selectBoardListCount&quot;, boardSearch)).intValue();
	}

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		return sqlSession.selectList(SQL_FILE_PATH + &quot;selectBoardList&quot;, boardSearch);
	}

	@Override
	public int insertBoardItem(Board board) {
		return sqlSession.insert(SQL_FILE_PATH + &quot;insertBoardItem&quot;, board);
	}

	@Override
	public Board selectBoardItem(Board board) {
		return sqlSession.selectOne(SQL_FILE_PATH + &quot;selectBoardItem&quot;, board);
	}

	@Override
	public int updateBoardItem(Board board) {
		return sqlSession.update(SQL_FILE_PATH + &quot;updateBoardItem&quot;, board);
	}

	@Override
	public int deleteBoardItem(Board board) {
		return sqlSession.delete(SQL_FILE_PATH + &quot;deleteBoardItem&quot;, board);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Interface에 update, delete 메서드 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.service 패키지에 있는 IBoardService Interface(인터페이스)를 오픈합니다. (IBoardService.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. DAO (Board Interface, Implement)을 사용하여 INT_BOARD_TB(게시판) Table에 데이터(게시물)를 수정(update), 삭제(delete) 하기 위해&lt;span&gt; updateBoardItem, deleteBoardItem&amp;nbsp;&lt;/span&gt;메서드를 선언합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682938096867&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardService {

	List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch);
	
	boolean insertBoardItem(Board board);
	
	Board selectBoardItem(Board board);
	
	boolean updateBoardItem(Board board);
	
	boolean deleteBoardItem(Board board);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Implement에 update, delete 메서드 구현 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.service.impl 패키지에 있는 BoardServiceImpl 클래스를 오픈합니다. (BoardServiceImpl.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. BoardServiceImpl 클래스에서 IBoardService Interface(인터페이스)의&lt;span&gt; &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;updateBoardItem, deleteBoardItem&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메서드를 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682938159898&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Service
public class BoardServiceImpl implements IBoardService {

	@Autowired
	IBoardDao boardDao;

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		if (boardSearch.getPagination() == null) {
			boardSearch.setPagination(new Pagination());
		}
		
		int count = boardDao.selectBoardListCount(boardSearch);
		boardSearch.getPagination().setRecordTotalCount(count);
		
		List&amp;lt;Board&amp;gt; boardList = null;
		if (count &amp;gt; 0) {
			boardSearch.getPagination().processZero();
			boardList = boardDao.selectBoardList(boardSearch);
		}
		return boardList;
	}

	@Override
	public boolean insertBoardItem(Board board) {
		return (boardDao.insertBoardItem(board) == 1) ? true : false;
	}

	@Override
	public Board selectBoardItem(Board board) {
		return boardDao.selectBoardItem(board);
	}

	@Override
	public boolean updateBoardItem(Board board) {
		return (boardDao.updateBoardItem(board) == 1) ? true : false;
	}

	@Override
	public boolean deleteBoardItem(Board board) {
		return (boardDao.deleteBoardItem(board) == 1) ? true : false;
	}
}&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;수정 UI은 입력 UI와 동일합니다. 그래서 입력 UI인 boardform.jsp을 그대로 사용할 겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 입력 모드인지 수정 모드인지 구분하기 위해서 Controller에서 모드를 전달할 수 있게 ModelMap에 추가하고 수정 모드일 때 게시물의 시퀀스를 사용하기 위해서 &amp;lt;form:hidden&amp;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;먼저 Controller에 추가한 다음 boardform.jsp 파일을 수정하도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Controller에 editBoardForm, editBoard 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.controller&amp;nbsp;패키지에 있는 BoardController 클래스를 오픈합니다. (BoardController.java)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 수정 요청 URL(&quot;/board/editform.do&quot;)이 왔을 때 실행될 editBoardForm 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 전달받은 게시물의 시퀀스를 이용하여 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게시물을 조회(selete)하고 입력 폼으로 리턴되게 리턴 값으로 &quot;board/boardform&quot;를 입력합니다. 수정 요청이기 때문에 모드(mode)를 수정 모드(editboard)로 model에 추가합니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. 수정 요청 URL이 &quot;/board/editform.do&quot;가 왔을 때 editBoardForm 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682947108334&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(value=&quot;/editform&quot;, method=RequestMethod.POST)
public String editBoardForm(HttpServletRequest request, HttpServletResponse response,
	@ModelAttribute Board board, ModelMap model) {
	
	Board boardItem = boardService.selectBoardItem(board);
	model.addAttribute(&quot;board&quot;, boardItem);
	
	model.addAttribute(&quot;mode&quot;, &quot;editboard&quot;);
	return &quot;board/boardform&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. boardService의 updateBoardItem 메서드를 사용하여 데이터(게시물)를 수정하기 위해 editBoard 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board(유효성&amp;nbsp;검사를&amp;nbsp;하기&amp;nbsp;위해서 Board board 앞에 @Valid를 추가), 유효성 검사 결과를 리턴 받기 위한 BindingResult bindingResult, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6 전달된 데이터의 유효성 검사 결과에 오류가 있으면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;다시 입력 폼(/board/boardform.do)으로 이동시키고 &lt;/span&gt;없으면 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;수정하고 redirect로 index.do로 이동시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. POST 방식으로 요청 URL이 &quot;/board/editboard.do&quot;가 왔을 때 editBoard 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682939966718&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(value=&quot;/editboard&quot;, method=RequestMethod.POST)
public String editBoard(HttpServletRequest request, HttpServletResponse response,
	@Valid @ModelAttribute(&quot;board&quot;) Board board, BindingResult bindingResult,
	ModelMap model) {
	if (bindingResult.hasErrors()) {
		return &quot;board/boardform&quot;;
	}
	
	board.setModificationId(board.getRegistrationId());
	if (!boardService.updateBoardItem(board)) {
		model.addAttribute(&quot;mode&quot;, &quot;editboard&quot;);
		return &quot;board/boardform&quot;;
	}
	
	return &quot;redirect:/index.do&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이어서, addBoardForm, addBoard 메서드에 모드(mode)를 입력 모드(addboard)로 model에 추가하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Controller에&lt;span&gt; addBoardForm, addBoard 수정&lt;/span&gt;하기&lt;/b&gt;&lt;/span&gt;&lt;/p&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;1. addBoardForm 메서드 안에 모드(mode)를 입력 모드(addboard)로 model에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682948263106&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(value=&quot;/addform&quot;, method=RequestMethod.GET)
public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
		@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
	model.addAttribute(&quot;mode&quot;, &quot;addboard&quot;);
	return &quot;board/boardform&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;addBoard&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메서드 안에서 등록되지 않을 경우에 모드(mode)를 입력 모드(addboard)로 model에 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682947816802&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(value=&quot;/addboard&quot;, method=RequestMethod.POST)
public String addBoard(HttpServletRequest request, HttpServletResponse response,
		@Valid @ModelAttribute(&quot;board&quot;) Board board, BindingResult bindingResult, ModelMap model) {
	if (bindingResult.hasErrors()) {
		List&amp;lt;FieldError&amp;gt; fieldsErrors = bindingResult.getFieldErrors();
		for (FieldError fieldError : fieldsErrors) {
			System.out.println(fieldError.getField() + &quot; = &quot; + fieldError.getCode() + &quot; / &quot; + fieldError.getDefaultMessage());
		}
		return &quot;board/boardform&quot;;
	}
	
	if (!boardService.insertBoardItem(board)) {
		model.addAttribute(&quot;mode&quot;, &quot;addboard&quot;);
		return &quot;board/boardform1&quot;;
	}
	
	return &quot;redirect:/index.do&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Controller에 deleteBoard 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&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;span style=&quot;color: #333333;&quot;&gt;1. 삭제 요청 URL(&quot;/board/deleteboard.do&quot;)이 왔을 때 실행될 deleteBoard 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.&lt;/span&gt;&lt;/p&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;span style=&quot;color: #333333;&quot;&gt;2. 전달받은 게시물의 시퀀스를 이용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;게시물을 삭제(delete)하고 삭제가 되지 않으면 &lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;다시 뷰 폼(/board/boardview.do)으로 이동시키고&lt;span&gt; 삭제되면 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;redirect로 index.do로 이동시킵니다.&lt;/p&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;3. 삭제 요청 URL이 &quot;/board/deleteboard.do&quot;가 왔을 때 deleteboard 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682950337060&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@RequestMapping(value=&quot;/deleteboard&quot;, method=RequestMethod.POST)
public String deleteBoard(HttpServletRequest request, HttpServletResponse response,
	@ModelAttribute Board board, ModelMap model) {
	
	if (!boardService.deleteBoardItem(board)) {
		Board boardItem = boardService.selectBoardItem(board);
		model.addAttribute(&quot;board&quot;, boardItem);
		return &quot;board/boardview&quot;;
	}
	
	return &quot;redirect:/index.do&quot;;
}&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project에 Board Form JSP 수정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈합니다.&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. &amp;lt;form:hidden&amp;gt; 태그의 path 속성에 board 객체의 sequence(시퀀스)를 입력하여 &amp;lt;form:form&amp;gt; 태그 안에 추가합니다. 그리고 입력 모드인지 수정 모드인지 구분하기 위해서 타입이 hidden인 &amp;lt;input&amp;gt; 태그로 모드(mode)를 추가합니다. &amp;lt;input&amp;gt; 태그는 전달되는 값이 아니기 때문에 name은 사용하지 않습니다. (만약, Model에 mode를 추가하였다면 name을 사용하시면 됩니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1682949288450&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;form:hidden path=&quot;sequence&quot; /&amp;gt;
&amp;lt;input type=&quot;hidden&quot; id=&quot;mode&quot; value=&quot;${mode}&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 기존의 등록 버튼을 모드(mode)에 따라 등록 또는 수정으로 표시되게 수정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682949387071&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;buttons&quot;&amp;gt;
	&amp;lt;div class=&quot;right&quot;&amp;gt;
		&amp;lt;button id=&quot;saveBtn&quot; class=&quot;button blue&quot;&amp;gt;
			&amp;lt;c:choose&amp;gt;
				&amp;lt;c:when test=&quot;${mode == 'addboard'}&quot;&amp;gt;등록&amp;lt;/c:when&amp;gt;
				&amp;lt;c:when test=&quot;${mode == 'editboard'}&quot;&amp;gt;수정&amp;lt;/c:when&amp;gt;
			&amp;lt;/c:choose&amp;gt;
		&amp;lt;/button&amp;gt;
		&amp;lt;button id=&quot;cancelBtn&quot; class=&quot;button&quot;&amp;gt;취소&amp;lt;/button&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 기존의 등록 버튼 클릭 이벤트에서 모드(mode)에 따라 컴펌 메시지가 등록 또는 수정을 변경되게 하고 모드에 따라 등록 URL 또는 수정 URL로 전달되게 수정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682949521601&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('#saveBtn').click(function() {
	var mode = $('#mode').val();
	var modeText = &quot;등록&quot;;
	var modeUrl = &quot;/board/addboard.do&quot;;
	if (mode == &quot;editboard&quot;) {
		modeText = &quot;수정&quot;;
		modeUrl = &quot;/board/editboard.do&quot;;
	}
	var result = confirm(modeText + &quot;하시겠습니까?&quot;);
	if (result) {
		var boardForm = $('#board');
		if (!boardForm[0].checkValidity()) {
			boardForm.addClass('was-validated');
		} else {
			boardForm.attr(&quot;action&quot;, modeUrl);
			boardForm.submit();
		}
	}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 게시물 리스트에서 11번인 &quot;테스트 제목 11&quot;을 클릭한 후 수정 버튼을 누릅니다. 그리고 제목을 &quot;테스트 제목 111&quot;ㄹ 내용을 &quot;테스트 내용 111&quot;로 수정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdNGtI/btsdi1MXt1V/pMdQz9KEKf8FFpUjsUPfvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdNGtI/btsdi1MXt1V/pMdQz9KEKf8FFpUjsUPfvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdNGtI/btsdi1MXt1V/pMdQz9KEKf8FFpUjsUPfvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdNGtI%2Fbtsdi1MXt1V%2FpMdQz9KEKf8FFpUjsUPfvK%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&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;3. 수정 버튼을 누르면 게시물이 변경되고 게시물 리스트로 이동하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YZ0yg/btsdxi04kLg/zk2o3QyfXKMw8qSbs89q9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YZ0yg/btsdxi04kLg/zk2o3QyfXKMw8qSbs89q9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YZ0yg/btsdxi04kLg/zk2o3QyfXKMw8qSbs89q9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYZ0yg%2Fbtsdxi04kLg%2Fzk2o3QyfXKMw8qSbs89q9K%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;4. 게시물 리스트에서 11번인 &quot;테스트 제목 111&quot;을 클릭한 후 삭제 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XDh3C/btsdtEXDCcg/PwUGe50zetXxvbSn6Ea83k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XDh3C/btsdtEXDCcg/PwUGe50zetXxvbSn6Ea83k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XDh3C/btsdtEXDCcg/PwUGe50zetXxvbSn6Ea83k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXDh3C%2FbtsdtEXDCcg%2FPwUGe50zetXxvbSn6Ea83k%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;2360&quot; height=&quot;1470&quot; data-origin-width=&quot;2360&quot; data-origin-height=&quot;1470&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;span style=&quot;color: #555555; text-align: start;&quot;&gt;5. 게시물이 삭제되고 게시물 리스트로 이동하는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3zmdl/btsdBNzrDGD/0Ou66A9bWDCOH0b0RzrWMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3zmdl/btsdBNzrDGD/0Ou66A9bWDCOH0b0RzrWMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3zmdl/btsdBNzrDGD/0Ou66A9bWDCOH0b0RzrWMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3zmdl%2FbtsdBNzrDGD%2F0Ou66A9bWDCOH0b0RzrWMK%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>Delete</category>
      <category>form</category>
      <category>Spring</category>
      <category>Update</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/269</guid>
      <comments>https://carrotweb.tistory.com/269#entry269comment</comments>
      <pubDate>Mon, 1 May 2023 23:22:35 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 게시물 뷰 처리 - View</title>
      <link>https://carrotweb.tistory.com/268</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에는 CRUD의 R(Read)로 게시물을 보는 UI를 생성하고 SELECT Query, DAO, Service, Controller를 추가하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 main.jsp에 보기 기능 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 &amp;lt;tr&amp;gt; 태그에 class와 data-sequence를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;data-sequence의 값으로 게시물(boardItem)의 sequence를 설정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1682854975499&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;c:choose&amp;gt;
	&amp;lt;c:when test=&quot;${empty boardList}&quot;&amp;gt;
		&amp;lt;tr&amp;gt;&amp;lt;td colspan=&quot;4&quot;&amp;gt;검색된 게시물이 없습니다.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;
	&amp;lt;/c:when&amp;gt;
	&amp;lt;c:otherwise&amp;gt;
		&amp;lt;c:forEach var=&quot;boardItem&quot; items=&quot;${boardList}&quot; varStatus=&quot;status&quot;&amp;gt;
		&amp;lt;tr class=&quot;board-item&quot; data-sequence=&quot;${boardItem.sequence}&quot;&amp;gt;
			&amp;lt;td&amp;gt;${boardSearch.pagination.recordTotalCount - ((boardSearch.pagination.pageNo - 1) * boardSearch.pagination.recordCountPerPage) - status.count + 1}&amp;lt;/td&amp;gt;
			&amp;lt;td&amp;gt;${boardItem.subject}&amp;lt;/td&amp;gt;
			&amp;lt;td&amp;gt;${boardItem.registrationId}&amp;lt;/td&amp;gt;
			&amp;lt;td&amp;gt;${boardItem.registrationDateTime}&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;/c:forEach&amp;gt;
	&amp;lt;/c:otherwise&amp;gt;
&amp;lt;/c:choose&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. &amp;lt;style&amp;gt; 태그에 &amp;lt;tr&amp;gt; 태그 영역에 마우스가 있으면 배경색이 회색으로 변경되고 마우스 커서가 포인터로 변경되도록 CSS를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682855232996&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.board table tbody tr:hover { background-color: #dddddd; }
.board table tbody tr.board-item { cursor: pointer; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. &amp;lt;script&amp;gt; 태그에 &amp;lt;tr&amp;gt; 태그 영역에 대한 클릭 이벤트를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682855790217&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('.board-item').click(function() {
	$(location).attr(&quot;href&quot;, &quot;/board/view.do?sequence=&quot; + $(this).attr(&quot;data-sequence&quot;));
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;또는 JQuery의 data()를 사용하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1682855936737&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('.board-item').click(function() {
	$(location).attr(&quot;href&quot;, &quot;/board/view.do?sequence=&quot; + $(this).data(&quot;sequence&quot;));
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력합니다. &lt;span style=&quot;text-align: start;&quot;&gt;(페이지 크기를 10에서 5로 변경하였습니다.)&lt;/span&gt; 그리고 게시물 리스트에 마우스를 이동시키면 마우스가 있는 해당 &amp;lt;tr&amp;gt; 태그 영역의 배경색이 회색으로 변경되고 마우스 커서가 포인터로 변경되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2420&quot; data-origin-height=&quot;1482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpvJwk/btsddZBTVQ6/TknKgkQddoaEUmkaxuTnxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpvJwk/btsddZBTVQ6/TknKgkQddoaEUmkaxuTnxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpvJwk/btsddZBTVQ6/TknKgkQddoaEUmkaxuTnxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpvJwk%2FbtsddZBTVQ6%2FTknKgkQddoaEUmkaxuTnxK%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;2420&quot; height=&quot;1482&quot; data-origin-width=&quot;2420&quot; data-origin-height=&quot;1482&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;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Mapper XML에 Select Query 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 조회(select) 하기 위해서 &amp;lt;select&amp;gt;으로 쿼리문을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;select&amp;gt;의 id 속성은 select를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다. id 속성은 DAO에서 구문을 찾을 때 사용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;select&amp;gt;안에는 SELECT구문을 사용하여 데이터베이스에서 데이터를 조회하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;select&amp;gt;의 parameterType 속성은 전송된 데이터를 받을 Model(모델) 명을 입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;lt;select&amp;gt;의&amp;nbsp;resultMap 속성은 &amp;lt;resultMap&amp;gt;의 id를 입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1682858846509&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--
	게시물을 가져옵니다.
--&amp;gt;
&amp;lt;select id=&quot;selectBoardItem&quot; parameterType=&quot;Board&quot; resultMap=&quot;BoardMap&quot;&amp;gt;
	SELECT BRD.BRD_SEQ,
	       BRD.BRD_SUBJECT,
	       BRD.BRD_CONTENT,
	       DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s') AS REG_DTM,
	       BRD.REG_ID,
	       COALESCE(DATE_FORMAT(BRD.MOD_DTM, '%Y-%m-%d %H:%i:%s'), DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s')) AS MOD_DTM,
	       COALESCE(BRD.MOD_ID, BRD.REG_ID) AS MOD_ID
	  FROM INT_BOARD_TB BRD
	 WHERE BRD.BRD_SEQ = #{sequence}
&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 DAO - Board Interface에 select 메서드 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Java&amp;nbsp;Resource&amp;nbsp;&amp;gt;&amp;nbsp;src/main/java에서&amp;nbsp;com.home.study.test1.board.dao 패키지에&amp;nbsp;있는&amp;nbsp;IBoardDao&amp;nbsp;Interface(인터페이스)를&amp;nbsp;오픈합니다.&amp;nbsp;(IBoardDao.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 조회(selet) 하기 위해 selectBoardItem 메서드를 선언합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682859699404&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.dao;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardDao {

	int selectBoardListCount(BoardSearch boardSearch);
	
	List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch);
	
	int insertBoardItem(Board board);
	
	Board selectBoardItem(Board board);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;b&gt;Maven Spring Project의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Dao - Board Implement에 select 메서드 구현 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.dao.impl 패키지에 있는 BoardDaoImpl 클래스를 오픈합니다. (BoardDaoImpl.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. BoardDaoImpl 클래스에서 IBoardDao Interface(인터페이스)의 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;selectBoardItem &lt;/span&gt;메서드를 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682859848356&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

@Repository(&quot;BoardDaoImpl&quot;)
public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = &quot;com.home.study.test1.board.mapper.mariadb.BoardMapper.&quot;;

	@Autowired
	@Qualifier(&quot;sqlSessionMariaDB&quot;)
	private SqlSession sqlSession;

	@Override
	public int selectBoardListCount(BoardSearch boardSearch) {
		return ((Integer)sqlSession.selectOne(SQL_FILE_PATH + &quot;selectBoardListCount&quot;, boardSearch)).intValue();
	}

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		return sqlSession.selectList(SQL_FILE_PATH + &quot;selectBoardList&quot;, boardSearch);
	}

	@Override
	public int insertBoardItem(Board board) {
		return sqlSession.insert(SQL_FILE_PATH + &quot;insertBoardItem&quot;, board);
	}

	@Override
	public Board selectBoardItem(Board board) {
		return sqlSession.selectOne(SQL_FILE_PATH + &quot;selectBoardItem&quot;, board);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Interface에 select 메서드 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.service 패키지에 있는 IBoardService Interface(인터페이스)를 오픈합니다. (IBoardService.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. DAO (Board Interface, Implement)을 사용하여 INT_BOARD_TB(게시판) Table에 데이터(게시물)를 조회(select) 하기 위해 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;selectBoardItem &lt;/span&gt;메서드를 선언합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682859949532&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardService {

	List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch);
	
	boolean insertBoardItem(Board board);
	
	Board selectBoardItem(Board board);
}&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: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Implement에 select 메서드 구현 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.service.impl 패키지에 있는 BoardServiceImpl 클래스를 오픈합니다. (BoardServiceImpl.java)&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. BoardServiceImpl 클래스에서 IBoardService Interface(인터페이스)의 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;selectBoardItem&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메서드를 구현합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682860020151&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Service
public class BoardServiceImpl implements IBoardService {

	@Autowired
	IBoardDao boardDao;

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		if (boardSearch.getPagination() == null) {
			boardSearch.setPagination(new Pagination());
		}
		
		int count = boardDao.selectBoardListCount(boardSearch);
		boardSearch.getPagination().setRecordTotalCount(count);
		
		List&amp;lt;Board&amp;gt; boardList = null;
		if (count &amp;gt; 0) {
			boardSearch.getPagination().processZero();
			boardList = boardDao.selectBoardList(boardSearch);
		}
		return boardList;
	}

	@Override
	public boolean insertBoardItem(Board board) {
		return (boardDao.insertBoardItem(board) == 1) ? true : false;
	}

	@Override
	public Board selectBoardItem(Board board) {
		return boardDao.selectBoardItem(board);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Controller에 boardView 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.controller&amp;nbsp;패키지에 있는 BoardController 클래스를 오픈합니다. (BoardController.java)&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. boardService의 &lt;span style=&quot;color: #555555; text-align: start;&quot;&gt;selectBoardItem&lt;/span&gt; 메서드를 사용하여 데이터(게시물)를 조회하기 위해 boardView 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다. &lt;span style=&quot;color: #555555; text-align: left;&quot;&gt;리턴 값으로 JSP 파일 경로인 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;board/boardview를 입력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. GET 방식으로 요청 URL이 &quot;/board/view.do&quot;가 왔을 때 boardView 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1682860193248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.service.IBoardService;


@Controller
@RequestMapping(&quot;/board&quot;)
public class BoardController {

	@Autowired
	IBoardService boardService;

	@RequestMapping(value=&quot;/addform&quot;, method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		return &quot;board/boardform1&quot;;
	}

	@RequestMapping(value=&quot;/addboard&quot;, method=RequestMethod.POST)
	public String addBoard(HttpServletRequest request, HttpServletResponse response,
			@Valid @ModelAttribute(&quot;board&quot;) Board board, BindingResult bindingResult, ModelMap model) {
		if (bindingResult.hasErrors()) {
			List&amp;lt;FieldError&amp;gt; fieldsErrors = bindingResult.getFieldErrors();
			for (FieldError fieldError : fieldsErrors) {
				System.out.println(fieldError.getField() + &quot; = &quot; + fieldError.getCode() + &quot; / &quot; + fieldError.getDefaultMessage());
			}
			return &quot;board/boardform1&quot;;
		}
		
		if (!boardService.insertBoardItem(board)) {
			return &quot;board/boardform1&quot;;
		}
		
		return &quot;redirect:/index.do&quot;;
	}
	
	@RequestMapping(value=&quot;/view&quot;, method=RequestMethod.GET)
	public String boardView(HttpServletRequest request, HttpServletResponse response,
		@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		
		Board boardItem = boardService.selectBoardItem(board);
		model.addAttribute(&quot;boardItem&quot;, boardItem);
		
		return &quot;board/boardview&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Board View Form JSP 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. /src/main/webapp/WEB-INF/views/board 폴더에 boardview.jsp 파일을 생성합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;boardItem Model로 전달받은 게시판 제목(subject), 게시판 내용(content), 등록자 아이디(registrationId), 등록 일자(registrationDateTime)로 페이지를 구성합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;게시물에 대한 수정과 삭제를 처리하기 위해서 &amp;lt;form&amp;gt; 태그 안에 sequence를 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span style=&quot;color: #000000; text-align: left;&quot;&gt;게시물 수정과 삭제, 이전 게시물 리스트로 이동시키기 위해 하단에 버튼을 추가하고 &amp;lt;script&amp;gt; 태그에 버튼 클릭 이벤트를 추가합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1682861234523&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;게시판&amp;lt;/title&amp;gt;
		&amp;lt;style type=&quot;text/css&quot;&amp;gt;
			.boardview { width:800px; margin: 20px auto; }
			.boardview table { width:100%; border-top:2px solid #1d4281; border-spacing:0; }
			.boardview table th { padding:8px 10px 10px 10px; vertical-align:middle; color:#1d4281; font-size:14px; border-bottom:1px solid #ccc; background:#f8f8f8; }
			.boardview table td { padding:7px 20px 9px 20px; text-align:left; vertical-align:middle; border-bottom:1px solid #ccc; font-size:14px; line-heighT:150%; }
			.boardview table td.title { font-weight: bold; }
			.buttons { position:relative; height:32px; margin-top:20px; }
			.buttons &amp;gt; div.left { position:absolute; height:32px; left:0; }
			.buttons &amp;gt; div.right { position:absolute; height:32px; right:0; }
			.buttons &amp;gt; div &amp;gt; button { overflow:visible; cursor:pointer; min-width:125px; height:32px; margin:0 2px; padding:0 15px; line-height:32px; font-size:14px; border:1px solid #dfdfdf; background:#fff; border-radius:10px; }
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div class=&quot;boardview&quot;&amp;gt;
			&amp;lt;form id=&quot;boardview&quot; method=&quot;post&quot;&amp;gt;
				&amp;lt;input type=&quot;hidden&quot; name=&quot;sequence&quot; value=&quot;${boardItem.sequence}&quot; /&amp;gt;
			&amp;lt;/form&amp;gt;
			&amp;lt;table&amp;gt;
				&amp;lt;colgroup&amp;gt;
					&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
					&amp;lt;col style=&quot;width:&quot;&amp;gt;
				&amp;lt;/colgroup&amp;gt;
				&amp;lt;tbody&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
						&amp;lt;td class=&quot;title&quot;&amp;gt;${boardItem.subject}&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;${boardItem.content}&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;${boardItem.registrationId}&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;작성일자&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;${boardItem.registrationDateTime}&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
				&amp;lt;/tbody&amp;gt;
			&amp;lt;/table&amp;gt;
			&amp;lt;div class=&quot;buttons&quot;&amp;gt;
				&amp;lt;div class=&quot;left&quot;&amp;gt;
					&amp;lt;button id=&quot;editBtn&quot; class=&quot;button&quot;&amp;gt;수정&amp;lt;/button&amp;gt;
					&amp;lt;button id=&quot;deleteBtn&quot; class=&quot;button&quot;&amp;gt;삭제&amp;lt;/button&amp;gt;
				&amp;lt;/div&amp;gt;
				&amp;lt;div class=&quot;right&quot;&amp;gt;
					&amp;lt;button id=&quot;listBtn&quot; class=&quot;button&quot;&amp;gt;목록&amp;lt;/button&amp;gt;
				&amp;lt;/div&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
			$(function() {
				$('#editBtn').click(function() {
					var result = confirm(&quot;수정하시겠습니까?&quot;);
					if (result) {
						var boardview = $('#boardview');
						boardview.attr(&quot;action&quot;, &quot;/board/editform.do&quot;);
						boardview.submit();
					}
				});
				$('#deleteBtn').click(function() {
					var result = confirm(&quot;삭제하시겠습니까?&quot;);
					if (result) {
						var boardview = $('#boardview');
						boardview.attr(&quot;action&quot;, &quot;/board/deleteboard.do&quot;);
						boardview.submit();
					}
				});
				$('#listBtn').click(function() {
					window.history.go(-1);
				});
			});
		&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S1KI1/btsdc7tIah3/NGJol9k5JM5yNFHjcn6WC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S1KI1/btsdc7tIah3/NGJol9k5JM5yNFHjcn6WC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S1KI1/btsdc7tIah3/NGJol9k5JM5yNFHjcn6WC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS1KI1%2Fbtsdc7tIah3%2FNGJol9k5JM5yNFHjcn6WC1%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;1764&quot; height=&quot;1195&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력합니다. (페이지 크기를 10에서 5로 변경하였습니다.) 그리고 게시물 리스트에서 &quot;테스트 제목 11&quot;을 클릭하여 게시물 뷰 폼(/board/view.do)으로 이동됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iemb7/btsdefxNJll/UWd3IJ32HSIw6HSKrVFD6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iemb7/btsdefxNJll/UWd3IJ32HSIw6HSKrVFD6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iemb7/btsdefxNJll/UWd3IJ32HSIw6HSKrVFD6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIemb7%2FbtsdefxNJll%2FUWd3IJ32HSIw6HSKrVFD6k%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&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;</description>
      <category>Spring/Maven Project</category>
      <category>select</category>
      <category>Spring</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/268</guid>
      <comments>https://carrotweb.tistory.com/268#entry268comment</comments>
      <pubDate>Sun, 30 Apr 2023 22:54:56 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 Hibernate(하이버네이트)의 BindingResult를 spring-form JSP Tag Library인 &amp;lt;form:errors&amp;gt; 또는 &amp;lt;spring:hasBindErrors&amp;gt;로 처리</title>
      <link>https://carrotweb.tistory.com/267</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Hibernate Validator로 유효성 검사한 결과(BindingResult 객체)를 Form Tag Library에 있는 &amp;lt;form:error&amp;gt; 태그를 사용하여 웹 페이지에서 처리하는 방법에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;lt;form:errors&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;form에 대한 유효성 검사 결과 메시지를 &amp;lt;span&amp;gt; 태그로 렌더링 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;path : Model(모델)과 연동하여 유효성 검사 결과를 바인딩할 속성 경로 (path가 *이면 전체 유효성 검사 결과 메시지가 노출됩니다. 메시지들은&amp;nbsp; &amp;lt;br&amp;gt;로 구분됩니다.)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1679825422141&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:errors path=&quot;*&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;렌더링&amp;nbsp;결과&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679825499055&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;span id=&quot;board.errors&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;form의&amp;nbsp;modelAttribute가 board이면 board.errors로 id가 설정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유효성 검사 결과 메시지는 &amp;lt;span&amp;gt; 태그 안에 추가됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;path에 Model(모델)의 속성 경로를 설정하면 Model(모델)의 속성에 대한 유효성 검사 결과 메시지가 노출됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679826237973&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:errors path=&quot;registrationId&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;렌더링&amp;nbsp;결과&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679826250459&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;span id=&quot;registrationId.errors&quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼 &amp;lt;form:error&amp;gt; 태그를 사용하여 유효성 검사 결과 메시지를 노출시켜 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 &amp;lt;form:errors&amp;gt; 태그를 사용하여 전체 유효성 검사 결과 메시지 노출하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하고 &amp;lt;style&amp;gt; 태그에 유효성 검사 결과에 대한 formerror를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679828150052&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.board .formerror { display: block; padding: 10px 10px; margin-bottom: 10px; border: 1px solid #dc3545; font-size: 14px; color: #dc3545; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. &amp;lt;form:form&amp;gt; 태그 안에 &amp;lt;form:errors&amp;gt; 태그를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679825172519&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;form:errors path=&quot;*&quot; cssClass=&quot;formerror&quot; /&amp;gt;
&amp;lt;table&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
		&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; minlength=&quot;2&quot; maxlength=&quot;20&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;아이디는 최소 2자이상 최대 20자 이내로 입력하세요.&amp;lt;/div&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;제목을 입력하세요.&amp;lt;/div&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. &amp;lt;script&amp;gt;에서 기존이 있던 에러 입력 아이디(errorInputId)와 에러 메시지(errorMessage)에 대한 부분을 삭제합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679828696193&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;c:if test=&quot;${not empty errorInputId &amp;amp;&amp;amp; not empty errorMessage}&quot;&amp;gt;
$('#board').addClass('was-validated');
$('#${errorInputId}')[0].setCustomValidity(&quot;${errorMessage}&quot;);
//alert(&quot;${errorMessage}&quot;);
//$(&quot;#${errorInputId}&quot;).focus();
&amp;lt;/c:if&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위의 부분을 삭제하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;삭제된 후 &amp;lt;script&amp;gt; 태그입니다. Server-Side Validation를 테스트하기 위해서 여전히 checkValidity 부분은 주석처리 되어있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679828362834&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		var boardForm = $('#board');
		//if (!boardForm[0].checkValidity()) {
		//	boardForm.addClass('was-validated');
		//} else {
			boardForm.attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
			boardForm.submit();
		//}
	});
	$('#cancelBtn').click(function() {
		window.history.go(-1);
	});
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하여 게시물 입력 폼(/board/addform.do)으로 이동한 후&amp;nbsp;입력 폼에서 작성자, 제목, 내용에 입력하지 않고 등록 버튼을 클릭합니다. 그러면 입력 폼 위에 유효성 검사 결과 메시지 나타납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMLgmP/btr5RTaweJy/NMn4z1Tjjvcz3wskjKKgLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMLgmP/btr5RTaweJy/NMn4z1Tjjvcz3wskjKKgLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMLgmP/btr5RTaweJy/NMn4z1Tjjvcz3wskjKKgLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMLgmP%2Fbtr5RTaweJy%2FNMn4z1Tjjvcz3wskjKKgLk%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;2136&quot; height=&quot;1482&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1482&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;span style=&quot;color: #333333;&quot;&gt;만약 Board Model의 필드에 적용된 Hibernate&amp;nbsp;Annotation에&amp;nbsp;message가 없다면 기본적인 유효성 검사 결과 메시지가 나타나게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biPRHl/btr5RSCGnwR/FmFEMOFF5Sq6dRR0n2smHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biPRHl/btr5RSCGnwR/FmFEMOFF5Sq6dRR0n2smHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biPRHl/btr5RSCGnwR/FmFEMOFF5Sq6dRR0n2smHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiPRHl%2Fbtr5RSCGnwR%2FFmFEMOFF5Sq6dRR0n2smHK%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 &amp;lt;form:erros&amp;gt; 태그&lt;b&gt;를 사용하여 개별 유효성 검사 결과 메시지 노출하기&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하고&amp;nbsp;&amp;lt;style&amp;gt; 태그에 유효성 검사 결과에 대한 error를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679830009728&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.board .error { display: block; padding: 10px 0px; font-size: 14px; color: #dc3545; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. &amp;lt;form:form&amp;gt; 태그 안에 있는 &amp;lt;form:errors&amp;gt; 태그는 삭제하고 작성자(registrationId)와&amp;nbsp;subject(제목)&amp;nbsp;&amp;lt;form:input&amp;gt;&amp;nbsp;태그에 &amp;lt;form:errors&amp;gt; 태그를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679830165376&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;table&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
		&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; minlength=&quot;2&quot; maxlength=&quot;20&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;아이디는 최소 2자이상 최대 20자 이내로 입력하세요.&amp;lt;/div&amp;gt;
				&amp;lt;form:errors path=&quot;registrationId&quot; cssClass=&quot;error&quot; /&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;제목을 입력하세요.&amp;lt;/div&amp;gt;
				&amp;lt;form:errors path=&quot;subject&quot; cssClass=&quot;error&quot; /&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;웹 브라우저를 새로고침 하면 작성자(registrationId)와 subject(제목)의 입력란 아래에 붉은색으로 유효성 검사 결과 메시지가 표시되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bISHAa/btr5RZWdxhO/tPVCPFSbYr5ezWKbOIK5e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bISHAa/btr5RZWdxhO/tPVCPFSbYr5ezWKbOIK5e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bISHAa/btr5RZWdxhO/tPVCPFSbYr5ezWKbOIK5e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbISHAa%2Fbtr5RZWdxhO%2FtPVCPFSbYr5ezWKbOIK5e0%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;2136&quot; height=&quot;1482&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1482&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;span style=&quot;color: #333333;&quot;&gt;만약 Board Model의 필드에 적용된&amp;nbsp;Hibernate&amp;nbsp;Annotation에&amp;nbsp;message가 없다면 기본적인 유효성 검사 결과 메시지가 나타나게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHhAYf/btr5ZlRVdVN/wcwzKs02tyaOckTKebWN21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHhAYf/btr5ZlRVdVN/wcwzKs02tyaOckTKebWN21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHhAYf/btr5ZlRVdVN/wcwzKs02tyaOckTKebWN21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHhAYf%2Fbtr5ZlRVdVN%2FwcwzKs02tyaOckTKebWN21%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이어서 Hibernate Validator로 유효성 검사한 결과(BindingResult 객체)를 Form Tag Library에 있는 &amp;lt;spring:hasBindErrors&amp;gt; 태그를 사용하여 유효성 검사 결과가 있을 때만 웹 페이지에서 처리하는 방법에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JSP에서&amp;nbsp;&amp;lt;spring:hasBindErrors&amp;gt; 태그를 사용하기 위해서는 taglib(태그 라이브러리) 지시문을 추가해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679830975204&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib uri=&quot;http://www.springframework.org/tags&quot; prefix=&quot;spring&quot;%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;lt;spring:hasBindErrors&amp;gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;form에 대한 유효성 검사 결과가 있으면 &amp;lt;spring:hasBindErrors&amp;gt; 태그에 있는 내용들이 처리되게 합니다. 그리고&amp;nbsp;유효성 검사 결과인 BindingResult 객체를 사용할 수 있게 errors.fieldErrors 객체로&amp;nbsp;전달해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;name : Model(모델)과&amp;nbsp;연동할&amp;nbsp;속성&amp;nbsp;명&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1679832058545&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;spring:hasBindErrors name=&quot;board&quot;&amp;gt;
&amp;lt;/spring:hasBindErrors&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 &amp;lt;spring:hasBindErrors&amp;gt; 태그&lt;b&gt;를 사용하여 유효성 검사 결과 처리하기&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하여&amp;nbsp;Form&amp;nbsp;Tag&amp;nbsp;Library를&amp;nbsp;사용하기&amp;nbsp;위해&amp;nbsp;jsp&amp;nbsp;페이지&amp;nbsp;상단에&amp;nbsp;taglib(태그&amp;nbsp;라이브러리)&amp;nbsp;지시문을&amp;nbsp;추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679833684383&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ taglib uri=&quot;http://www.springframework.org/tags&quot; prefix=&quot;spring&quot;%&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. &amp;lt;form:form&amp;gt; 태그 안에 있는 작성자(registrationId)와 subject(제목) &amp;lt;form:input&amp;gt; 태그에서 &amp;lt;form:errors&amp;gt; 태그를 삭제합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679833798880&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;table&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
		&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; minlength=&quot;2&quot; maxlength=&quot;20&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;아이디는 최소 2자이상 최대 20자 이내로 입력하세요.&amp;lt;/div&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;제목을 입력하세요.&amp;lt;/div&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. &amp;lt;/script&amp;gt; 태그 다음에 &amp;lt;spring:hasBindErrors&amp;gt; 태그를 다음과 같이 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679833883226&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;spring:hasBindErrors name=&quot;board&quot;&amp;gt;
	&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
		&amp;lt;c:forEach var=&quot;error&quot; items=&quot;${errors.fieldErrors}&quot;&amp;gt;
			console.log(&quot;${error}&quot;);
		&amp;lt;/c:forEach&amp;gt;
	&amp;lt;/script&amp;gt;
&amp;lt;/spring:hasBindErrors&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;웹 브라우저를 새로고침 하면 웹 브라우저 콘솔로 errors 객체 정보가 표시되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQYZyn/btr6eTfTJ6b/yzopihd3nRwfUDZNK33t01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQYZyn/btr6eTfTJ6b/yzopihd3nRwfUDZNK33t01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQYZyn/btr6eTfTJ6b/yzopihd3nRwfUDZNK33t01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQYZyn%2Fbtr6eTfTJ6b%2Fyzopihd3nRwfUDZNK33t01%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;2136&quot; height=&quot;1480&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1679834172937&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;org.springframework.validation.BeanPropertyBindingResult: 3 errors

Field error in object 'board' on field 'registrationId': rejected value []; codes [Size.board.registrationId,Size.registrationId,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [board.registrationId,registrationId]; arguments []; default message [registrationId],20,2]; default message [작성자 아이디는 최소 2자, 최대 20자 이내로 입력하세요.]

Field error in object 'board' on field 'registrationId': rejected value []; codes [NotEmpty.board.registrationId,NotEmpty.registrationId,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [board.registrationId,registrationId]; arguments []; default message [registrationId]]; default message [작성자 아이디를 입력하세요.]

Field error in object 'board' on field 'subject': rejected value []; codes [NotEmpty.board.subject,NotEmpty.subject,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [board.subject,subject]; arguments []; default message [subject]]; default message [게시판 제목을 입력하세요.]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;errors 객체에서 필드는&amp;nbsp;${error.field}, 에러 코드(유효성 검사 유형)는 ${error.code}, 에러 메시지는&amp;nbsp;${error.defaultMessage}를 사용하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. &amp;lt;spring:hasBindErrors&amp;gt; 태그를 다음과 수정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;유효성 검사 결과 유효하지 않는 필드가 있으면 form(폼)의 CSS에 &quot;was-validated&quot;를 추가하고 에러가 발생한 필드의 CSS에 &quot;is-invalid&quot;를 추가하여 메시지가 노출되게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;에러가 발생한 필드가 변경될 때마다 :valid를 체크하여 필드가 유효한 상태가 되면 &quot;is-invalid&quot;를 삭제하여 메시지가 노출되지 않게 합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1679834747895&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;spring:hasBindErrors name=&quot;board&quot;&amp;gt;
	&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
		$('#board').addClass('was-validated');
		$(function($, window) {
			&amp;lt;c:forEach var=&quot;error&quot; items=&quot;${errors.fieldErrors}&quot;&amp;gt;
				setTimeout(function() {
					$('#${error.field}').addClass(&quot;is-invalid&quot;);
					$('#${error.field}').on(&quot;change&quot;, function(event) {
						if ($(this).hasClass(&quot;is-invalid&quot;) &amp;amp;&amp;amp; $(event.target).is(':valid')) {
							$(this).removeClass(&quot;is-invalid&quot;);
						}
					});
				}, 0);
			&amp;lt;/c:forEach&amp;gt;
		});
	&amp;lt;/script&amp;gt;
&amp;lt;/spring:hasBindErrors&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저를 새로고침 하면 유효하지 않는 입력 필드 아래에 유효성 검사 결과 메시지가 노출되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFGI9j/btr5ZkrX9xD/rbpgJOXkgoaRtSRj8Upbvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFGI9j/btr5ZkrX9xD/rbpgJOXkgoaRtSRj8Upbvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFGI9j/btr5ZkrX9xD/rbpgJOXkgoaRtSRj8Upbvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFGI9j%2Fbtr5ZkrX9xD%2FrbpgJOXkgoaRtSRj8Upbvk%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;2136&quot; height=&quot;1480&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1480&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;그리고 입력 폼에서 작성자에 &quot;te&quot; 입력하면 유효성 검사 결과 메시지가 사라지고 입력란의 색이 녹색으로 변경되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxYdYc/btr53DdHILO/ISXOwN5A4vE0YgCkVoDxn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxYdYc/btr53DdHILO/ISXOwN5A4vE0YgCkVoDxn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxYdYc/btr53DdHILO/ISXOwN5A4vE0YgCkVoDxn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxYdYc%2Fbtr53DdHILO%2FISXOwN5A4vE0YgCkVoDxn1%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;2136&quot; height=&quot;1480&quot; data-origin-width=&quot;2136&quot; data-origin-height=&quot;1480&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;span style=&quot;color: #555555;&quot;&gt;Hibernate Validator와 Form Tag Library에 있는 &amp;lt;spring:hasBindErrors&amp;gt; 태그를 사용하면 Server-Side Validation 처리와 Client-Side에서 유효성 검사 결과 노출 처리를 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;코딩이 조금 복잡해 보일 수 있지만 Client-Side Validation과 &lt;span style=&quot;color: #555555;&quot;&gt;Server-Side Validation를 같이 처리해 주는 것이 좋습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;이어서 게시물 보기, 게시물 수정, 게시물 삭제까지 처리해 보도록 하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>BindingResult</category>
      <category>errors.fieldErrors</category>
      <category>form:errors</category>
      <category>Spring</category>
      <category>spring:hasBindErrors</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/267</guid>
      <comments>https://carrotweb.tistory.com/267#entry267comment</comments>
      <pubDate>Sun, 26 Mar 2023 22:08:58 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 Hibernate(하이버네이트) Validator 적용 - @NotNull, @NotEmpty, @Size, @Valid, BindingResult</title>
      <link>https://carrotweb.tistory.com/266</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;서버에서 유효성 검사를 Controller에서 하지 않고 객체(Bean)에서 유효성 검사를 할 수 있는 빈 유효성 검사(Bean Validation) 구현체에 대해 알아보고 적용하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;빈 유효성 검사(Bean Validation)는 객체(Bean)를 검증하기 위한 메타데이터(metadata) 모델과 API를 정의한 명세서(Specification)로 &lt;span&gt;Annotation(어노테이션)을 사용하여 메타데이터를&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;정의하고 유효성을 검증하는 프로세스에 대해 정의되어 있습니다. 그리고 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;XML Validation Descriptor를 사용하여 메타데이터를 재정의하고 확장할 수 있게 되어 있습니다.&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이 명세서는 2019년 8월 5일에 Jakarta Bean Validation 2.0 (&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;a href=&quot;https://beanvalidation.org/2.0/spec/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://beanvalidation.org/2.0/spec/&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)으로 릴리즈(배포) 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이처럼 Jakarta Bean Validation 2.0 규정에 맞게 동작되도록 구현(implementation)된 것이 Hibernate(하이버네이트) Validator &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;a href=&quot;https://hibernate.org/validator/&quot;&gt;https://hibernate.org/validator/&lt;/a&gt;)입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jakarta Bean Validation 2.0 규정에 맞게 동작되도록 구현된 Hibernate Validator 6.2.x.Final은 Jakarta EE 8(Java EE 8)에서 실행되기 때문에 Java 버전이 8 또는 11, 17 이상 설치되어 있어야 합니다. &lt;span&gt;(2022년 9월 12일 버전은 6.2.5.Final입니다.&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 2020년 7월 4일에 Jakarta Bean Validation 3.0 (&lt;a href=&quot;https://jakarta.ee/specifications/bean-validation/3.0/jakarta-bean-validation-spec-3.0.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jakarta.ee/specifications/bean-validation/3.0/jakarta-bean-validation-spec-3.0.html&lt;/a&gt;)이 릴리즈(배포) 되었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Jakarta Bean Validation 3.0 &lt;span&gt;규정에 맞게 동작되도록 구현된&lt;span&gt; &lt;/span&gt;&lt;/span&gt;Hibernate Validator 7.0.x.Final은 Jakarta EE 9(Java EE 9)에서 실행되기 때문에 Java 버전이 8 또는 11, 17 이상 설치되어 있어야 합니다. (2022년 8월 3일 버전은 7.0.5.Final입니다.)&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;2022년 9월 9일에는 Hibernate Validator 8.0.0.Final이 릴리즈 되었습니다. Hibernate Validator 8.0.0.Final은 Jakarta EE 10(Java EE 10)에서 실행되기 때문에 Java 버전이 11, 17 이상 &lt;span&gt;설치되어 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로젝트가 2022년 7월에 개발자 교육을 위해 만들어졌기 때문에 &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; Hibernate Validator의 버전이 6.2.3.Final입니다. 그래서 최신 버전인 6.2.5.Final이나 7.0.5.Final를 사용하셔도 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project에 Hibernate Validator 적용하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 메이븐 리포지토리(&lt;a href=&quot;https://mvnrepository.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mvnrepository.com&lt;/a&gt;)에서 &quot;hibernate-validator&quot;으로 검색합니다. 검색된 결과 중에 &quot;org.hibernate.validator &amp;gt; hibernate-validator&quot;인 Hibernate&amp;nbsp;Validator&amp;nbsp;Engine를 선택합니다.&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. &quot;Version&quot;중에서 &quot;6.2.3.Final&quot;를 선택합니다. 그리고 [Maven] 탭을 선택하고 복사합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1676158797285&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator --&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.hibernate.validator&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;hibernate-validator&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;6.2.3.Final&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;메이븐&amp;nbsp;프로젝트에서&amp;nbsp;pom.xml&amp;nbsp;파일을&amp;nbsp;오픈하고&amp;nbsp;복사한&amp;nbsp;내용을&amp;nbsp;붙여&amp;nbsp;넣기&amp;nbsp;합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oeGa3/btrYThwcwXL/sFwJwX2juVoKm4sWbz4890/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oeGa3/btrYThwcwXL/sFwJwX2juVoKm4sWbz4890/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oeGa3/btrYThwcwXL/sFwJwX2juVoKm4sWbz4890/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoeGa3%2FbtrYThwcwXL%2FsFwJwX2juVoKm4sWbz4890%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;2258&quot; height=&quot;1532&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러면 자동으로&amp;nbsp; hibernate-validator, jakarta.validation-api, boss-logging, classmate 라이브러리 파일(JAR)들이 다운로드됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676159614220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;hibernate-validator-6.2.3.Final.jar
jakarta.validation-api-2.0.2.jar
boss-logging-3.4.1.Final.jar
classmate-1.5.1.jar&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. WEB-INF/config 폴더에서 dispatcher-servlet.xml 파일을 오픈하여 xmlns:mvc 네임스페이스를 추가하고 &amp;lt;mvc:annotation-driven&amp;gt; 태그를 추가합니다. 만약, 이전에 추가하셨다면 넘어가시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;annotation-driven&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클래스에 있는 Annotation(어노테이션)들이 동작되도록 처리해 줍니다. 이전에 component-scan를 먼저 선언하였기 MVC 컴포넌트들을 Bean으로 생성하고 처리되는 문제가 없습니다. 만약, component-scan를 하지 않았다면 annotation-driven는 반드시 있어야 합니다. (일반적으로 annotation-driven를 사용하고 패키지에 있는 Bean를 사용하기 위해 component-scan를 사용합니다. 그래서 annotation-driven이 먼저 선언되어 있을 겁니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;annotation-driven이 설정되어 있어야 Hibernate Validator에서 유효성 검사에 사용되는 Annotation(어노테이션)들이 처리됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1676161609663&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
		xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
		xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
		xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot;
		xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
			http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd&quot;&amp;gt;

	&amp;lt;mvc:annotation-driven /&amp;gt;
	
	&amp;lt;context:component-scan base-package=&quot;com.home.study&quot;/&amp;gt;
	
	&amp;lt;bean id=&quot;internalResourceViewResolver&quot; class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
		&amp;lt;property name=&quot;viewClass&quot; value=&quot;org.springframework.web.servlet.view.JstlView&quot;/&amp;gt;
		&amp;lt;property name=&quot;prefix&quot; value=&quot;/WEB-INF/views/&quot;/&amp;gt;
		&amp;lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot;/&amp;gt;
	&amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1197&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJrjh/btrYTM3QNau/0tPBWouRl32SSoXCTAAUgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJrjh/btrYTM3QNau/0tPBWouRl32SSoXCTAAUgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJrjh/btrYTM3QNau/0tPBWouRl32SSoXCTAAUgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJrjh%2FbtrYTM3QNau%2F0tPBWouRl32SSoXCTAAUgk%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;1764&quot; height=&quot;1197&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1197&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Hibernate Validator에서 유효성 검사에 사용되는 Annotation(어노테이션)에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;NULL 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@NotNull : 값이 NULL이 아니어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Null : 값이 NULL이어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@NotEmpty : 값이 공백이 아니어야 합니다. (값이 NULL과 &quot;&quot;이 아니어야 합니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@NotBlank : 값이 공백이 아니어야 합니다. (&lt;span&gt;값이 NULL과 &quot;&quot;, &quot; &quot;이 아니어야 합니다.&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자 크기 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Size(min=num, max=num) : 값이 길이가 min보다 크고 max보다 작아야 합니다. (min 이상, max 이하)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;문자 패턴 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Pattern(regexp=string) : 값이 정규식 패턴과 일치해야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Email : 값이 이메일 패턴과 일치해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;참/거짓 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@AssertTrue : 값이 true이어야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@AssertFalse : 값이 false이어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;숫자 검증(최대, 최소)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Min(num) : 값이 최소 num보다 커야 합니다. (num 이상)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Max(num) : 값이 최대 num보다 작아야 합니다. (num 이하)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@DecimalMin(&quot;numstring&quot;) : 값이 최소 num보다 커야 합니다. (num 이상)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@DecimalMax(&quot;numstring&quot;) : 값이 최대 num보다 작아야 합니다. (num 이하)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;숫자 검증(양수, 음수)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Positive : 값이 양수이어야 합니다. (0 초과)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@PositiveOrZero : 값이 0이거나 양수이어야 합니다. (0 이상)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Negative : 값이 음수이어야 합니다. (0 미만)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@NegativeOrZero : 값이 0이거나 음수이어야 합니다. (0 이하)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;숫자 자릿수 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Digits(integer=num, fraction=num) : 최대 정수 자릿수는 integer, 최대 소수 자릿수는 fraction이어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;시간 검증&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Future : 값이 현재 날짜와 시간보다 커야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@FutureOrPresent : 값이 현재이거나 현재 날짜와 시간보다 커야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@Past : 값이 현재 날짜와 시간보다 작아야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;@PastOrPresent : 값이 현재이거나 현재 날짜와 시간보다 작아야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven&amp;nbsp;Spring&amp;nbsp;Project의&amp;nbsp;Model&amp;nbsp;Board에 Hibernate Annotation 추가하기&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: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java &amp;gt; com.home.study.test1.board.model 패키지에 있는 Board.java 파일 오픈하고 필드에 Annotation(어노테이션)을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;등록자 아이디는 Null도 공백도 아니어야 하고 최소 2자 이상 최대 20자 이내이어야 합니다.&lt;/li&gt;
&lt;li&gt;게시판 제목은 Null도 공백도 아니어야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1676164047659&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 게시판 제목
 */
@NotNull
@NotEmpty
private String subject = &quot;&quot;;

/**
 * 등록자 아이디
 */
@NotNull
@NotEmpty
@Size(min = 2, max = 20)
private String registrationId = &quot;&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@NotEmpty가 Null인지도 검사하기 때문에 @NotNull은 없어도 됩니다. 또한 필드의 값이 초기화되어 있어 Null이 올 수 없는 없습니다. 그렇지만 Controller이나 Board 클래스를 사용하는 곳에서 필드의 값에 Null을 적용할 수 있기 때문에 @NotNull도 사용하도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zrAHp/btrY2nIqN50/K0nmrXCIya2emXiE76Flt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zrAHp/btrY2nIqN50/K0nmrXCIya2emXiE76Flt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zrAHp/btrY2nIqN50/K0nmrXCIya2emXiE76Flt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzrAHp%2FbtrY2nIqN50%2FK0nmrXCIya2emXiE76Flt1%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;1764&quot; height=&quot;1196&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1196&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;그럼 Hibernate Validator로 유효성 검사를 하게 하는 방법과 &lt;span&gt;유효성 검사 결과를 리턴 받는 방법&lt;/span&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #555555;&quot;&gt;@Valid Annotation&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Controller에서 &lt;span style=&quot;color: #555555;&quot;&gt;Method(메서드)&lt;/span&gt;&lt;span&gt;의&lt;span&gt; Parameter(&lt;span style=&quot;color: #555555;&quot;&gt;파라미터&lt;/span&gt;)&lt;span style=&quot;color: #555555;&quot;&gt;로 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;전달받은 객체에 @Valid Annotation(어노테이션)를 추가하면 Hibernate Validator로 객체(Bean)를 유효성 검사합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;BindingResult&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;Hibernate Validator로 유효성 검사한 검사 결과를 가지고 있는 객체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;Method(메서드)&lt;/span&gt;&lt;span&gt;의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Parameter(&lt;span style=&quot;color: #555555;&quot;&gt;파라미터&lt;/span&gt;)&lt;span style=&quot;color: #555555;&quot;&gt;로&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;BindingResult를 추가하여 사용하면 됩니다.&lt;/span&gt;&lt;br /&gt;BindingResult의 hasErrors() 메서드를 통해 입력 요소에 에러가 있는지 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project의 &lt;b&gt;Controller &lt;/b&gt;BoardController에 @Valid, BindingResult 추가하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java &amp;gt; com.home.study.test.board.controlle 패키지에 있는 BoardController.java 파일 오픈하고 Board 객체에 @Valid 추가하고 BindingResult를 추가합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유효성 검사를 하기 위해서 @ModelAttribute(&quot;board&quot;) Board board 앞에 @Valid를 추가합니다.&lt;/li&gt;
&lt;li&gt;유효성 검사 결과를 리턴 받기 위해서 &lt;span style=&quot;color: #555555;&quot;&gt;파라미터로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;BindingResult bindingResult를 추가합니다.&lt;/li&gt;
&lt;li&gt;Bean에 유효성 검사한 검사 결과를 확인하기 위해 bindingResult의 hasErrors() 메서드를 호출합니다.&lt;/li&gt;
&lt;li&gt;유효성 검사한 검사 결과를 &lt;span style=&quot;color: #555555;&quot;&gt;Console에 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;출력되게 처리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1676214460088&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.service.IBoardService;


@Controller
@RequestMapping(&quot;/board&quot;)
public class BoardController {

	@Autowired
	IBoardService boardService;

	@RequestMapping(value=&quot;/addform&quot;, method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		return &quot;board/boardform&quot;;
	}

	@RequestMapping(value=&quot;/addboard&quot;, method=RequestMethod.POST)
	public String addBoard(HttpServletRequest request, HttpServletResponse response,
			@Valid @ModelAttribute(&quot;board&quot;) Board board, BindingResult bindingResult, ModelMap model) {
		if (bindingResult.hasErrors()) {
			List&amp;lt;FieldError&amp;gt; fieldsErrors = bindingResult.getFieldErrors();
			for (FieldError fieldError : fieldsErrors) {
				System.out.println(fieldError.getField() + &quot; = &quot; + fieldError.getCode() + &quot; / &quot; + fieldError.getDefaultMessage());
			}
			return &quot;board/boardform&quot;;
		}
		
		if (!boardService.insertBoardItem(board)) {
			return &quot;board/boardform&quot;;
		}
		
		return &quot;redirect:/index.do&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1UZAb/btrY8jeOgT3/JIvWFAH7Xzncq5ndUoOhH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1UZAb/btrY8jeOgT3/JIvWFAH7Xzncq5ndUoOhH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1UZAb/btrY8jeOgT3/JIvWFAH7Xzncq5ndUoOhH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1UZAb%2FbtrY8jeOgT3%2FJIvWFAH7Xzncq5ndUoOhH1%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;2258&quot; height=&quot;1532&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&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. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하여 게시물 입력 폼(/board/addform.do)으로 이동한 후 &lt;span style=&quot;color: #555555;&quot;&gt;입력 폼에서 작성자, 제목, 내용에 입력하지 않고 등록 버튼을 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;3. Eclipse의 Console를 보면 유효성 검사 결과를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676217114472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;registrationId = Size / 크기가 2에서 20 사이여야 합니다
registrationId = NotEmpty / 비어 있을 수 없습니다
subject = NotEmpty / 비어 있을 수 없습니다&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;그렇지만 Hibernate Validator의 유효성 검사 메시지는 &lt;span&gt;자연스럽지&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;않습니다. 그래서 &lt;span style=&quot;color: #555555;&quot;&gt;@Valid Annotation(어노테이션)에 &lt;/span&gt;message를 사용하여 유효성 검사 메시지를 변경하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Java Resource &amp;gt; src/main/java &amp;gt; com.home.study.test1.board.model 패키지에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;있는 Board.java&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 오픈하고 필드의 Annotation(어노테이션)에 message를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676218113948&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/**
 * 게시판 제목
 */
@NotNull(message=&quot;게시판 제목을 입력하세요.&quot;)
@NotEmpty(message=&quot;게시판 제목을 입력하세요.&quot;)
private String subject = &quot;&quot;;

/**
 * 등록자 아이디
 */
@NotNull(message=&quot;작성자 아이디를 입력하세요.&quot;)
@NotEmpty(message=&quot;작성자 아이디를 입력하세요.&quot;)
@Size(min = 2, max = 20, message=&quot;작성자 아이디는 최소 2자, 최대 20자 이내로 입력하세요.&quot;)
private String registrationId = &quot;&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Tomcat&quot;에서 &quot;stop&quot;버튼(stop the server)을 클릭하여 종료하고 다시 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat를 실해시 킵니다. 그리고 웹 브라우저에서 다시 &lt;span style=&quot;color: #555555;&quot;&gt;등록 버튼을 클릭합니다. 그리고 &lt;/span&gt;&lt;span style=&quot;color: #555555; letter-spacing: 0px;&quot;&gt;Eclipse의 Console를 보면 유효성 검사 결과 메시지가 변경된 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676218247465&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;registrationId = Size / 작성자 아이디는 최소 2자, 최대 20자 이내로 입력하세요.
registrationId = NotEmpty / 작성자 아이디를 입력하세요.
subject = NotEmpty / 게시판 제목을 입력하세요.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이처럼 Hibernate Validator를 사용하면&lt;span&gt; &lt;/span&gt;&lt;/span&gt;유효성 검사가 적용된 필드들을 한 번에 검사할 수 있어 좋습니다. 이어서 &lt;span&gt;유효성 검사 결과를 리턴 받은&lt;/span&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;BindingResult&lt;span&gt; 객체를 사용하여 웹 브라우저에 유효성 검사 결과 메시지가 노출되도록 하겠습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>@NotEmpty</category>
      <category>@NotNull</category>
      <category>@Size</category>
      <category>@Valid</category>
      <category>Bean Validation</category>
      <category>BindingResult</category>
      <category>Hibernate Validator</category>
      <category>Spring</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/266</guid>
      <comments>https://carrotweb.tistory.com/266#entry266comment</comments>
      <pubDate>Sun, 5 Mar 2023 17:15:27 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 Server-Side Validation 처리</title>
      <link>https://carrotweb.tistory.com/265</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버에서 전송(Submit)된 게시물 내용(폼(form) 데이터)을 처리하거나 데이터베이스에 등록하기 전에 폼(form) 데이터의 값이 유효한지(데이터 타입이나 길이, 범위, 패턴이 맞는지) 검사하는 것을 Server-Side Validation이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발된 것을 보면 대부분 클라이언트(웹 브러우저)&lt;span&gt;에서만 유효성 검사를 하는 경우가 많습니다. 그 이유는 사용자가 입력한 데이터에 대한 피드백을 바로 전달할 수 있기 때문입니다. 그렇지만 사용자가 클라이언트(웹 브러우저)의 스크립트를 조작하여 유효성 검사를 하지 않고 서버에 전송하게 되면 유효하지 않는 데이터가 데이터베이스에 저장될 수 있습니다. 그렇기 때문에 서버에서 다시 유효성 검사를 하는 것이 좋습니다. (대부분의 사용자는 웹 브라우저의 스크립트를 조작하지 못할 겁니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트(웹 브러우저)에서 유효성 검사하지 않고 서버에서만 &lt;span&gt;유효성 검사해도 됩니다. 그 이유는 전송된 폼(form) 데이터의 값이 유효하지 않으면 클라이언트(웹 브러우저)로 바로 돌려보내면 되기 때문입니다. 그렇지만 데이터의 유효성 검사가 서버에만 있기 때문에 데이터가 유효할 때까지 반복적으로 서버로 전송해야 하는 문제가 있습니다. (실제로 유효성 검사로 반복되는 빈도는 많지 않습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유효성 검사를 서버에서 하게 되면 클라이언트(웹 브러우저)에서 유효성 검사를 하지 않아도 되기 때문에 클라이언트(웹 브러우저)의 스크립트 코딩을 줄 일 수 있습니다. 그렇지만 유효성 검사를 서버와 클라이언트 모두 해주는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그럼 서버에서는 어디에서 유효성 검사를 해야 할까요?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트(웹 브러우저)로 부터 전송된 폼(form) 데이터가 들어오는 &lt;span&gt;Controller&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클래스에서 유효성 검사를 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project에 Server-Side Validation 추가하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&amp;nbsp;Java&amp;nbsp;Resource&amp;nbsp;&amp;gt;&amp;nbsp;src/main/java에서&amp;nbsp;com.home.study.test1.board.controller 패키지에 있는 BoardController 클래스를 오픈합니다. (BoardController.java)&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. &lt;span&gt;addBoard&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메서드에서 @ModelAttribute Annotation(어노테이션)이 적용된 board 객체를 사용하여 유효성 검사를 추가합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;board의 getRegistrationId() 메서드를 사용하여 작성자 아이디를 가져오고 작성자 아이디가 빈 값이거나 길이가 2보다 작거나 20보다 크면 작성자 아이디가 유효하지 않기 때문에 게시물 입력 페이지로 에러 입력 아이디(errorInputId)와 에러 메시지(errorMessage)를 리턴합니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;board의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;getSubject() 메서드를 사용하여 제목을 가져오고 제목이 빈 값이면 제목이 유효하지 않기 때문에 게시물 입력 페이지로 에러 입력 아이디(errorInputId)와 에러 메시지(errorMessage)를 리턴합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1676068647942&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.service.IBoardService;


@Controller
@RequestMapping(&quot;/board&quot;)
public class BoardController {

	@Autowired
	IBoardService boardService;

	@RequestMapping(value=&quot;/addform&quot;, method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		return &quot;board/boardform&quot;;
	}

	@RequestMapping(value=&quot;/addboard&quot;, method=RequestMethod.POST)
	public String addBoard(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		String registrationId = board.getRegistrationId();
		if (registrationId.isEmpty()) {
			model.addAttribute(&quot;errorInputId&quot;,&quot;registrationId&quot;);
			model.addAttribute(&quot;errorMessage&quot;, &quot;작성자 입력란에 아이디가 입력되지 않았습니다.\\n아이디를 입력하세요.&quot;);
			return &quot;board/boardform&quot;;
		} else if (registrationId.length() &amp;lt; 2 || registrationId.length() &amp;gt; 20) {
			model.addAttribute(&quot;errorInputId&quot;,&quot;registrationId&quot;);
			model.addAttribute(&quot;errorMessage&quot;, &quot;작성자 입력란에 아이디는 최소 2자이상 최대 20자 이내로 입력하세요.&quot;);
			return &quot;board/boardform&quot;;
		}
		
		String subject = board.getSubject();
		if (subject.isEmpty()) {
			model.addAttribute(&quot;errorInputId&quot;,&quot;subject&quot;);
			model.addAttribute(&quot;errorMessage&quot;, &quot;제목 입력란에 제목이 입력되지 않았습니다.\\n제목을 입력하세요.&quot;);
			return &quot;board/boardform&quot;;
		}
		
		if (!boardService.insertBoardItem(board)) {
			return &quot;board/boardform&quot;;
		}
		
		return &quot;redirect:/index.do&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하고 &lt;span&gt;서버에서 유효성 검사를 하기 위해서는 &amp;lt;script&amp;gt;를 &lt;/span&gt;수정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트에서 유효성 검사를 하지 않기 위해서 기존 등록 버튼에 있는 checkValidity() 메서드를 주석처리합니다.&lt;/li&gt;
&lt;li&gt;&lt;span&gt;에러 입력 아이디(errorInputId)와 에러 메시지(errorMessage)가 있으면 window.onload에서 alert으로 에러 메시지를 알려주고 에러 입력 아이디로 포커스를 이동시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1676072050979&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		var boardForm = $('#board');
		//if (!boardForm[0].checkValidity()) {
		//	boardForm.addClass('was-validated');
		//} else {
			boardForm.attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
			boardForm.submit();
		//}
	});
	$('#cancelBtn').click(function() {
		window.history.go(-1);
	});
	&amp;lt;c:if test=&quot;${not empty errorInputId &amp;amp;&amp;amp; not empty errorMessage}&quot;&amp;gt;
	setTimeout(function() {
		alert(&quot;${errorMessage}&quot;);
		$(&quot;#${errorInputId}&quot;).focus();
	}, 100);
	&amp;lt;/c:if&amp;gt;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&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. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQtxr/btrYSDFRXTc/Q3B1bDUnF6dW2T2IXjzrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQtxr/btrYSDFRXTc/Q3B1bDUnF6dW2T2IXjzrf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQtxr/btrYSDFRXTc/Q3B1bDUnF6dW2T2IXjzrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQtxr%2FbtrYSDFRXTc%2FQ3B1bDUnF6dW2T2IXjzrf0%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;2130&quot; height=&quot;1346&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&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;3. 입력 폼에서 작성자, 제목, 내용에 입력하지 않고 등록 버튼을 클릭합니다. 그러면 작성자가 빈 값이기 때문에 &lt;span&gt;alert으로 에러 메시지가 노출됩니다. 확인 버튼을 누르면 &lt;span&gt;작성자 입력란으로 포커스가 이동됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvnAIJ/btrYTN82PJS/7MIgE2t7GkChX962G5zi1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvnAIJ/btrYTN82PJS/7MIgE2t7GkChX962G5zi1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvnAIJ/btrYTN82PJS/7MIgE2t7GkChX962G5zi1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvnAIJ%2FbtrYTN82PJS%2F7MIgE2t7GkChX962G5zi1k%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;2130&quot; height=&quot;1346&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&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;4. 입력 폼에서 작성자에 &quot;t&quot; 입력하고 등록 버튼을 클릭합니다. &lt;span&gt;그러면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;작성자의 길이가 유효하지 않아서 &lt;/span&gt;alert으로 에러 메시지가 노출됩니다. &lt;span&gt;확인 버튼을 누르면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;작성자 입력란으로 포커스가 이동됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mxGUk/btrYSDFR3ZO/0UKYazNCKCKkTfJvNprKm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mxGUk/btrYSDFR3ZO/0UKYazNCKCKkTfJvNprKm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mxGUk/btrYSDFR3ZO/0UKYazNCKCKkTfJvNprKm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmxGUk%2FbtrYSDFR3ZO%2F0UKYazNCKCKkTfJvNprKm0%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;2130&quot; height=&quot;1346&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&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;5. 입력 폼에서 작성자에 &quot;testid3&quot; 입력하고 등록 버튼을 클릭합니다. &lt;span&gt;그러면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;제목이 빈 값이기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;alert으로 에러 메시지가 노출됩니다. 확인 버튼을 누르면&lt;span&gt; 제목&amp;nbsp;&lt;/span&gt;&lt;span&gt;입력란으로 포커스가 이동됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI7oLl/btrYRuXeRXK/tu82LzvQK8CO3Ox6cOILQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI7oLl/btrYRuXeRXK/tu82LzvQK8CO3Ox6cOILQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI7oLl/btrYRuXeRXK/tu82LzvQK8CO3Ox6cOILQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI7oLl%2FbtrYRuXeRXK%2Ftu82LzvQK8CO3Ox6cOILQK%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;2130&quot; height=&quot;1346&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&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 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;letter-spacing: 0px;&quot;&gt;setTimeout()를 사용하여 처리한 이유는 웹 브라우저에 페이지가 노출된 후 메시지가 노출될게 하기 위해서입니다. setTimeout()를 사용하지 않고 해 보시면 빈 화면에 alert으로 에러 메시지를 노출되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676074988358&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		var boardForm = $('#board');
		//if (!boardForm[0].checkValidity()) {
		//	boardForm.addClass('was-validated');
		//} else {
			boardForm.attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
			boardForm.submit();
		//}
	});
	$('#cancelBtn').click(function() {
		window.history.go(-1);
	});
	&amp;lt;c:if test=&quot;${not empty errorInputId &amp;amp;&amp;amp; not empty errorMessage}&quot;&amp;gt;
	alert(&quot;${errorMessage}&quot;);
	$(&quot;#${errorInputId}&quot;).focus();
	&amp;lt;/c:if&amp;gt;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qPXxN/btrYSOHjKw8/Zkndk58JKkvrLvbcBdv4XK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qPXxN/btrYSOHjKw8/Zkndk58JKkvrLvbcBdv4XK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qPXxN/btrYSOHjKw8/Zkndk58JKkvrLvbcBdv4XK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqPXxN%2FbtrYSOHjKw8%2FZkndk58JKkvrLvbcBdv4XK%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;2130&quot; height=&quot;1346&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1346&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;span style=&quot;color: #555555;&quot;&gt;CSS로 유효성 검사 결과를 처리할 경우 form(폼)의 CSS에 &quot;was-validated&quot;를 추가하고 에러가 발생한 입력란에 setCustomValidity() 메서드를 사용하여 에러 메시지를 추가하면 됩니다. &lt;span style=&quot;color: #555555;&quot;&gt;setCustomValidity() 메서드를 사용해야 &lt;span style=&quot;color: #555555;&quot;&gt;에러가 발생한 입력란에&lt;/span&gt;&amp;nbsp;:invalid selector가 발생됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1676149618981&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		var boardForm = $('#board');
		//if (!boardForm[0].checkValidity()) {
		//	boardForm.addClass('was-validated');
		//} else {
			boardForm.attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
			boardForm.submit();
		//}
	});
	$('#cancelBtn').click(function() {
		window.history.go(-1);
	});
	&amp;lt;c:if test=&quot;${not empty errorInputId &amp;amp;&amp;amp; not empty errorMessage}&quot;&amp;gt;
	$('#board').addClass('was-validated');
	$('#${errorInputId}')[0].setCustomValidity(&quot;${errorMessage}&quot;);
	//alert(&quot;${errorMessage}&quot;);
	//$(&quot;#${errorInputId}&quot;).focus();
	&amp;lt;/c:if&amp;gt;
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjia7G/btrYXjNgEaG/T9X789qdoH3IQ5VdeKaGAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjia7G/btrYXjNgEaG/T9X789qdoH3IQ5VdeKaGAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjia7G/btrYXjNgEaG/T9X789qdoH3IQ5VdeKaGAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbjia7G%2FbtrYXjNgEaG%2FT9X789qdoH3IQ5VdeKaGAK%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;2130&quot; height=&quot;1480&quot; data-origin-width=&quot;2130&quot; data-origin-height=&quot;1480&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;이렇게 서버에서 유효성 검사를 하기 위해서는 @ModelAttribute Annotation(어노테이션)이 적용된 객체에서 값을 가져와 유효성 검사를 해야 하는 번거로움이 있습니다. 그래서 좀 더 편하게 객체에서 유효성 검사를 할 수 있는 빈 유효성 검사 구현체에 대해 알아보고 적용해 보도록 하겠습니다.&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>Server-Side Validation</category>
      <category>Spring</category>
      <category>validation</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/265</guid>
      <comments>https://carrotweb.tistory.com/265#entry265comment</comments>
      <pubDate>Sun, 12 Feb 2023 06:19:13 +0900</pubDate>
    </item>
    <item>
      <title>javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty</title>
      <link>https://carrotweb.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;OpenJDK 1.8을 사용할 경우 HTTPS(SSL) 접속 시 신뢰할 수 있는 공개키인 Trust Anchors(트러스트 앵커) 매개 변수가 비어 있어서 오류가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1675698471162&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty&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;그 이유 OpenJDK 1.8가 설치된 폴더에서 jre 폴더 &amp;gt; lib 폴더 &amp;gt; security 폴더로 이동해서 cacerts 파일을 확인해보면 파일 크기가 1KB로 &lt;span&gt;Trust Anchors(트러스트 앵커)&lt;/span&gt;에 대한 정보가 없어 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cacerts 파일은 TrustStore로 &lt;span&gt;Trust Anchors(트러스트 앵커)들이 저장되어 있는 파일입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 Eclipse 설치시 자동으로 설치된 Java에서 cacerts 파일을 복사해서 교체해 주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;cacerts 파일 교체하기&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;Eclipse 설치시 자동으로 설치된 Java 폴더의 위치는&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메뉴에서 Windows &amp;gt; Preferences를 클릭합니다.&lt;/li&gt;
&lt;li&gt;Preferences 창에서 Java &amp;gt; Installed JREs를 선택합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pcgnP/btrYf0a7la2/rYFtUHMqUF2ZaEuIFKPXkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pcgnP/btrYf0a7la2/rYFtUHMqUF2ZaEuIFKPXkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pcgnP/btrYf0a7la2/rYFtUHMqUF2ZaEuIFKPXkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpcgnP%2FbtrYf0a7la2%2FrYFtUHMqUF2ZaEuIFKPXkk%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;1728&quot; height=&quot;1244&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1244&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;저는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Eclipse IDE 2022-12로 자동으로 설치된 Java 폴더의 위치는 C:\Users\{사용자계정}\.p2\pool\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.5.v20221102-0933\jre 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 OpenJDK 1.8 폴더의 위치는 C:\workspaces\openjdk\java-se-8u42-ri 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 파일 탐색기로 Java 폴더의 위치(C:\Users\{사용자계정}\.p2\pool\plugins\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_17.0.5.v20221102-0933\jre)로 이동합니다. 그리고 lib 폴더 &amp;gt; security 폴더로 이동하여 cacerts 파일을 복사합니다.&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. 파일 탐색기로 OpenJDK 폴더의 위치(C:\workspaces\openjdk\java-se-8u42-ri)로 이동합니다.&amp;nbsp;그리고 jre &lt;span&gt;폴더 &amp;gt; &lt;/span&gt;lib &lt;span&gt;폴더 &amp;gt; &lt;/span&gt;security &lt;span&gt;폴더를 이동하여 cacerts 파일을 붙여넣기하여 교체하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>이클립스 오류-경고 처리</category>
      <category>Eclipse</category>
      <category>OpenJDK</category>
      <category>SSLException</category>
      <category>trustAnchors</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/264</guid>
      <comments>https://carrotweb.tistory.com/264#entry264comment</comments>
      <pubDate>Tue, 7 Feb 2023 01:31:30 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 JavaScript Validation API 적용 - form checkValidity, CSS :valid vs :invalid</title>
      <link>https://carrotweb.tistory.com/263</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;매번 script에서 form(폼) 안에 있는&amp;nbsp;모든&amp;nbsp;입력 요소(required&amp;nbsp;속성이&amp;nbsp;있는 입력 요소)에 대해 checkValidity() 메서드를 호출하고 validity 유형에 따라 메시지를 작성하여 노출시켜야 하는 번거로움이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 한 번에 호출하고 한 번에 유효성 메시지를 노출시키는 방법에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;checkValidity() 메서드는 입력 요소뿐만 아니라 form(폼)에서도 사용할 수 있습니다. 그래서 form(폼)에서 checkValidity() 메서드를 호출하면 form(폼) 안에 있는 모든 입력 요소(required 속성이 있는 입력 요소)에 대해 유효성 검사를 진행하게 됩니다. required 속성이 있는 입력 요소 전체가 유효하지 않으면 false를 리턴합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 JavaScript Validation API 적용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하고 &amp;lt;script&amp;gt;에서 기존 등록 버튼에 있는 script는 주석처리하고 form(폼)의 checkValidity() 메서드를 호출합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673789943739&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('#saveBtn').click(function() {
	/*
	var registrationId = $('#registrationId')[0];
	if (!registrationId.checkValidity()) {
		if (registrationId.validity.valueMissing) {
			registrationId.setCustomValidity('작성자 입력란에 아이디가 입력되지 않았습니다.\n아이디를 입력하세요.');
		} else if (registrationId.validity.tooShort) {
			registrationId.setCustomValidity('작성자 입력란에 아이디는 최소 2자이상 최대 20자 이내로 입력하세요.');
		}
		alert(registrationId.validationMessage);
		$(&quot;#registrationId&quot;).focus();
		registrationId.setCustomValidity(&quot;&quot;);
		return;
	}
	var subject = $('#subject')[0];
	if (!subject.checkValidity()) {
		if (subject.validity.valueMissing) {
			subject.setCustomValidity('제목 입력란에 제목이 입력되지 않았습니다.\n제목을 입력하세요.');
		}
		alert(subject.validationMessage);
		$(&quot;#subject&quot;).focus();
		subject.setCustomValidity(&quot;&quot;);
		return;
	}
	$('#board').attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
	$('#board').submit();
	*/
	var boardForm = $('#board')[0];
	if (!boardForm.checkValidity()) {
		var registrationId = $('#registrationId')[0];
		console.log(registrationId.validity);
		var subject = $('#subject')[0];
		console.log(subject.validity);
	} else {
		console.log(&quot;에러가 없습니다.&quot;);
	}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;form(폼)의&amp;nbsp;checkValidity() 메서드는&amp;nbsp;form(폼) 안에 있는 모든 입력 요소에 대해 유효성 검사를 진행하기 때문에 form(폼)의 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;validity&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; 속성은 없습니다. 콘솔로 출력해 보면 undefined입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 입력 요소 별로 유효한지 확인하기 위해서는 입력 요소 별로 validity&amp;nbsp;속성으로 확인하면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 등록 버튼을 누르고 콘솔을 확인하면 validity&amp;nbsp;속성 값이 출력됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY7osc/btrXyi2RrS0/mlAE1NCrIu8eVAsgL5ovuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY7osc/btrXyi2RrS0/mlAE1NCrIu8eVAsgL5ovuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY7osc/btrXyi2RrS0/mlAE1NCrIu8eVAsgL5ovuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY7osc%2FbtrXyi2RrS0%2FmlAE1NCrIu8eVAsgL5ovuk%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;CSS&amp;nbsp;:valid&amp;nbsp;vs&amp;nbsp;:invalid&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;입력 요소가 유효하면 입력 요소의 CSS에 :valid selector가 실행되고 유효하지 않으면 :invalid selector가 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CSS의 &amp;nbsp;:valid&amp;nbsp;selector와 :invalid&amp;nbsp;selector는 입력 요소에서&amp;nbsp;checkValidity() 메서드가 실행되지 않아도 입력 요소에 required 속성이 있으면 자동으로 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 CSS :valid와 :invalid 적용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하고 &amp;lt;style&amp;gt; 태그에 입력 요에 대한 :valid selector와 :invalid selector를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;입력 요소가 유효하면 녹색으로 유효하지 않으면 붉은색으로 설정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1674996620598&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.form-input:invalid { border: 1px solid #dc3545; }
.form-input:valid { border: 1px solid #198754; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 필수 입력 요소인 작성자(registrationId)와 subject(제목) &amp;lt;form:input&amp;gt; 태그에 class를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1674997079328&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;table&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
		&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; minlength=&quot;2&quot; maxlength=&quot;20&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;웹 브라우저를 새로고침 하면 작성자(registrationId)와 subject(제목)이 붉은색으로 표시되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0nZES/btrXqsZJ1k0/77vhRxX6j9UZWisrHkfT7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0nZES/btrXqsZJ1k0/77vhRxX6j9UZWisrHkfT7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0nZES/btrXqsZJ1k0/77vhRxX6j9UZWisrHkfT7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0nZES%2FbtrXqsZJ1k0%2F77vhRxX6j9UZWisrHkfT7k%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;작성자(registrationId)에 &quot;testid3&quot;를 입력하고 subject(제목)에 &quot;테스트 제목&quot;을 입력하면 입력 요소가 녹색으로 표시되는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2NIiD/btrXonkkRK5/916W7uEFK3D3hC287bhOvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2NIiD/btrXonkkRK5/916W7uEFK3D3hC287bhOvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2NIiD/btrXonkkRK5/916W7uEFK3D3hC287bhOvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2NIiD%2FbtrXonkkRK5%2F916W7uEFK3D3hC287bhOvK%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지만 등록 버튼을 누르기 전에 form(폼)에 있는 입력 요소들이 붉은색으로 표시되기 때문에 그대로 사용하기에는 적합하지 않습니다.&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;lt;script&amp;gt;에서 등록 버튼이 눌러질 때만 처리되게 변경하면 됩니다. 그리고 입력 요소가 유효하지 않으면 메시지가 노출되게 처리하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project에 CSS 변경 및 &lt;b&gt;메시지 추가&lt;/b&gt;하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &amp;lt;style&amp;gt; 태그에 입력 요에 대한 CSS를 변경합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;:valid selector와 :invalid selector를 Validation(밸리데이션)할 때만 처리되게 &quot;was-validated&quot;를 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;입력 요소가 유효하지 않을 때 입력 요소 아래에 메시지가 붉은색으로 노출되게 &quot;invalid-feedback&quot;를 추가합니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1674998915340&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.was-validated .form-input:invalid { border: 1px solid #dc3545; }
.was-validated .form-input:valid { border: 1px solid #198754; }
.invalid-feedback { display: none; width: 100%; margin-top: 4px; color: #dc3545; }
.was-validated .form-input.is-invalid { border: 1px solid #dc3545; }
.was-validated .form-input.is-invalid~ .invalid-feedback { display: block; }&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;2. 필수 입력 요소인 작성자(registrationId)와 subject(제목) &amp;lt;form:input&amp;gt; 태그 다음에 유효하지 않을 때 노출될 메시지를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675000217038&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;table&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
		&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; minlength=&quot;2&quot; maxlength=&quot;20&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;아이디는 최소 2자이상 최대 20자 이내로 입력하세요.&amp;lt;/div&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; required=&quot;required&quot; class=&quot;form-input&quot; /&amp;gt;
				&amp;lt;div class=&quot;invalid-feedback&quot;&amp;gt;제목을 입력하세요.&amp;lt;/div&amp;gt;
			&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &amp;lt;script&amp;gt;에서 기존 등록 버튼에 있는 script는 삭제하고 form(폼)의 checkValidity() 메서드를 호출한 후 유효하지 않으면 form(폼)의 CSS에 &quot;was-validated&quot;를&amp;nbsp;추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1675000418218&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('#saveBtn').click(function() {
	var boardForm = $('#board');
	if (!boardForm[0].checkValidity()) {
		boardForm.addClass('was-validated');
	} else {
		boardForm.attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
		boardForm.submit();
	}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저를 새로고침합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boF0iR/btrXomTiFNf/qVvJjjHykKxDKnwRfLJms1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boF0iR/btrXomTiFNf/qVvJjjHykKxDKnwRfLJms1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boF0iR/btrXomTiFNf/qVvJjjHykKxDKnwRfLJms1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboF0iR%2FbtrXomTiFNf%2FqVvJjjHykKxDKnwRfLJms1%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록 버튼을 누르면 작성자(registrationId)와 subject(제목)이 붉은색으로 표시되고 메시지가 노출되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IlSfe/btrXpc31HnY/DweBOZuoKlczuKp3K832Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IlSfe/btrXpc31HnY/DweBOZuoKlczuKp3K832Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IlSfe/btrXpc31HnY/DweBOZuoKlczuKp3K832Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIlSfe%2FbtrXpc31HnY%2FDweBOZuoKlczuKp3K832Sk%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성자(registrationId)에 &quot;testid3&quot;를 입력하면 녹색으로 표시되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qhu18/btrXyjt0gPd/Sik9gKgh0E5fofCmqja7Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qhu18/btrXyjt0gPd/Sik9gKgh0E5fofCmqja7Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qhu18/btrXyjt0gPd/Sik9gKgh0E5fofCmqja7Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqhu18%2FbtrXyjt0gPd%2FSik9gKgh0E5fofCmqja7Y0%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 subject(제목)에 &quot;테스트 제목&quot;을 입력하면 녹색으로 표시되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ed5G1s/btrXoowPTn2/KcfoYufkFjveK13Bl23LD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ed5G1s/btrXoowPTn2/KcfoYufkFjveK13Bl23LD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ed5G1s/btrXoowPTn2/KcfoYufkFjveK13Bl23LD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fed5G1s%2FbtrXoowPTn2%2FKcfoYufkFjveK13Bl23LD1%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;2156&quot; height=&quot;1488&quot; data-origin-width=&quot;2156&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내용을 입력하고 등록 버튼을 누르면 정상적으로 등록되는 것을 확인할 수 있습니다.&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;form(폼)의 checkValidity() 메서드와 CSS의 :valid selector와 :invalid selector를 사용하면 유효성 검사 및 메시지 처리를 간단하게 할 수 있습니다.&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;이어서 Server-Side Validation에 대해 알아보고 추가해 보겠습니다.&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>:invalid</category>
      <category>:valid</category>
      <category>Client-Side Validation</category>
      <category>form checkValidity</category>
      <category>Spring</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/263</guid>
      <comments>https://carrotweb.tistory.com/263#entry263comment</comments>
      <pubDate>Sun, 29 Jan 2023 23:18:24 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 JavaScript Validation API 적용 - checkValidity, validity(tooLong, tooShort, rangeUnderflow, rangeOverflow, badInput, stepMismatch, patternMismatch, typeMismatch), validationMessage, setCustomValidity</title>
      <link>https://carrotweb.tistory.com/262</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게시물을 등록하기 전(폼(form)을 전송(Submit) 하기 전)에 입력한 데이터가 정확한지 Validation(밸리데이션)하여 입력값이 정확하지 않으면 사용자에게 알려주어 다시 입력하게 하는 것을 Client-Side Validation이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이전에서 처리한 등록 버튼 script처럼 단순하게 입력란에 입력한 데이터가 있는지만 판단하는 정도라면 JavaScript Validation API를 사용하여 처리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JavaScript Validation API는 입력한 데이터의 유무뿐만 아니라 &amp;nbsp;입력한 데이터의 길이가 긴지 짧은지, 패턴과 일치하는지, 숫자가 아닌 문자가 있는지, 숫자가 큰지 작은지 검사할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JavaScript Validation API는 DOM 지원하는 모든 웹 브라우저에서 지원됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼 JavaScript Validation API를 사용하여 form(폼)에 있는 입력 요소들이 유효한 데이터를 가지고 있는지 검사해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;JavaScript Validation API에서 제공하는 DOM 메서드인 checkValidity() 메서드를 사용하면 검사할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;checkValidity() 메서드는 입력 요소의 속성 정보를 사용하여 입력한 데이터가 있는지, 데이터의 길이가 긴지 짧은지, 패턴과 일치하는지, 숫자가 아닌 문자가 있는지, 숫자가 큰지 작은지 검사하고 Boolean(부울) 값으로 리턴합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;checkValidity() 메서드는 입력 요소에 required 속성이 있어야 검사를 진행하게 되어 있습니다. 즉, 필수 입력 요소들만 검사하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;checkValidity() 메서드가 실행되면 JavaScript Validation API에서 제공하는 DOM 속성인 validity 속성에 유효성별로 검사 결과가 Boolean(부울) 값으로 적용되어 리턴됩니다. 그리고 validity에 있는 유효성 속성 중에 false가 있으면 DOM 속성인&amp;nbsp;validationMessage 속성에 웹 브라우저에서 출력되는 유효성 검사 메시지가 리턴됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼 테스트를 통해 checkValidity() 메서드와 validity 속성, validationMessage&amp;nbsp;속성에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 JavaScript Validation API 적용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하고 게시물 적성 시 필수 입력 요소인 작성자(registrationId)와 subject(제목) &amp;lt;form:input&amp;gt; 태그에 required 속성을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673766856751&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
&amp;lt;table&amp;gt;
	&amp;lt;colgroup&amp;gt;
		&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
		&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
	&amp;lt;/colgroup&amp;gt;
	&amp;lt;tbody&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; required=&quot;required&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; required=&quot;required&quot; /&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
		&amp;lt;tr&amp;gt;
			&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
			&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot;/&amp;gt;&amp;lt;/td&amp;gt;
		&amp;lt;/tr&amp;gt;
	&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. &amp;lt;script&amp;gt;에서 기존 등록 버튼에 있는 script는 주석처리하고 테스트를 위해 작성자(registrationId)에 checkValidity() 메서드를 적용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;required 속성은 필수 입력 요소를 나타내는 것이기 때문에 입력란에 데이터가 입력되지 않으면 checkValidity() 메서드는 false를 리턴하게 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;checkValidity() 메서드의 리턴 값이 false이면 DOM 속성인&amp;nbsp;validationMessage(DOM&amp;nbsp;속성인&amp;nbsp;validity에 있는 유효성 속성 중에 false가 있을 때 웹 브라우저에서 출력되는 유효성 검사 메시지)를 알럿으로 보겠습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1673767580311&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		/*
		var registrationId = $('#registrationId').val();
		if (registrationId == null || registrationId == &quot;&quot;) {
			alert(&quot;아이디를 입력하세요.&quot;);
			$(&quot;#registrationId&quot;).focus();
			return;
		}
		var subject = $('#subject').val();
		if (subject == null || subject == &quot;&quot;) {
			alert(&quot;제목을 입력하세요.&quot;);
			$(&quot;#subject&quot;).focus();
			return;
		}
		$('#board').attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
		$('#board').submit();
		*/
		if (!$('#registrationId')[0].checkValidity()) {
			alert($('#registrationId')[0].validationMessage);
		}
	});
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 등록 버튼을 누르면 checkValidity() 메서드가 실행되면서 메시지가 알럿으로 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZ3Tv2/btrWedXl5l9/7mLBLIFABQypA79O1d8Vmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZ3Tv2/btrWedXl5l9/7mLBLIFABQypA79O1d8Vmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZ3Tv2/btrWedXl5l9/7mLBLIFABQypA79O1d8Vmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZ3Tv2%2FbtrWedXl5l9%2F7mLBLIFABQypA79O1d8Vmk%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;1829&quot; height=&quot;1162&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;1162&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;span style=&quot;color: #333333;&quot;&gt;그럼 기존 등록 버튼에 있는 script에 DOM&amp;nbsp;속성인&amp;nbsp;validity를 콘솔로 출력해서 어떤 유형별로 되어 있는지 확인해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673770802795&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (!$('#registrationId')[0].checkValidity()) {
	alert($('#registrationId')[0].validationMessage);
}
console.log($('#registrationId')[0].validity);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;validity를 콘솔로 출력하면 ValidityState로 나타납니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR7mpM/btrWcb0umRE/Klkm6A215kIVv2EaRasbdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR7mpM/btrWcb0umRE/Klkm6A215kIVv2EaRasbdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR7mpM/btrWcb0umRE/Klkm6A215kIVv2EaRasbdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR7mpM%2FbtrWcb0umRE%2FKlkm6A215kIVv2EaRasbdK%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;1275&quot; height=&quot;326&quot; data-origin-width=&quot;1275&quot; data-origin-height=&quot;326&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;작성자(registrationId)에 입력된 데이터가 없으면 valid가 false가 되고 valueMissing이 true가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;valid : 입력 요소에 값이 유효하면 true, 유효하지 않으면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;valueMissing : 입력 요소 속성에 required가 있는데 입력된 데이터가 없으면 true, 있으면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;작성자(registrationId)에 입력된 데이터가 있으면 valid가 true가 되고 valueMissing이 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQd6s/btrWissAKKA/9qreIPYJTpjmvgkguUWYkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQd6s/btrWissAKKA/9qreIPYJTpjmvgkguUWYkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQd6s/btrWissAKKA/9qreIPYJTpjmvgkguUWYkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQd6s%2FbtrWissAKKA%2F9qreIPYJTpjmvgkguUWYkk%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;1600&quot; height=&quot;418&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;418&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;span style=&quot;color: #333333;&quot;&gt;작성자(registrationId)에 입력되는 데이터가 최소 2자 이상이고 최대 20자 이하로 되게 작성자(registrationId)의 &amp;lt;form:input&amp;gt; 태그에 minlength 속성과 maxlength 속성을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673777156593&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;tr&amp;gt;
	&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
	&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; minlength=&quot;2&quot; maxlength=&quot;20&quot; required=&quot;required&quot; /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;새로고침 후 작성자(registrationId)에 &quot;1&quot;를 입력하고 등록 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n4sxu/btrWkvbwFtI/RKGO2xdrUODeSOgG5pr861/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n4sxu/btrWkvbwFtI/RKGO2xdrUODeSOgG5pr861/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n4sxu/btrWkvbwFtI/RKGO2xdrUODeSOgG5pr861/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn4sxu%2FbtrWkvbwFtI%2FRKGO2xdrUODeSOgG5pr861%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;2256&quot; height=&quot;1418&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&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;span style=&quot;color: #333333;&quot;&gt;콘솔에서 validity를 확인해 보면 작성자(registrationId)에 입력된 데이터가 1글자 이기 때문에 tooShort가 true가 되고 valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;tooLong : 입력 요소(input type='text', textarea) 속성에 maxlength가 있고 입력 값 길이가 maxlength 보다 크면 true를 작거나 같으면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;tooShort : 입력 요소(input type='text', textarea) 속성에 minlength가 있고 입력 값 길이가 minlength 보다 작으면 true를 크거나 같으면 false를&amp;nbsp;리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoi4M/btrWeeaTSW4/AVG3bdzyDkgMx86JvpHwJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoi4M/btrWeeaTSW4/AVG3bdzyDkgMx86JvpHwJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoi4M/btrWeeaTSW4/AVG3bdzyDkgMx86JvpHwJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqoi4M%2FbtrWeeaTSW4%2FAVG3bdzyDkgMx86JvpHwJk%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;1594&quot; height=&quot;414&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;414&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;span style=&quot;color: #333333;&quot;&gt;&amp;lt;input type='text'&amp;gt; 태그나 &amp;lt;textarea&amp;gt; 태그에서 maxlength가 설정되면 웹 브라우저에서 입력되는 데이터가 maxlength보다 크게 입력이 되지 않게 제어되기 때문에 tooLong 속성이 true가 나오지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼 다른 유형들도 테스트를 통해서 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;테스트를 위해 바탕화면에 test.html를 생성하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;숫자만 입력할 수 있는 &amp;lt;input type=&quot;number&quot;&amp;gt; 태그로 최소 1부터 최대 100까지 설정할 수 있게 하고 score 버튼을 눌러 검사하도록 코딩합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673779115423&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input id=&quot;score&quot; type=&quot;number&quot; min=&quot;1&quot; max=&quot;100&quot; required=&quot;required&quot;&amp;gt;
&amp;lt;button onclick=&quot;myScore()&quot;&amp;gt;Score&amp;lt;/button&amp;gt;
&amp;lt;script&amp;gt;
	function myScore() {
		const scoreObject = document.getElementById(&quot;score&quot;);
		if (!scoreObject.checkValidity()) {
			console.log(scoreObject.validity);
			alert(scoreObject.validationMessage);
		}
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;test.html를 웹 브라우저에서 실행하고 입력란에 &quot;0&quot;를 입력한 후 Score 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDaTk6/btrWg0iPuA4/bmKqcnkHkw8znelZ7nbJtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDaTk6/btrWg0iPuA4/bmKqcnkHkw8znelZ7nbJtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDaTk6/btrWg0iPuA4/bmKqcnkHkw8znelZ7nbJtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDaTk6%2FbtrWg0iPuA4%2FbmKqcnkHkw8znelZ7nbJtk%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;2256&quot; height=&quot;1416&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;콘솔에서&amp;nbsp;validity를&amp;nbsp;확인해&amp;nbsp;보면 score에&amp;nbsp;입력된 숫자가 0 이기 때문에 rangeUnderflow가 true가 되고&amp;nbsp;valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;rangeUnderflow : 입력 요소(Input type='number') 속성에 min이 있고 min 보다 작으면 true를 크거나 같으면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;rangeOverflow : 입력 요소(Input type='number') 속성에 max이 있고 max 보다 크면 true를 작거나 같으면 false를&amp;nbsp;리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/54tzx/btrWde3BGzk/Ay5DveQkKlXtI6L2DomGMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/54tzx/btrWde3BGzk/Ay5DveQkKlXtI6L2DomGMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/54tzx/btrWde3BGzk/Ay5DveQkKlXtI6L2DomGMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F54tzx%2FbtrWde3BGzk%2FAy5DveQkKlXtI6L2DomGMK%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;1614&quot; height=&quot;418&quot; data-origin-width=&quot;1614&quot; data-origin-height=&quot;418&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;span style=&quot;color: #333333;&quot;&gt;입력란에 &quot;101&quot;를 입력한 후 Score 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tKtsO/btrWjmeKevh/TuvaYJdq1f9pYtKa2FqUp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tKtsO/btrWjmeKevh/TuvaYJdq1f9pYtKa2FqUp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tKtsO/btrWjmeKevh/TuvaYJdq1f9pYtKa2FqUp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtKtsO%2FbtrWjmeKevh%2FTuvaYJdq1f9pYtKa2FqUp0%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;2256&quot; height=&quot;1416&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;콘솔에서&amp;nbsp;validity를&amp;nbsp;확인해&amp;nbsp;보면 score에&amp;nbsp;입력된 숫자가 101 이기 때문에 rangeOverflow가 true가 되고&amp;nbsp;valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bflfVX/btrWmm6uqLH/l7ALhemssLgfrK8fG0Lza1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bflfVX/btrWmm6uqLH/l7ALhemssLgfrK8fG0Lza1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bflfVX/btrWmm6uqLH/l7ALhemssLgfrK8fG0Lza1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbflfVX%2FbtrWmm6uqLH%2Fl7ALhemssLgfrK8fG0Lza1%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;1608&quot; height=&quot;418&quot; data-origin-width=&quot;1608&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;만약 입력란에 숫자가 아닌 문자를 입력하고 Score 버튼을 누르면 badInput이 true가 되고 valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJELm/btrWhtFdsXS/FNEkHxTqKqaGkkAqjrK1H1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJELm/btrWhtFdsXS/FNEkHxTqKqaGkkAqjrK1H1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJELm/btrWhtFdsXS/FNEkHxTqKqaGkkAqjrK1H1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJELm%2FbtrWhtFdsXS%2FFNEkHxTqKqaGkkAqjrK1H1%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;2256&quot; height=&quot;1416&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;badInput&amp;nbsp;:&amp;nbsp;입력&amp;nbsp;요소(Input&amp;nbsp;type='number')에&amp;nbsp;숫자가&amp;nbsp;아닌&amp;nbsp;문자가&amp;nbsp;있으면&amp;nbsp;true를 숫자면 false를&amp;nbsp;리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvtMnP/btrWefAT4I5/81BMF0V0aZhkYTP2GHWtCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvtMnP/btrWefAT4I5/81BMF0V0aZhkYTP2GHWtCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvtMnP/btrWefAT4I5/81BMF0V0aZhkYTP2GHWtCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvtMnP%2FbtrWefAT4I5%2F81BMF0V0aZhkYTP2GHWtCk%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;1594&quot; height=&quot;416&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;416&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;span style=&quot;color: #333333;&quot;&gt;만약 step이 2로 설정되어 있다면 다음에 증가할 숫자는 현재의 숫자보다 2가 커야 합니다. 그러나 입력된 숫자가 다음에 증가할 step이 아닌 숫자가 오면 stepMismatch가 true가 되고 valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673781455129&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input id=&quot;score&quot; type=&quot;number&quot; min=&quot;1&quot; max=&quot;100&quot; step=&quot;2&quot; required=&quot;required&quot;&amp;gt;
&amp;lt;button onclick=&quot;myScore()&quot;&amp;gt;Score&amp;lt;/button&amp;gt;
&amp;lt;script&amp;gt;
	function myScore() {
		const scoreObject = document.getElementById(&quot;score&quot;);
		if (!scoreObject.checkValidity()) {
			console.log(scoreObject.validity);
			alert(scoreObject.validationMessage);
		}
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 입력란에 &quot;4&quot;를 입력하고 Score 버튼을 누르면 stepMismatch가 true가 되고 valid가 false가 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XaP4Z/btrWjk84zPn/fLuXyViPQdlSEvO83BqjY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XaP4Z/btrWjk84zPn/fLuXyViPQdlSEvO83BqjY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XaP4Z/btrWjk84zPn/fLuXyViPQdlSEvO83BqjY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXaP4Z%2FbtrWjk84zPn%2FfLuXyViPQdlSEvO83BqjY1%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;2256&quot; height=&quot;1416&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;stepMismatch&amp;nbsp;:&amp;nbsp;입력&amp;nbsp;요소(Input&amp;nbsp;type='number')&amp;nbsp;속성에&amp;nbsp;step이&amp;nbsp;있고&amp;nbsp;step으로&amp;nbsp;나눈&amp;nbsp;나머지가&amp;nbsp;있으면&amp;nbsp;true를 그렇지 않으면 false를&amp;nbsp;리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k2daG/btrWeG6ffu4/SOcHcHY0ZGkCqLPxz9Knr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k2daG/btrWeG6ffu4/SOcHcHY0ZGkCqLPxz9Knr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2daG/btrWeG6ffu4/SOcHcHY0ZGkCqLPxz9Knr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2daG%2FbtrWeG6ffu4%2FSOcHcHY0ZGkCqLPxz9Knr1%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;1606&quot; height=&quot;416&quot; data-origin-width=&quot;1606&quot; data-origin-height=&quot;416&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;span style=&quot;color: #333333;&quot;&gt;전화번호를 입력할 수 있는 &amp;lt;input type=&quot;tel&quot;&amp;gt; 태그에 휴대폰 번호에 대한 pattern(패턴) 설정할 수 있게 하고 tel버튼을 눌러 검사하도록 코딩합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673782360306&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input id=&quot;tel1&quot; type=&quot;tel&quot; pattern=&quot;01[0|1|6|7|8|9]&quot; required=&quot;required&quot;&amp;gt;
&amp;lt;input id=&quot;tel2&quot; type=&quot;tel&quot; pattern=&quot;[0-9]{3,4}&quot; required=&quot;required&quot;&amp;gt;
&amp;lt;input id=&quot;tel3&quot; type=&quot;tel&quot; pattern=&quot;[0-9]{4}&quot; required=&quot;required&quot;&amp;gt;
&amp;lt;button onclick=&quot;myTel()&quot;&amp;gt;tel&amp;lt;/button&amp;gt;
&amp;lt;script&amp;gt;
	function myTel() {
		const tel1Object = document.getElementById(&quot;tel1&quot;);
		if (!tel1Object.checkValidity()) {
			console.log(tel1Object.validity);
			alert(tel1Object.validationMessage);
		}
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;test.html를 웹 브라우저에서 실행하고 tel1 입력란에 &quot;111&quot;를 입력한 후 tel 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ThYIZ/btrWd2BKskV/1hZs22DK9uvvIpe2iS0rxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ThYIZ/btrWd2BKskV/1hZs22DK9uvvIpe2iS0rxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ThYIZ/btrWd2BKskV/1hZs22DK9uvvIpe2iS0rxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThYIZ%2FbtrWd2BKskV%2F1hZs22DK9uvvIpe2iS0rxK%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;2256&quot; height=&quot;1416&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;콘솔에서&amp;nbsp;validity를&amp;nbsp;확인해&amp;nbsp;보면 tel1에&amp;nbsp;입력된 숫자가 pattern(패턴)과 일치하지 않기 때문에 patternMismatch가 true가 되고&amp;nbsp;valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;patternMismatch : 입력 요소(Input type='text, tel, email, url, password, search') 속성에 pattern(패턴)이 있고 pattern(패턴)과 일치하지 않으면 true를 일치하면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0bJKg/btrWd1bICg2/NsVgOv20tVCalFJXvrBaZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0bJKg/btrWd1bICg2/NsVgOv20tVCalFJXvrBaZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0bJKg/btrWd1bICg2/NsVgOv20tVCalFJXvrBaZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0bJKg%2FbtrWd1bICg2%2FNsVgOv20tVCalFJXvrBaZK%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;1592&quot; height=&quot;416&quot; data-origin-width=&quot;1592&quot; data-origin-height=&quot;416&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;span style=&quot;color: #333333;&quot;&gt;email를 입력할 수 있는 &amp;lt;input type=&quot;email&quot;&amp;gt; 태그에 데이터를 입력하여 email버튼을 눌러 검사하도록 코딩합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673783216371&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;input id=&quot;email&quot; type=&quot;email&quot; required=&quot;required&quot;/&amp;gt;
&amp;lt;button onclick=&quot;myEmail()&quot;&amp;gt;email&amp;lt;/button&amp;gt;
&amp;lt;script&amp;gt;
	function myEmail() {
		const emailObject = document.getElementById(&quot;email&quot;);
		if (!emailObject.checkValidity()) {
			console.log(emailObject.validity);
			alert(emailObject.validationMessage);
		}
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;test.html를 웹 브라우저에서 실행하고 email 입력란에 &quot;test.com&quot;를 입력한 후 email 버튼을 누릅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ovwY4/btrWjkH3j19/nHWzok2XCUmF5D78X2n0oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ovwY4/btrWjkH3j19/nHWzok2XCUmF5D78X2n0oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ovwY4/btrWjkH3j19/nHWzok2XCUmF5D78X2n0oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FovwY4%2FbtrWjkH3j19%2FnHWzok2XCUmF5D78X2n0oK%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;2256&quot; height=&quot;1416&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;콘솔에서&amp;nbsp;validity를&amp;nbsp;확인해&amp;nbsp;보면 email에&amp;nbsp;입력된 데이터가 email pattern(패턴)과 다르기 때문에 typeMismatch가 true가 되고&amp;nbsp;valid가 false가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;typeMismatch : 입력 요소(Input type='email, url')에 pattern(패턴)과 일치하지 않으면 true를 일치하면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1iq29/btrWeF0Ce3i/e2QZ6obsY1zmOk30utGIIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1iq29/btrWeF0Ce3i/e2QZ6obsY1zmOk30utGIIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1iq29/btrWeF0Ce3i/e2QZ6obsY1zmOk30utGIIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1iq29%2FbtrWeF0Ce3i%2Fe2QZ6obsY1zmOk30utGIIk%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;1598&quot; height=&quot;418&quot; data-origin-width=&quot;1598&quot; data-origin-height=&quot;418&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;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9439348148950574&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-layout=&quot;in-article&quot;
     data-ad-format=&quot;fluid&quot;
     data-ad-client=&quot;ca-pub-9439348148950574&quot;
     data-ad-slot=&quot;2122595293&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다시 게시물을 등록하는 소스를 돌아와서 진행하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;웹 브라우저에서 출력되는 유효성 검사 메시지를 보면 일반적인 메시지이고 영어 문장이 번역된 것이기 때문에 자연스럽지 않습니다. 그래서 JavaScript Validation API에서 제공하는 DOM 메서드인 setCustomValidity() 메서드를 사용하여 메시지를 변경하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;setCustomValidity() : 입력 요소에 있는 유효성 검사 메시지(validationMessage) 속성을 변경합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;주석처리된 부분은 삭제하였습니다. 그리고 검사 유형에 맞게 메시지를 변경하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673784325416&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		var registrationId = $('#registrationId')[0];
		if (!registrationId.checkValidity()) {
			if (registrationId.validity.valueMissing) {
				registrationId.setCustomValidity('작성자 입력란에 아이디가 입력되지 않았습니다.\n아이디를 입력하세요.');
			} else if (registrationId.validity.tooShort) {
				registrationId.setCustomValidity('작성자 입력란에 아이디는 최소 2자이상 최대 20자 이내로 입력하세요.');
			}
			alert(registrationId.validationMessage);
			$('#registrationId').focus();
			registrationId.setCustomValidity(&quot;&quot;);
			return;
		}
		var subject = $('#subject')[0];
		if (!subject.checkValidity()) {
			if (subject.validity.valueMissing) {
				subject.setCustomValidity('제목 입력란에 제목이 입력되지 않았습니다.\n제목을 입력하세요.');
			}
			alert(subject.validationMessage);
			$('#subject').focus();
			subject.setCustomValidity(&quot;&quot;);
			return;
		}
		$('#board').attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
		$('#board').submit();
	});
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;알럿 후에 setCustomValidity()&amp;nbsp;메서드를 빈 값으로 호출하는 이유는 customError 속성이 true로 유지되기 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;customError : setCustomValidity() 메서드를 사용하여 사용자 정의 메시지가 있으면 true를 없으면 false를 리턴합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SBZja/btrWdfnUrKq/cVHkP09ev9JVXlKZ8LDrd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SBZja/btrWdfnUrKq/cVHkP09ev9JVXlKZ8LDrd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SBZja/btrWdfnUrKq/cVHkP09ev9JVXlKZ8LDrd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSBZja%2FbtrWdfnUrKq%2FcVHkP09ev9JVXlKZ8LDrd0%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;1600&quot; height=&quot;418&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;418&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;span style=&quot;color: #333333;&quot;&gt;새로고침 후 등록 버튼을 누릅니다. 그러면 작성자(registrationId)에 입력된 데이터가 없어 변경된 메시지로 메시지가 알럿으로 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIv3DC/btrWnoXsDVH/HF0QnMgArADZyogPDRYUa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIv3DC/btrWnoXsDVH/HF0QnMgArADZyogPDRYUa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIv3DC/btrWnoXsDVH/HF0QnMgArADZyogPDRYUa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIv3DC%2FbtrWnoXsDVH%2FHF0QnMgArADZyogPDRYUa1%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;2256&quot; height=&quot;1418&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&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;span style=&quot;color: #333333;&quot;&gt;작성자(registrationId)에 &quot;t&quot;를 입력하고 등록 버튼을 누릅니다. 그러면 길이에 대해 변경된 메시지가 알럿으로 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DPUFr/btrWnopB8J3/o42SmjrgUNfMwxCdkGs2b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DPUFr/btrWnopB8J3/o42SmjrgUNfMwxCdkGs2b1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DPUFr/btrWnopB8J3/o42SmjrgUNfMwxCdkGs2b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDPUFr%2FbtrWnopB8J3%2Fo42SmjrgUNfMwxCdkGs2b1%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;2256&quot; height=&quot;1418&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&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;span style=&quot;color: #333333;&quot;&gt;작성자(registrationId)에 &quot;testid3&quot;를 입력하고 등록 버튼을 누릅니다. 이번에는&amp;nbsp;제목에 입력된 데이터가 없어 변경된 메시지로&amp;nbsp;메시지가&amp;nbsp;알럿으로 보입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TsDHf/btrWlk14Wcl/NrWtmbRzLtvPZ5zZx4i2qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TsDHf/btrWlk14Wcl/NrWtmbRzLtvPZ5zZx4i2qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TsDHf/btrWlk14Wcl/NrWtmbRzLtvPZ5zZx4i2qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTsDHf%2FbtrWlk14Wcl%2FNrWtmbRzLtvPZ5zZx4i2qK%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;2256&quot; height=&quot;1418&quot; data-origin-width=&quot;2256&quot; data-origin-height=&quot;1418&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;span style=&quot;color: #333333;&quot;&gt;이렇게 JavaScript Validation API를 사용하면 조금 코딩이 줄기도 하지만 오히려 늘어날 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 다른 방법으로 checkValidity() 메서드와 CSS의 :valid와 :invalid를 사용하여 처리해 보겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>checkValidity</category>
      <category>patternMismatch</category>
      <category>rangeOverflow</category>
      <category>rangeUnderflow</category>
      <category>setCustomValidity</category>
      <category>Spring</category>
      <category>tooLong</category>
      <category>tooShort</category>
      <category>validationMessage</category>
      <category>validity</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/262</guid>
      <comments>https://carrotweb.tistory.com/262#entry262comment</comments>
      <pubDate>Sun, 15 Jan 2023 22:06:24 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 게시물 등록 처리 - Create, Client-Side Validation</title>
      <link>https://carrotweb.tistory.com/261</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;지금부터는 게시판에 게시물을 등록, 조회, 수정, 삭제할 수 있게 개발하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;일반적으로 개발에서는 게시물을 등록, 조회, 수정, 삭제하는 것을 CRUD라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;CRUD는&amp;nbsp;Create(생성/등록/추가),&amp;nbsp;Read(읽기/조회),&amp;nbsp;Update(변경/수정),&amp;nbsp;Delete(삭제/제거)의&amp;nbsp;첫&amp;nbsp;문자를&amp;nbsp;따서&amp;nbsp;만든&amp;nbsp;용어입니다.&amp;nbsp;또는&amp;nbsp;Add(추가),&amp;nbsp;Browse(보기),&amp;nbsp;Change(변경),&amp;nbsp;Delete(삭제)의&amp;nbsp;첫&amp;nbsp;문자를&amp;nbsp;따서&amp;nbsp;ABCD라고도&amp;nbsp;합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이번에는 CRUD의 C(Create)로 게시물을 등록하는 UI와 INSERT Query, DAO, Service, Controller를 생성하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 main.jsp에 등록 버튼 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 &amp;lt;form:form&amp;gt; 태그 위에 등록 버튼 영역을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673153457984&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div class=&quot;buttons&quot;&amp;gt;
	&amp;lt;div class=&quot;right&quot;&amp;gt;
		&amp;lt;button id=&quot;addBtn&quot; class=&quot;button blue&quot;&amp;gt;등록&amp;lt;/button&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. &amp;lt;style&amp;gt; 태그에 등록 버튼 영역에 대한 CSS를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673153735580&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.buttons { position:relative; height:32px; margin-top:20px; }
.buttons &amp;gt; div.right { position:absolute; height:32px; right:0; }
.buttons &amp;gt; div &amp;gt; .button { overflow:visible; cursor:pointer; min-width:125px; height:32px; margin:0 2px; padding:0 15px; line-height:32px; font-size:14px; border:1px solid #dfdfdf; background:#fff; border-radius:10px; }
.buttons &amp;gt; div &amp;gt; .button.blue { color:#fff; border-color:#0099d2 !important; background:#0099d2 !important; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. &amp;lt;script&amp;gt; 태그에 등록 버튼에 대한 클릭 이벤트를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673153905290&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('#addBtn').click(function() {
	$(location).attr(&quot;href&quot;, &quot;/board/addform.do&quot;);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하면 페이지 오른쪽 상단에 등록 버튼이 나타나는 것을 확인할 수 있습니다. (페이지 크기를 10에서 5로 변경하였습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2378&quot; data-origin-height=&quot;1434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGxJIG/btrVz0krBJ0/nr3T7ROk15gEizhq5mkLv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGxJIG/btrVz0krBJ0/nr3T7ROk15gEizhq5mkLv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGxJIG/btrVz0krBJ0/nr3T7ROk15gEizhq5mkLv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGxJIG%2FbtrVz0krBJ0%2Fnr3T7ROk15gEizhq5mkLv0%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;2378&quot; height=&quot;1434&quot; data-origin-width=&quot;2378&quot; data-origin-height=&quot;1434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Board Controller 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에 com.home.study.test1.board.controller&amp;nbsp;패키지를&amp;nbsp;생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;test1 패키지에 board 패키지 생성 &amp;rarr; board 패키지에 controller 패키지 생성&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. com.home.study.test1.board.controller 패키지에 BoardController 클래스를 생성합니다. (BoardController.java&amp;nbsp;파일)&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;생성된 BoardController&amp;nbsp;클래스가 Spring Framework Web MVC의 Controller로 처리되게 하기 위해서 클래스 위에 @Controller Annotation(어노테이션)을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;/board&quot;로 시작하는 모든 요청을 처리할 수 있게 BoardController 클래스 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;요청 URL이 왔을 때 실행될 addBoardForm&amp;nbsp;메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;GET 방식으로 요청 URL이 &quot;/addform.do&quot;가 왔을 때 addBoardForm 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다. (@RequestMapping Annotation(어노테이션)에는 요청 URL에서 &quot;.do&quot;를 제외한 경로를 입력합니다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;addBoardForm&amp;nbsp;메서드의 리턴 값으로 &quot;board/boardform&quot;를 입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1673155054184&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.home.study.test1.board.model.Board;

@Controller
@RequestMapping(&quot;/board&quot;)
public class BoardController {

	@RequestMapping(value=&quot;/addform&quot;, method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		return &quot;board/boardform&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwnJUo/btrVzKPIWk0/qKQmKXlG5kbx62WNTyAS61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwnJUo/btrVzKPIWk0/qKQmKXlG5kbx62WNTyAS61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwnJUo/btrVzKPIWk0/qKQmKXlG5kbx62WNTyAS61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwnJUo%2FbtrVzKPIWk0%2FqKQmKXlG5kbx62WNTyAS61%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;1764&quot; height=&quot;1195&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 SiteMesh에 게시판 데코레이터 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. WEB-INF/config 폴더에서 sitemesh.xml 파일을 오픈하고 게시판 페이지 만을 위해 &quot;/board/*.do&quot;로 데코레이터를 추가합니다. 우선 기존 mainDecorator를 설정하고 향후에 게시판 전용 데코레이터로 변경하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673165065094&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE configuration&amp;gt;
&amp;lt;sitemesh&amp;gt;
	&amp;lt;!-- 기본 페이지 --&amp;gt;
	&amp;lt;mapping decorator=&quot;/WEB-INF/views/decorators/default/defaultDecorator.jsp&quot;/&amp;gt;
	
	&amp;lt;!-- 메인 페이지 --&amp;gt;
	&amp;lt;mapping path=&quot;/index.do&quot; decorator=&quot;/WEB-INF/views/decorators/default/mainDecorator.jsp&quot;/&amp;gt;

	&amp;lt;!-- 게시판 페이지 --&amp;gt;
	&amp;lt;mapping path=&quot;/board/*.do&quot; decorator=&quot;/WEB-INF/views/decorators/default/mainDecorator.jsp&quot;/&amp;gt;
	
	&amp;lt;!-- sitemesh 예외 --&amp;gt;
	&amp;lt;mapping path=&quot;/api/*&quot; exclude=&quot;true&quot;/&amp;gt;
	&amp;lt;mapping path=&quot;/*.html&quot; exclude=&quot;true&quot;/&amp;gt;
	&amp;lt;mapping path=&quot;/*.htm&quot; exclude=&quot;true&quot;/&amp;gt;
	&amp;lt;mapping path=&quot;/*.js&quot; exclude=&quot;true&quot;/&amp;gt;
	&amp;lt;mapping path=&quot;/*.css&quot; exclude=&quot;true&quot;/&amp;gt;
&amp;lt;/sitemesh&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Board Form JSP 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. WEB-INF 폴더에 views 폴더를 생성하고 생성된 views 폴더에 board 폴더를 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. board 폴더에 boardform.jsp 파일을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Form Tag Library를 사용하여 게시물을 등록할 수 있는 입력 폼을 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BoardController 클래스의 addBoardForm&amp;nbsp;메서드에서 @ModelAttribute Annotation(어노테이션)으로 Board 객체를 받기 때문에 &amp;lt;form:form&amp;gt; 태그의 modelAttribute 속성에 board 객체를 지정합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게시물의 작성자 아이디, 제목, 내용을 받기 위해 &amp;lt;form:input&amp;gt; 태그의 path 속성에 board 객체의 registrationId(작성자 아이디), subject(제목) 변수를 지정하고 &amp;lt;form:textarea&amp;gt; 태그의 path 속성에 board 객체의&amp;nbsp;content(내용) 변수를 지정합니다. (아직 로그인 처리가 없기 때문에 registrationId(작성자 아이디)를 직접 입력하게 하였습니다. 로그인 처리는 향후에 처리하겠습니다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1673164928495&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;%@ page language=&quot;java&quot; contentType=&quot;text/html; charset=UTF-8&quot; pageEncoding=&quot;UTF-8&quot;%&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot;%&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://www.springframework.org/tags/form&quot; prefix=&quot;form&quot;%&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
		&amp;lt;title&amp;gt;게시판&amp;lt;/title&amp;gt;
		&amp;lt;style type=&quot;text/css&quot;&amp;gt;
			.board { width:800px; margin: 20px auto; }
			.board table { width:100%; border-top:2px solid #1d4281; border-spacing:0; }
			.board table th { padding:8px 10px 10px 10px; vertical-align:middle; color:#1d4281; font-size:14px; border-bottom:1px solid #ccc; background:#f8f8f8; }
			.board table td { padding:7px 20px 9px 20px; text-align:left; vertical-align:middle; border-bottom:1px solid #ccc; font-size:14px; line-heighT:150%; }
			.board table td input[type=&quot;text&quot;], .board table td textarea { width:100%; color:#000 !important; } 
			.buttons { position:relative; height:32px; margin-top:20px; }
			.buttons &amp;gt; div.right { position:absolute; height:32px; right:0; }
			.buttons &amp;gt; div &amp;gt; .button { overflow:visible; cursor:pointer; min-width:125px; height:32px; margin:0 2px; padding:0 15px; line-height:32px; font-size:14px; border:1px solid #dfdfdf; background:#fff; border-radius:10px; }
			.buttons &amp;gt; div &amp;gt; .button.blue { color:#fff; border-color:#0099d2 !important; background:#0099d2 !important; }
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;div class=&quot;board&quot;&amp;gt;
			&amp;lt;form:form modelAttribute=&quot;board&quot; autocomplete=&quot;off&quot;&amp;gt;
			&amp;lt;table&amp;gt;
				&amp;lt;colgroup&amp;gt;
					&amp;lt;col style=&quot;width:18.5%&quot;&amp;gt;
					&amp;lt;col style=&quot;width:auto&quot;&amp;gt;
				&amp;lt;/colgroup&amp;gt;
				&amp;lt;tbody&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;작성자&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;registrationId&quot; placeholder=&quot;아이디를 입력하세요.&quot; /&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;제목&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;form:input path=&quot;subject&quot; placeholder=&quot;제목을 입력하세요.&quot; /&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
					&amp;lt;tr&amp;gt;
						&amp;lt;th scope=&quot;row&quot;&amp;gt;내용&amp;lt;/th&amp;gt;
						&amp;lt;td&amp;gt;&amp;lt;form:textarea path=&quot;content&quot; placeholder=&quot;내용을 입력하세요.&quot; rows=&quot;10&quot;/&amp;gt;&amp;lt;/td&amp;gt;
					&amp;lt;/tr&amp;gt;
				&amp;lt;/tbody&amp;gt;
			&amp;lt;/table&amp;gt;
			&amp;lt;/form:form&amp;gt;
			&amp;lt;div class=&quot;buttons&quot;&amp;gt;
				&amp;lt;div class=&quot;right&quot;&amp;gt;
					&amp;lt;button id=&quot;saveBtn&quot; class=&quot;button blue&quot;&amp;gt;등록&amp;lt;/button&amp;gt;
					&amp;lt;button id=&quot;cancelBtn&quot; class=&quot;button&quot;&amp;gt;취소&amp;lt;/button&amp;gt;
				&amp;lt;/div&amp;gt;
			&amp;lt;/div&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7IVG4/btrVIvJPeOJ/K8AvDhkCIpv9i4S5wo4Nk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7IVG4/btrVIvJPeOJ/K8AvDhkCIpv9i4S5wo4Nk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7IVG4/btrVIvJPeOJ/K8AvDhkCIpv9i4S5wo4Nk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7IVG4%2FbtrVIvJPeOJ%2FK8AvDhkCIpv9i4S5wo4Nk1%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;1764&quot; height=&quot;1195&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;1162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckOYDW/btrVI7PKHcw/7uLZguDZK9UrQPrk2saJn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckOYDW/btrVI7PKHcw/7uLZguDZK9UrQPrk2saJn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckOYDW/btrVI7PKHcw/7uLZguDZK9UrQPrk2saJn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckOYDW%2FbtrVI7PKHcw%2F7uLZguDZK9UrQPrk2saJn1%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;1829&quot; height=&quot;1162&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;1162&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;span style=&quot;color: #333333;&quot;&gt;게시물 입력 폼(/board/addform.do)에서 등록 버튼을 클릭하여 폼(form)을 전송(Submit) 하기 전에 &amp;lt;script&amp;gt;에서 입력 요소들에 대해 값이 유효한지 검사하거나 전송된 후에 controller에서 입력 요소들에 대해 값이 유효한지 검사하여 사용자에게 필수 입력이나 잘 못된 입력에 대해 알려주서 재입력하게 해야 합니다. 이런 유효성검사를 Validation(밸리데이션)이라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Validation을 어느 시점에서 처리하느냐에 따라 Client-Side Validation과 Server-Side Validation로 구분됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Client-Side Validation은 폼(form)을 전송(Submit) 하기 전에 &amp;lt;script&amp;gt;에서 폼(form) 안에 있는 입력 요소들에 대해 값이 유효한지 검사하고 유효하지 않으면 사용자에게 알려줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Server-Side Validation은 controller에서 전송된 데이터에 대해 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;값이 유효한지 검사하고 유효하지 않으면 내부 process(프로세스)를 중지하고 Client(웹 페이지)로 에러메시지를 전송하여 &lt;/span&gt;사용자에게 알려줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;b&gt;Maven Spring Project의 &lt;b&gt;Board Form JSP에 &lt;/b&gt;&lt;/b&gt;Client-Side Validation 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈하여 등록 버튼과 취소 버튼에 대한 클릭 이벤트를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;게시물은 작성자 아이디와 제목은&amp;nbsp;필수 입력값이 때문에 입력 값이 공백이 아니어야 합니다. 그래서 등록 버튼이 클릭되면 작성자 아이디와 제목의 입력 값을 확인하고 공백이면 alert으로 메시지를 알려주고 사용자가 입력할 수 있게 포커스를 이동시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;입력 값이 모두 유효하다면 &quot;/board/addboard.do&quot;로 폼(form)을 전송(Submit) 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;취소 버튼이 클릭되면 history.back()이나 history.go(-1)를 이전 페이지로 이동시킵니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1673179350469&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(function() {
	$('#saveBtn').click(function() {
		var registrationId = $('#registrationId').val();
		if (registrationId == null || registrationId == &quot;&quot;) {
			alert(&quot;아이디를 입력하세요.&quot;);
			$(&quot;#registrationId&quot;).focus();
			return;
		}
		var subject = $('#subject').val();
		if (subject == null || subject == &quot;&quot;) {
			alert(&quot;제목을 입력하세요.&quot;);
			$(&quot;#subject&quot;).focus();
			return;
		}
		$('#board').attr(&quot;action&quot;, &quot;/board/addboard.do&quot;);
		$('#board').submit();
	});
	$('#cancelBtn').click(function() {
		window.history.go(-1);
	});
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Mapper XML에 Insert Query 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert) 하기 위해서 &amp;lt;insert&amp;gt;으로 쿼리문을 생성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;insert&amp;gt;의 id 속성은 insert를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다. id 속성은 DAO에서 구문을 찾을 때 사용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;insert&amp;gt;안에는 INSERT구문을 사용하여 데이터베이스에서 데이터를 등록하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;lt;insert&amp;gt;의 parameterType 속성은 전송된 데이터를 받을 Model(모델) 명을 입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;useGeneratedKeys 속성을 true로 하여 keyProperty 속성 값에 지정된&amp;nbsp;sequence(게시판 시퀀스)가 자동으로 생성되게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1673180575846&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--
	게시물을 등록합니다.
--&amp;gt;
&amp;lt;insert id=&quot;insertBoardItem&quot; useGeneratedKeys=&quot;true&quot; keyProperty=&quot;sequence&quot; parameterType=&quot;Board&quot;&amp;gt;
	INSERT INTO INT_BOARD_TB
	       (
	        BRD_SUBJECT,
	        BRD_CONTENT,
	        REG_ID
	       )
	       VALUES
	       (
	        #{subject},
	        #{content},
	        #{registrationId}
	       )
&amp;lt;/insert&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 DAO - Board Interface에 insert 메서드 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.&amp;nbsp;Java&amp;nbsp;Resource&amp;nbsp;&amp;gt;&amp;nbsp;src/main/java에서&amp;nbsp;com.home.study.test1.board.dao 패키지에&amp;nbsp;있는&amp;nbsp;IBoardDao&amp;nbsp;Interface(인터페이스)를&amp;nbsp;오픈합니다.&amp;nbsp;(IBoardDao.java)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert) 하기 위해 insertBoardItem 메서드를 선언합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673181525297&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.dao;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardDao {

	int selectBoardListCount(BoardSearch boardSearch);
	
	List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch);
	
	int insertBoardItem(Board board);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&lt;b&gt;Maven Spring Project의 &lt;/b&gt;Dao - Board&amp;nbsp;Implement에 insert 메서드 구현 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.dao.impl 패키지에 있는 BoardDaoImpl 클래스를 오픈합니다. (BoardDaoImpl.java)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. BoardDaoImpl 클래스에서 IBoardDao Interface(인터페이스)의 insertBoardItem 메서드를 구현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673184256496&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int org.apache.ibatis.session.SqlSession.insert(String statement, Object parameter)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SqlSession의&amp;nbsp;insert&amp;nbsp;메서드의&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;파라미터인&amp;nbsp;statement는&amp;nbsp;실행&amp;nbsp;구문의&amp;nbsp;고유&amp;nbsp;식별자로&amp;nbsp;문자열&amp;nbsp;변수(SQL_FILE_PATH)와&amp;nbsp;의&amp;nbsp;id&amp;nbsp;속성&amp;nbsp;값을&amp;nbsp;결합한&amp;nbsp;값입니다.&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;파라미터인&amp;nbsp;parameter는&amp;nbsp;실행&amp;nbsp;구문에&amp;nbsp;전달할&amp;nbsp;객체로&amp;nbsp;board&amp;nbsp;변수를&amp;nbsp;입력합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SqlSession의 insert 메서드는 리턴 값으로 등록된 ROW의 수가 int로 리턴됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673182132150&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

@Repository(&quot;BoardDaoImpl&quot;)
public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = &quot;com.home.study.test1.board.mapper.mariadb.BoardMapper.&quot;;

	@Autowired
	@Qualifier(&quot;sqlSessionMariaDB&quot;)
	private SqlSession sqlSession;

	@Override
	public int selectBoardListCount(BoardSearch boardSearch) {
		return ((Integer)sqlSession.selectOne(SQL_FILE_PATH + &quot;selectBoardListCount&quot;, boardSearch)).intValue();
	}

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		return sqlSession.selectList(SQL_FILE_PATH + &quot;selectBoardList&quot;, boardSearch);
	}

	@Override
	public int insertBoardItem(Board board) {
		return sqlSession.insert(SQL_FILE_PATH + &quot;insertBoardItem&quot;, board);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Interface에 insert 메서드 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.service 패키지에 있는 IBoardService Interface(인터페이스)를 오픈합니다. (IBoardService.java)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. DAO (Board Interface, Implement)을 사용하여 INT_BOARD_TB(게시판) Table에 데이터(게시물)를 등록(insert) 하기 위해 insertBoardItem 메서드를 선언합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673182630643&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardService {

	List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch);
	
	boolean insertBoardItem(Board board);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9439348148950574&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-layout=&quot;in-article&quot;
     data-ad-format=&quot;fluid&quot;
     data-ad-client=&quot;ca-pub-9439348148950574&quot;
     data-ad-slot=&quot;2122595293&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Implement에 insert 메서드 구현 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.service.impl 패키지에 있는 BoardServiceImpl 클래스를 오픈합니다. (BoardServiceImpl.java)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. BoardServiceImpl 클래스에서 IBoardService Interface(인터페이스)의 insertBoardItem 메서드를 구현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이클립스에서는 마우스를 BoardServiceImpl 클래스 위로 이동합니다. 콘텍스트 메뉴에서 &quot;Add unimplemented methods&quot;(구현되지 않은 메서드 추가)를 클릭하면 자동으로 메서드를 생성해 줍니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;insertBoardItem 메서드에서 boardDao의 insertBoardItem 메서드를 사용하여 데이터(게시물)를 등록시키고 등록된 결과가 1이면 true로 리턴하게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1673182998350&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Service
public class BoardServiceImpl implements IBoardService {

	@Autowired
	IBoardDao boardDao;

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		if (boardSearch.getPagination() == null) {
			boardSearch.setPagination(new Pagination());
		}
		
		int count = boardDao.selectBoardListCount(boardSearch);
		boardSearch.getPagination().setRecordTotalCount(count);
		
		List&amp;lt;Board&amp;gt; boardList = null;
		if (count &amp;gt; 0) {
			boardSearch.getPagination().processZero();
			boardList = boardDao.selectBoardList(boardSearch);
		}
		return boardList;
	}

	@Override
	public boolean insertBoardItem(Board board) {
		return (boardDao.insertBoardItem(board) == 1) ? true : false;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Controller에 addBoard 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에서 com.home.study.test1.board.controller&amp;nbsp;패키지에 있는 BoardController 클래스를 오픈합니다. (BoardController.java)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. IBoardService Interface(인터페이스)를 선언하고 의존성 주입(Dependency Injection)을 위해서 @Autowired Annotation(어노테이션)를 변수 위에 붙여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. boardService의 insertBoardItem 메서드를 사용하여 데이터(게시물)를 등록하기 위해 addBoard&amp;nbsp;메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다. 등록되면 redirect로 index.do로 이동시키고 등록되지 않으면 다시 입력 폼(/board/boardform.do)으로 이동시킵니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. POST 방식으로 요청 URL이 &quot;/board/addboard.do&quot;가 왔을 때 addBoard 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1673184564432&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.service.IBoardService;


@Controller
@RequestMapping(&quot;/board&quot;)
public class BoardController {

	@Autowired
	IBoardService boardService;

	@RequestMapping(value=&quot;/addform&quot;, method=RequestMethod.GET)
	public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		return &quot;board/boardform&quot;;
	}

	@RequestMapping(value=&quot;/addboard&quot;, method=RequestMethod.POST)
	public String addBoard(HttpServletRequest request, HttpServletResponse response,
			@ModelAttribute(&quot;board&quot;) Board board, ModelMap model) {
		if (!boardService.insertBoardItem(board)) {
			return &quot;board/boardform&quot;;
		}
		
		return &quot;redirect:/index.do&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 등록 버튼을 클릭하면 게시물 입력 폼(/board/addform.do)으로 이동됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 입력 폼에 작성자는 &quot;testid3&quot;, 제목은 &quot;테스트 제목 11&quot;, 내용은 &quot;테스트 내용 11&quot;로 입력하고 등록 버튼을 클릭합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DpIxT/btrVzVX63Uw/fNWoiIt4ZcLEiMe9u60LB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DpIxT/btrVzVX63Uw/fNWoiIt4ZcLEiMe9u60LB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DpIxT/btrVzVX63Uw/fNWoiIt4ZcLEiMe9u60LB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDpIxT%2FbtrVzVX63Uw%2FfNWoiIt4ZcLEiMe9u60LB1%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&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;span style=&quot;color: #333333;&quot;&gt;그럼 정상적으로 등록되고 리스트 페이지인 &quot;index.do&quot;로 이동됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mykeV/btrVE1WUFzv/xkyARSgoZpZbaMV5ka66V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mykeV/btrVE1WUFzv/xkyARSgoZpZbaMV5ka66V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mykeV/btrVE1WUFzv/xkyARSgoZpZbaMV5ka66V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmykeV%2FbtrVE1WUFzv%2FxkyARSgoZpZbaMV5ka66V0%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;1830&quot; height=&quot;1164&quot; data-origin-width=&quot;1830&quot; data-origin-height=&quot;1164&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;span style=&quot;color: #333333;&quot;&gt;지금까지 일반적인 Client-Side Validation으로 입력 요소들의 값을 유효성 검사하고 등록 처리하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이어서, Client-Side Validation인 JavaScript Validation API에 대해 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>Client-Side Validation</category>
      <category>insert</category>
      <category>Spring</category>
      <category>validation</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/261</guid>
      <comments>https://carrotweb.tistory.com/261#entry261comment</comments>
      <pubDate>Sun, 8 Jan 2023 23:22:26 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 Pagination(페이지네이션) 처리 및 적용 3</title>
      <link>https://carrotweb.tistory.com/260</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;페이지네이션에서 전체 페이지 앞 번호 버튼, 이전 페이지 사이즈 번호 버튼, 다음 페이지 사이즈 번호 버튼, 전체 페이지 마지막 번호 버튼을 활성화 또는 비활성화로 제어하면 클릭에 대한 오류를 방지할 수 있습니다. (이미 내부 소스에서 예외처리가 되어 있어 오류는 발생하지 않습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/otanS/btrUXpFAMdb/9ytYeIKHJUKbSU25HOJ8i1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/otanS/btrUXpFAMdb/9ytYeIKHJUKbSU25HOJ8i1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/otanS/btrUXpFAMdb/9ytYeIKHJUKbSU25HOJ8i1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FotanS%2FbtrUXpFAMdb%2F9ytYeIKHJUKbSU25HOJ8i1%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;1381&quot; height=&quot;323&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;323&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;span&gt;&lt;span&gt;페이지네이션에서&lt;span&gt; 버튼은 &amp;lt;button&amp;gt; 태그가 아닌 &amp;lt;li&amp;gt; 태그와 &amp;lt;a&amp;gt; 태그를 사용하고 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672557328195&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button disabled&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;button&amp;gt; 태그는 비활성화하기 위해서 disable 속성을 추가하면 되지만 &amp;lt;li&amp;gt; 태그와 &amp;lt;a&amp;gt; 태그는 disable 속성이 지원되지 않습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 &amp;lt;a&amp;gt; 태그를 비활성화하기 위해서는 일반적으로 href 속성을 제거합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672557658503&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-first&quot; data-pageno=&quot;1&quot; href=&quot;javascript:void(0)&quot;&amp;gt;First&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;

&amp;lt;!-- href 속성 제거를 통한 비활성화 처리 --&amp;gt;
&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-first&quot; data-pageno=&quot;1&quot;&amp;gt;First&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 &amp;lt;a&amp;gt; 태그를 화성화/&lt;span&gt;비활성화하기&lt;span&gt; 위해서는 Script에서 동적으로 &lt;/span&gt;&lt;/span&gt;href 속성을 제거했다가 추가해야 하는 문제점이 있습니다.&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;lt;a&amp;gt; 태그들은 href 속성 값이 void로 처리되어 있고 Script에서 &amp;lt;a&amp;gt; 태그들에 대한 클릭 이벤트를 공통으로 처리하고 있기 때문에 href 속성 제거 없이 Script에서 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Script로 처리하기&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;페이지레이션 Script에 있는 클릭 이벤트 함수를 수정하겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672559480386&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('#boardPagination .page-link').click(function(event) {
	event.preventDefault();
	event.stopPropagation();
	boardSearch.find('input:hidden[name=&quot;paging.pageNo&quot;]').val($(this).attr(&quot;data-pageno&quot;));
	boardSearch.submit();
});&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;1. 먼저 전체 페이지 마지막 번호를 Script에서 사용할 수 있게 &amp;lt;form:form&amp;gt; 태그 안에 &amp;lt;form:hidden&amp;gt; &lt;span style=&quot;color: #000000;&quot;&gt;태그를 생성하고 path 속성에 boardSearch 객체에서 pagination 객체의 pageLastNo 변수를 지정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672560274401&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:hidden path=&quot;pagination.pageLastNo&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;form&gt;그리고 Script에 변수로 가져옵니다.&lt;/form&gt;
&lt;pre id=&quot;code_1672560025857&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var pageLastNo = boardSearch.find('input:hidden[name=&quot;pagination.pageLastNo&quot;]').val();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 현재 페이지 번호와 이동할 페이지 번호를 변수로 가져옵니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672560066090&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var pageNo = boardSearch.find('input:hidden[name=&quot;pagination.pageNo&quot;]').val();
var moveToPageNo = $(this).attr(&quot;data-pageno&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 현제 페이지 번호와 이동할 페이지 번호가 1 이거나 &lt;span&gt;현제 페이지 번호와 이동할 페이지 번호가 전체 페이지 마지막 번호이면 이동하지 않게 &lt;span style=&quot;color: #000000;&quot;&gt;리턴합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1672571152776&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if ((pageNo == 1 &amp;amp;&amp;amp; moveToPageNo == 1) || (pageNo == pageLastNo &amp;amp;&amp;amp; moveToPageNo == pageLastNo)) {
	return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 현제 페이지 번호와 이동할 페이지 번호가 같을 때도 이동하지 않게 하고 싶다면 조건문에 추가하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672571235971&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if ((pageNo == moveToPageNo) || (pageNo == 1 &amp;amp;&amp;amp; moveToPageNo == 1) || (pageNo == pageLastNo &amp;amp;&amp;amp; moveToPageNo == pageLastNo)) {
	return;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 클릭 이벤트 함수입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672559303949&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$('#boardPagination .page-link').click(function(event) {
	event.preventDefault();
	event.stopPropagation();
	var pageLastNo = boardSearch.find('input:hidden[name=&quot;pagination.pageLastNo&quot;]').val();
	var pageNo = boardSearch.find('input:hidden[name=&quot;pagination.pageNo&quot;]').val();
	var moveToPageNo = $(this).attr(&quot;data-pageno&quot;);
	if ((pageNo == moveToPageNo) || (pageNo == 1 &amp;amp;&amp;amp; moveToPageNo == 1) || (pageNo == pageLastNo &amp;amp;&amp;amp; moveToPageNo == pageLastNo)) {
		return;
	}
	if (moveToPageNo &amp;gt; 0 &amp;amp;&amp;amp; moveToPageNo &amp;lt;= pageLastNo) {
		boardSearch.find('input:hidden[name=&quot;pagination.pageNo&quot;]').val(moveToPageNo);
		boardSearch.submit();
	}
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 클릭 이벤트 함수는 페이지레이션 버튼의 클릭 이벤트를 제어했다기보다는 조건문으로 이동하지 않게 처리한 겁니다. 그래서 페이지레이션 버튼 자체를 활성화하거나 비활성화할 수는 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;span&gt;페이지레이션 버튼 자체를&lt;span&gt; 활&lt;/span&gt;&lt;/span&gt;&lt;span&gt;성화하거나 비활성화할 수는 있는 방법을 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span&gt;CSS의 &lt;span&gt;pointer-events 속성으로 처리하기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그것은 CSS의 pointer-events 속성을 사용하여 이벤트에 대해 반응해야 하는지 여부를 설정할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672573655092&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pointer-events: auto|none;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;auto는 이벤트에 대해 반응하게 하고 none은 이벤에 대해 반응하지 않게 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;none으로 설정되면 마우스의 커서가 텍스트 커서로 변경됩니다.&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;위에 있는 Script로 테스트하셨다면 기존 소스로 다시 변경하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &amp;lt;style&amp;gt; 태그에 페이지네이션 버튼인 &amp;lt;li&amp;gt; 태그가 이벤트에 대해 반응하지 않게 pointer-events 속성을 none으로 설정하고 &amp;lt;a&amp;gt; 태그의 폰트 색을 회색으로 변경하기 위해 CSS를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672576195322&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.board ul.pagination li.disabled { pointer-events: none; }
.board ul.pagination li.disabled a { color: #cccccc; }&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;2.&amp;nbsp;pagination&amp;nbsp;UI를&amp;nbsp;수정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;전체 페이지 앞 번호인 &amp;lt;li&amp;gt; 태그의 class 속성 값에 현재 페이지 번호(pageNo)가 1 이면 disabled를 추가합니다.&lt;/li&gt;
&lt;li&gt;이전 페이지 사이즈 번호인 &amp;lt;li&amp;gt; 태그의 class 속성 값에 페이지&amp;nbsp;시작&amp;nbsp;번호(pageStartNo)에서 1을 뺀 값이 0 이면 disabled를 추가합니다.&lt;/li&gt;
&lt;li&gt;다음 페이지 사이즈 번호인 &lt;span&gt;&amp;lt;li&amp;gt; 태그의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;class 속성 값에&lt;span&gt; 페이지&amp;nbsp;종료&amp;nbsp;번호&lt;/span&gt;&lt;/span&gt;(pageEndNo)에서 1을 더한 값이 페이지 마지막 번호(pageLastNo) 보다 크면 disabled를 추가합니다.&lt;/li&gt;
&lt;li&gt;전체&amp;nbsp;페이지&amp;nbsp;마지막&amp;nbsp;번호인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;lt;li&amp;gt; 태그의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;class 속성 값에&lt;span&gt;&lt;span&gt; 현재 페이지 번호(pageNo)가&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 페이지 마지막 번호(pageLastNo)와 같으면 disabled를 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672576124966&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;c:if test=&quot;${not empty boardList}&quot;&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;ul id=&quot;boardPagination&quot; class=&quot;pagination&quot;&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${boardSearch.pagination.pageNo == 1}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-first&quot; data-pageno=&quot;1&quot; href=&quot;javascript:void(0)&quot;&amp;gt;First&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${(boardSearch.pagination.pageStartNo - 1) == 0}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-prev&quot; data-pageno=&quot;${boardSearch.pagination.pageStartNo - 1}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;&amp;amp;lt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;c:forEach var=&quot;page&quot; begin=&quot;${boardSearch.pagination.pageStartNo}&quot; end=&quot;${boardSearch.pagination.pageEndNo}&quot; step=&quot;1&quot;&amp;gt;
				&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${boardSearch.pagination.pageNo == page}&quot;&amp;gt; active&amp;lt;/c:if&amp;gt;&quot;&amp;gt;
					&amp;lt;a class=&quot;page-link page-no&quot; data-pageno=&quot;${page}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;${page}&amp;lt;/a&amp;gt;
				&amp;lt;/li&amp;gt;
			&amp;lt;/c:forEach&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${boardSearch.pagination.pageEndNo + 1 &amp;gt; boardSearch.pagination.pageLastNo}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-next&quot; data-pageno=&quot;${boardSearch.pagination.pageEndNo + 1}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${boardSearch.pagination.pageNo == boardSearch.pagination.pageLastNo}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-last&quot; data-pageno=&quot;${boardSearch.pagination.pageLastNo}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;Last&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&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. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 페이지 크기를 10에서 5로 변경합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lj8vz/btrU8E1Yoi7/DkOWhAiPjpa1nU8L2RmEmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lj8vz/btrU8E1Yoi7/DkOWhAiPjpa1nU8L2RmEmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lj8vz/btrU8E1Yoi7/DkOWhAiPjpa1nU8L2RmEmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLj8vz%2FbtrU8E1Yoi7%2FDkOWhAiPjpa1nU8L2RmEmk%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;2372&quot; height=&quot;1420&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;1420&quot;/&gt;&lt;/span&gt;&lt;/figure&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;3. 2번 페이지 번호를 클릭하면 이전/다음 페이지로 이동하는 버튼과 마지막 페이지로 이동하는 버튼이 비활성화되어 나타나는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAGo4H/btrU01EiIo4/pzW5UjOOJUz89SKNQHSaGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAGo4H/btrU01EiIo4/pzW5UjOOJUz89SKNQHSaGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAGo4H/btrU01EiIo4/pzW5UjOOJUz89SKNQHSaGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAGo4H%2FbtrU01EiIo4%2FpzW5UjOOJUz89SKNQHSaGK%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;2372&quot; height=&quot;1420&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;1420&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;현재 이전/다음 페이지로 이동하는 버튼 항상 비활성화되어 있는 이유는 이전 페이지로 이동하는 번호가 0이고 다음 페이지로 이동하는 번호가 3으로 더 이상 이동할 수 없기 때문입니다.&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;4. 웹 브라우저에서 &quot;http://localhost:9000/index.do?pagination.recordCountPerPage=1&amp;amp;pagination.pageSize=3&quot;로 입력하여 페이지레이션 버튼을 클릭해 보면 이전/다음 페이지로 이동하는 버튼 활성화되고 비활성화되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;1420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0wLtR/btrU3aUQAT3/F0KY9J1KnplSs0JTxb9KD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0wLtR/btrU3aUQAT3/F0KY9J1KnplSs0JTxb9KD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0wLtR/btrU3aUQAT3/F0KY9J1KnplSs0JTxb9KD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0wLtR%2FbtrU3aUQAT3%2FF0KY9J1KnplSs0JTxb9KD0%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;2372&quot; height=&quot;1420&quot; data-origin-width=&quot;2372&quot; data-origin-height=&quot;1420&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 페이지 연산과 버튼의 활성화 여부를 Pagination 객체에서 처리하여 Pagination UI에서는 연산 없이 값만 사용하여 처리할 수 있게 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Pagination&amp;nbsp;확장&amp;nbsp;처리&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;이전 페이지 사이즈 번호(prevPageSizeNo)는 페이지 시작 번호(pageStartNo)에서 1을 뺍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 페이지 사이즈 번호 활성화 여부(enablePrevPageSizeNO)는 이전 페이지 사이즈 번호(prevPageSizeNo)가 0보다 크면 이동할 수 있기 때문에 true로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672579010829&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int prevPageSizeNo = 0;
boolean enablePrevPageSizeNo = false;

prevPageSizeNo = pageStartNo - 1;
if (prevPageSizeNo &amp;gt; 0) {
	enablePrevPageSizeNo = true;
}&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;다음 페이지 사이즈 번호(nextPageSizeNo)는 페이지 종료 번호(pageEndNo)에 1을 더합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 페이지 사이즈 번호 활성화 여부(enableNextPageSizeNO)는 페이지 마지막 번호(pageLastNo) 보다 작거나 같으면 이동할 수 있기 때문에 true로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672579174437&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int nextPageSizeNo = 1;
boolean enableNextPageSizeNo = false;

nextPageSizeNo = endPageNo + 1;
if (nextPageSizeNo &amp;lt;= pageLastNo) {
	enableNextPageSizeNo = true;
}&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;전체 페이지 앞 번호 활성화 여부(enablePageFirstNo)&lt;span&gt;는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;현재 페이지 번호(pageNo)가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1보다 크면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이동할 수 있기 때문에 true로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672579572898&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean enablePageFirstNo = false;

if (pageNo &amp;gt; 1) {
	enablePageFirstNo = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 페이지 &lt;span&gt;마지막&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;번호 활성화 여부(enablePageLastNo)&lt;span&gt;는&lt;span&gt; 현재 페이지 번호(pageNo)가 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;페이지 마지막 번호(pageLastNo) 보다 작으면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이동할 수 있기 때문에 true로 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1672579500292&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean enablePageLastNo = false;

if (pageNo &amp;lt; pageLastNo) {
	enablePageLastNo = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project에 Common Pagination 수정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Java Resource &amp;gt; src/main/java에 com.home.study.common.search&amp;nbsp;패키지에&amp;nbsp;있는&amp;nbsp;Pagination.java&amp;nbsp;파일을&amp;nbsp;오픈하고&amp;nbsp;수정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;이전 페이지 사이즈 번호(prevPageSizeNo), 다음 페이지 사이즈 번호(nextPageSizeNo), 이전 페이지 사이즈 번호 활성화 여부(enablePrevPageSizeNo), 다음 페이지 사이즈 번호 활성화 여부(enableNextPageSizeNo), 전체 페이지 앞 번호 활성화 여부(enablePageFirstNo), 전체 페이지 마지막 번호 활성화 여부(enablePageLastNo) 변수를 생성하고 Getter, Setter를 생성합니다.&lt;/li&gt;
&lt;li&gt;process() 메서드에 계산 공식을 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1672579983395&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.common.search;

public class Pagination extends Paging {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1014943426267041010L;

	/**
	 * 페이지 사이즈(기본값 10)
	 */
	private int pageSize = 10;

	/**
	 * 페이지 시작 번호
	 */
	private int pageStartNo = 1;

	/**
	 * 페이지 종료 번호
	 */
	private int pageEndNo = 1;

	/**
	 * 이전 페이지 사이즈 번호
	 */
	private int prevPageSizeNo = 1;

	/**
	 * 다음 페이지 사이즈 번호
	 */
	private int nextPageSizeNo = 1;

	/**
	 * 이전 페이지 사이즈 번호 활성화 여부
	 */
	private boolean enablePrevPageSizeNo = false;

	/**
	 * 다음 페이지 사이즈 번호 활성화 여부
	 */
	private boolean enableNextPageSizeNo = false;

	/**
	 * 전체 페이지 앞 번호 활성화 여부
	 */
	private boolean enablePageFirstNo = false;

	/**
	 * 전체 페이지 마지막 번호 활성화 여부
	 */
	private boolean enablePageLastNo = false;

	/**
	 * 페이지 사이즈를 가져옵니다.
	 * @return 페이지 사이즈
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 페이지 사이즈를 설정합니다.
	 * @param pageSize 페이지 사이즈
	 */
	public void setPageSize(int pageSize) {
		if (pageSize &amp;lt;= 0) {
			pageSize = 10;
		}
		this.pageSize = pageSize;
	}

	/**
	 * 페이지 시작 번호를 가져옵니다.
	 * @return 페이지 시작 번호
	 */
	public int getPageStartNo() {
		return pageStartNo;
	}

	/**
	 * 페이지 종료 번호를 가져옵니다.
	 * @return 페이지 종료 번호
	 */
	public int getPageEndNo() {
		return pageEndNo;
	}

	@Override
	protected void process(boolean zero) {
		super.process(zero);
		
		// 페이지 시작 번호 설정
		// 몫만큼 페이지 시작 번호 변경한다.
		int start = pageNo / pageSize;
		if (start &amp;gt;= 1) {
			// 나머지가 없으면 페이지 번호가 페이지 마지막 번호와 같아 몫을 감소 시킨다.
			if (pageNo % pageSize == 0){
				start--;
			}
			pageStartNo = (start * pageSize) + 1;
		}
		
		if (pageLastNo &amp;gt; 0) {
			// 페이지 종료 번호 설정
			pageEndNo = (pageStartNo - 1) + pageSize;
			// 페이지 종료 번호가 페이지 마지막 번호보다 크면 페이지 마지막 번호로 변경
			if (pageEndNo &amp;gt; pageLastNo) {
				pageEndNo = pageLastNo;
			}
			
			// 이전 페이지 사이즈 번호
			prevPageSizeNo = pageStartNo - 1;
			// 이전 페이지 사이즈 번호 활성화 여부
			if (prevPageSizeNo &amp;gt; 0) {
				enablePrevPageSizeNo = true;
			}
			
			// 다음 페이지 사이즈 번호
			nextPageSizeNo = pageEndNo + 1;
			// 다음 페이지 사이즈 번호 활성화 여부
			if (nextPageSizeNo &amp;lt;= pageLastNo) {
				enableNextPageSizeNo = true;
			}
			
			// 전체 페이지 앞 번호 활성화 여부
			if (pageNo &amp;gt; 1) {
				enablePageFirstNo = true;
			}
			
			// 전체 페이지 마지막 번호 활성화 여부
			if (pageNo &amp;lt; pageLastNo) {
				enablePageLastNo = true;
			}
		}
	}

	/**
	 * 이전 페이지 사이즈 번호를 가져옵니다.
	 * @return 이전 페이지 사이즈 번호
	 */
	public int getPrevPageSizeNo() {
		return prevPageSizeNo;
	}

	/**
	 * 다음 페이지 사이즈 번호를 가져옵니다.
	 * @return 다음 페이지 사이즈 번호
	 */
	public int getNextPageSizeNo() {
		return nextPageSizeNo;
	}

	/**
	 * 이전 페이지 사이즈 번호 활성화 여부를 가져옵니다.
	 * @return 이전 페이지 사이즈 번호 활성화 여부
	 */
	public boolean isEnablePrevPageSizeNo() {
		return enablePrevPageSizeNo;
	}

	/**
	 * 다음 페이지 사이즈 번호 활성화 여부를 가져옵니다.
	 * @return 다음 페이지 사이즈 번호 활성화 여부
	 */
	public boolean isEnableNextPageSizeNo() {
		return enableNextPageSizeNo;
	}

	/**
	 * 전체 페이지 앞 번호 활성화 여부를 가져옵니다.
	 * @return 전체 페이지 앞 번호 활성화 여부
	 */
	public boolean isEnablePageFirstNo() {
		return enablePageFirstNo;
	}

	/**
	 * 전체 페이지 마지막 번호 활성화 여부를 가져옵니다.
	 * @return 전체 페이지 마지막 번호 활성화 여부
	 */
	public boolean isEnablePageLastNo() {
		return enablePageLastNo;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project의 main.jsp에 Pagination UI 수정하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 pagination UI를 수정합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;전체 페이지 앞 번호인 &amp;lt;li&amp;gt; 태그의 class 속성 값에&amp;nbsp;전체 페이지 앞 번호&amp;nbsp; 활성화 여부(enablePageFirstNo)를 비교하여 disabled를 추가합니다.&lt;/li&gt;
&lt;li&gt;이전 페이지 사이즈 번호인 &amp;lt;li&amp;gt; 태그의 데이터 속성(data-pageno) 값을 이전 페이지 사이즈 번호(prevPageSizeNo)로 변경하고 class 속성 값에 이전 페이지 사이즈 번호 활성화 여부(enablePrevPageSizeNo)&lt;span&gt;를 비교하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;disabled를 추가합니다.&lt;/li&gt;
&lt;li&gt;다음 페이지 사이즈 번호인 &amp;lt;li&amp;gt; 태그의 &lt;span&gt;데이터 속성(data-pageno) 값을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다음 페이지 사이즈 번호(nextPageSizeNo)로 변경하고 &lt;span&gt;class 속성 값에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다음 페이지 사이즈 번호 활성화 여부(enableNextPageSizeNo)&lt;span&gt;를 비교하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;disabled를 추가합니다.&lt;/li&gt;
&lt;li&gt;전체&amp;nbsp;페이지 마지막 번호인 &amp;lt;li&amp;gt; 태그의 class 속성 값에 전체&lt;span&gt;&amp;nbsp;&lt;/span&gt;페이지 마지막 번호 활성화 여부(enablePageLastNo)&lt;span&gt;를 비교하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;disabled를 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1672581113607&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;c:if test=&quot;${not empty boardList}&quot;&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;ul id=&quot;boardPagination&quot; class=&quot;pagination&quot;&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${!boardSearch.pagination.isEnablePageFirstNo()}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-first&quot; data-pageno=&quot;1&quot; href=&quot;javascript:void(0)&quot;&amp;gt;First&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${!boardSearch.pagination.isEnablePrevPageSizeNo()}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-prev&quot; data-pageno=&quot;${boardSearch.pagination.prevPageSizeNo}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;&amp;amp;lt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;c:forEach var=&quot;page&quot; begin=&quot;${boardSearch.pagination.pageStartNo}&quot; end=&quot;${boardSearch.pagination.pageEndNo}&quot; step=&quot;1&quot;&amp;gt;
				&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${boardSearch.pagination.pageNo == page}&quot;&amp;gt; active&amp;lt;/c:if&amp;gt;&quot;&amp;gt;
					&amp;lt;a class=&quot;page-link page-no&quot; data-pageno=&quot;${page}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;${page}&amp;lt;/a&amp;gt;
				&amp;lt;/li&amp;gt;
			&amp;lt;/c:forEach&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${!boardSearch.pagination.isEnableNextPageSizeNo()}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-next&quot; data-pageno=&quot;${boardSearch.pagination.nextPageSizeNo}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${!boardSearch.pagination.isEnablePageLastNo()}&quot;&amp;gt; disabled&amp;lt;/c:if&amp;gt;&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-last&quot; data-pageno=&quot;${boardSearch.pagination.pageLastNo}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;Last&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&amp;lt;style&amp;gt;&amp;nbsp;태그에&amp;nbsp;현재&amp;nbsp;페이지&amp;nbsp;번호&amp;nbsp;버튼이&amp;nbsp;활성화(active)될&amp;nbsp;때&amp;nbsp;이벤트에&amp;nbsp;대해&amp;nbsp;반응하지&amp;nbsp;않게&amp;nbsp;pointer-events&amp;nbsp;속성을&amp;nbsp;none으로&amp;nbsp;추가합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1672581872770&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.board ul.pagination li.page-item.active a { color: #fff; background-color: #0d6efd; pointer-events: none; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&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. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 페이지 크기를 10에서 5로 변경합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W5J7R/btrU6XHxNfJ/DX1GSoSIvfIgRT66A0MLbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W5J7R/btrU6XHxNfJ/DX1GSoSIvfIgRT66A0MLbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W5J7R/btrU6XHxNfJ/DX1GSoSIvfIgRT66A0MLbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW5J7R%2FbtrU6XHxNfJ%2FDX1GSoSIvfIgRT66A0MLbK%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;1854&quot; height=&quot;1109&quot; data-origin-width=&quot;1854&quot; data-origin-height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>pagination</category>
      <category>Spring</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/260</guid>
      <comments>https://carrotweb.tistory.com/260#entry260comment</comments>
      <pubDate>Sun, 1 Jan 2023 23:11:51 +0900</pubDate>
    </item>
    <item>
      <title>Spring에 Pagination(페이지네이션) 처리 및 적용 2</title>
      <link>https://carrotweb.tistory.com/259</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;검색된 게시물이 많아지면 페이지네이션에서 노출되는 페이지 번호가 많아집니다. 그래서 노출되는 페이지 번호의 수를 조절하지 않으면 페이지네이션 UI에 문제점가 발생합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예를 들어, 검색된 결과가 350건이고 페이지 크기가 5이면 페이지네이션에 노출되는 페이지 번호가 70개가 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1693&quot; data-origin-height=&quot;1168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8x8Kg/btrTXMzBCKQ/nWMC3iMIOKM6VUlRCuHNI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8x8Kg/btrTXMzBCKQ/nWMC3iMIOKM6VUlRCuHNI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8x8Kg/btrTXMzBCKQ/nWMC3iMIOKM6VUlRCuHNI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8x8Kg%2FbtrTXMzBCKQ%2FnWMC3iMIOKM6VUlRCuHNI1%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;1693&quot; height=&quot;1168&quot; data-origin-width=&quot;1693&quot; data-origin-height=&quot;1168&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&lt;span style=&quot;color: #333333;&quot;&gt;그러나 페이지네이션에서 노출되는 페이지 번호 수가 많으면 복잡해 보일 수 도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 페이지네이션에서 노출되는 페이지 번호 수를 조절하여 처리되도록 페이지네이션 클래스를 생성하도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;페이지네이션에서 노출될 페이지 번호 개수를 페이지 사이즈(pageSize)라고 하고 노출될 페이지 사이즈의 시작 번호를 페이지 시작 번호(pageStartNo), 노출될 페이지 사이즈의 종료 번호를 페이지 종료 번호(pageEndNo)라고 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyx7S1/btrTRBGHwP7/Ose89O7mrYSzg5uoDM6dEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyx7S1/btrTRBGHwP7/Ose89O7mrYSzg5uoDM6dEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyx7S1/btrTRBGHwP7/Ose89O7mrYSzg5uoDM6dEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcyx7S1%2FbtrTRBGHwP7%2FOse89O7mrYSzg5uoDM6dEK%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;1381&quot; height=&quot;323&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;323&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;span style=&quot;color: #333333;&quot;&gt;페이지 사이즈(pageSize)는 대부분 10개로 많이 사용합니다. 원하시는 페이지 사이즈를 정하시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 사이즈를 10으로 하면&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;첫 번째 페이지네이션의 페이지 시작 번호는 1이고 페이지 종료 번호는 10이 됩니다. 그리고&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;두 번째 페이지네이션의 페이지 시작 번호는 11이고 페이지 종료 번호는 20이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼 계산으로 페이지 시작 번호(pageStartNo)와 페이지 종료 번호(pageEndNo)를 계산해 보도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;페이지 시작 번호(pageStartNo)는 현재 페이지 번호(pageNo)를 페이지 사이즈(pageSize)로 나눈 몫과 페이지 사이즈(pageSize)를 곱하고 1을 더하면 됩니다. 단, 나머지가 없으면 페이지 번호(pageNo)와 페이지 사이즈(pageSize)가 같기 때문에 나눈 몫(start)에서 1을 빼야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671361971588&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int pageStartNo = 1;	
int start = pageNo / pageSize;

if (start &amp;gt;= 1) {
	if (pageNo % pageSize == 0) {
		start--;
	}
	pageStartNo = (start * pageSize) + 1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;예를 들어, 현재 페이지 번호(pageNo)가 4이고 페이지 사이즈(pageSize)가 10이면 나눈 몫(start)이 0으로 페이지 시작 번호(pageStartNo)는 초기값인 1이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러나 현재 페이지 번호(pageNo)가 페이지 사이즈(pageSize) 보다 큰 14이면 나눈 몫(start)이 1로 페이지 시작 번호(pageStartNo)는 나눈 몫(start)과 페이지 사이즈(pageSize)를 곱하고 1을 더해 11이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 현재 페이지 번호(pageNo)가 20이면 나눈 몫(start)이 2가 되나 페이지 번호(pageNo)를 페이지 사이즈(pageSize)로 나눈 나머지가 없기 때문에 나눈 몫(start)에서 1을 빼서 1이 됩니다. (나눈 몫(start)에서 1을 빼는 이유는 현재 페이지 번호(pageNo)가 페이지 종료 번호(pageEndNo)와 같기 때문입니다.) 그래서 페이지 시작 번호(pageStartNo)는 나눈 몫(start)과 페이지 사이즈(pageSize)를 곱하고 1을 더해 11이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;페이지 종료 번호(pageEndNo)는 페이지 시작 번호(pageStartNo)에서 1을 빼고 페이지 사이즈(pageSize)를 더하면 됩니다. (페이지 시작 번호(pageStartNo)에서 1을 빼는 이유는 페이지 시작 번호는 항상 페이지 사이즈보다 1이 크기 때문입니다.) 그러나 페이지 종료 번호가 페이지 마지막 번호보다 크면 페이지 마지막 번호로 변경해 줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671363351572&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int pageEndNo = (pageStartNo - 1) + pageSize;
if (pageEndNo &amp;gt; pageLastNo) {
	pageEndNo = pageLastNo;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그럼 Pagination(페이지네이션) 클래스를 생성하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Pagination(페이지네이션) 클래스는 이전에 만든 Paging 클래스를 계승(상속) 받아서 생성하겠습니다. (Paging 클래스를 계승(상속) 받는 이유는 Paging 클래스에 있는 변수와 계산 공식을 사용하기 위해서입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Common Pagination 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에 com.home.study.common.search 패키지에 있는 Paging.java 파일을 오픈하고 private로 되어 있는 변수와 process() 메서드를 protected로 수정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;변수를&amp;nbsp;private에서&amp;nbsp;protected로&amp;nbsp;수정하는&amp;nbsp;이유는&amp;nbsp;계승(상속)&amp;nbsp;받은&amp;nbsp;클래스에서&amp;nbsp;쉽게&amp;nbsp;변수에&amp;nbsp;접근하기&amp;nbsp;위해서고&amp;nbsp;process()&amp;nbsp;메서드를&amp;nbsp;protected로&amp;nbsp;수정하는&amp;nbsp;이유는&amp;nbsp;process()&amp;nbsp;메서드를&amp;nbsp;Override(오버라이드)하여&amp;nbsp;사용하기&amp;nbsp;위해서입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그리고 process() 메서드에서 현재 페이지 번호(pageNo)가 페이지 마지막 번호(pageLastNo) 보다 크면 오류가 발생하지 않게 계산을 하지 않았습니다. 그러나 현재 페이지 번호가 페이지 마지막 번호와 같을 때 삭제가 발생할 경우 전체 레코드 수가 줄어들어 페이지 마지막 번호가 줄어들 수 있습니다. 그래서 우리는 현재 페이지 번호가 페이지 마지막 번호보다 크면 현재 페이지 번호를 페이지 마지막 번호로 변경하여 처리하겠습니다. 만약, process() 메서드를 처리하기 전에 현재 페이지 번호를 검사하여 예외 처리를 할 거라면 기존의 소스를 유지하시면 됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671365043876&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.common.search;

import java.io.Serializable;

public class Paging implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 5531728426097598480L;

	/**
	 * 전체 레코드 수
	 */
	protected int recordTotalCount = 0;

	/**
	 * 페이지 레코드 수(기본값 : 10)
	 */
	protected int recordCountPerPage = 10;

	/**
	 * 페이지 번호
	 */
	protected int pageNo = 1;

	/**
	 * 페이지의 레코드 시작 번호
	 */
	protected int pageStartRecordNo = 0;

	/**
	 * 페이지의 레코드 종료 번호
	 */
	protected int pageEndRecordNo = 0;

	/**
	 * 페이지 마지막 번호
	 */
	protected int pageLastNo = 0;

	/**
	 * 전체 레코드 수를 가져옵니다.
	 * @return 전체 레코드 수
	 */
	public int getRecordTotalCount() {
		return recordTotalCount;
	}

	/**
	 * 전체 레코드 수를 설정합니다.
	 * @param recordTotalCount 전체 레코드 수
	 */
	public void setRecordTotalCount(int recordTotalCount) {
		this.recordTotalCount = recordTotalCount;
	}

	/**
	 * 페이지 레코드 수를 가져옵니다.
	 * @return 페이지 레코드 수
	 */
	public int getRecordCountPerPage() {
		return recordCountPerPage;
	}

	/**
	 * 페이지 레코드 수를 설정합니다.
	 * @param recordCountPerPage 페이지 레코드 수
	 */
	public void setRecordCountPerPage(int recordCountPerPage) {
		if (recordCountPerPage &amp;lt;= 0) {
			recordCountPerPage = 10;
		}
		this.recordCountPerPage = recordCountPerPage;
	}

	/**
	 * 페이지 번호를 가져옵니다.
	 * @return 페이지 현재 번호
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * 페이지 번호를 설정합니다.
	 * @param pageNo 페이지 현재 번호
	 */
	public void setPageNo(int pageNo) {
		if (pageNo &amp;lt;= 0) {
			pageNo = 1;
		}
		this.pageNo = pageNo;
	}

	/**
	 * 페이지의 레코드 시작 번호를 가져옵니다.
	 * @return 페이지의 레코드 시작 번호
	 */
	public int getPageStartRecordNo() {
		return pageStartRecordNo;
	}

	/**
	 * 페이지의 레코드 종료 번호를 가져옵니다.
	 * @return 페이지의 레코드 종료 번호
	 */
	public int getPageEndRecordNo() {
		return pageEndRecordNo;
	}

	/**
	 * 페이지 마지막 번호를 가져옵니다.
	 * @return 페이지 마지막 번호
	 */
	public int getPageLastNo() {
		return pageLastNo;
	}

	/**
	 * one 베이스(oracle)로 페이징을 처리합니다.
	 */
	public void processOne() {
		process(false);
	}

	/**
	 * zero 베이스(mariaDB, mySQL)로 페이징을 처리합니다.
	 */
	public void processZero() {
		process(true);
	}

	/**
	 * 페이징을 처리합니다.
	 * @param zero 제로 베이스 여부 (true : mariaDB, mySQL은 zero 베이스, false : oracle은 1 베이스)
	 */
	protected void process(boolean zero) {
		// 레코드 번호
		int startBase = 1;
		int endBase = 0;
		// 제로 베이스 
		if (zero) {
			startBase = 0;
			endBase = -1;
		}
		
		// 페이지 마지막 번호 설정
		// 나머지가 있으면 페이지 마지막 번호를 증가 시킨다.
		pageLastNo = (recordTotalCount / recordCountPerPage) + (recordTotalCount % recordCountPerPage == 0 ? 0 : 1);
		if (pageLastNo &amp;gt; 0) {
			// 현재 페이지 번호가 페이지 마지막 번호도 크면 페이지 마지막 번호로 변경
			// 현재 페이지 번호가 페이지 마지막 번호와 같을 때 삭제가 발생할 경우 전체 레코드 수가 줄어 들어 페이지 마지막 번호가 줄어 들 경우 페이지 마지막 번호로 변경
			if (pageNo &amp;gt; pageLastNo) {
				pageNo = pageLastNo;
			}
			// 페이지의 레코드 시작 번호 설정
			pageStartRecordNo = ((pageNo - 1) * recordCountPerPage) + startBase;
			// 페이지의 레코드 종료 번호 설정
			pageEndRecordNo = pageNo * recordCountPerPage + endBase;
			// 페이지의 레코드 종료 번호가 전체 레코드 수보다 크면 전체 레코드 수로 변경
			if (pageEndRecordNo &amp;gt; (recordTotalCount + endBase)) {
				pageEndRecordNo = recordTotalCount + endBase;
			}
		} else {
			pageStartRecordNo = 0;
			pageEndRecordNo = 0;
			pageLastNo = 0;
		}
	}
}&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: #333333;&quot;&gt;2. Java Resource &amp;gt; src/main/java에 com.home.study.common.search 패키지에 Paging 클래스를 계승(상속) 받아서 Pagination 클래스를 생성합니다. (Pagination.java)&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Pagination 클래스에 Paging 클래스가 계승(상속)되도록 class에 extends로 Paging를 입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Pagination 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 &quot;Add generated serial version ID&quot;를 클릭하여 serialVersionUID를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;페이지 사이즈(pageSize), 페이지 시작 번호(pageStartNo), 페이지 종료 번호(pageEndNo) 변수를 생성하고 Getter, Setter를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;계산하기 위해 process() 메서드를 Override(오버라이드)하여 생성하고 계산 공식을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671368246063&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.common.search;

public class Pagination extends Paging {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1014943426267041010L;

	/**
	 * 페이지 사이즈(기본값 10)
	 */
	private int pageSize = 10;

	/**
	 * 페이지 시작 번호
	 */
	private int pageStartNo = 1;

	/**
	 * 페이지 종료 번호
	 */
	private int pageEndNo = 1;

	/**
	 * 페이지 사이즈를 가져옵니다.
	 * @return 페이지 사이즈
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 페이지 사이즈를 설정합니다.
	 * @param pageSize 페이지 사이즈
	 */
	public void setPageSize(int pageSize) {
		if (pageSize &amp;lt;= 0) {
			pageSize = 10;
		}
		this.pageSize = pageSize;
	}

	/**
	 * 페이지 시작 번호를 가져옵니다.
	 * @return 페이지 시작 번호
	 */
	public int getPageStartNo() {
		return pageStartNo;
	}

	/**
	 * 페이지 종료 번호를 가져옵니다.
	 * @return 페이지 종료 번호
	 */
	public int getPageEndNo() {
		return pageEndNo;
	}

	@Override
	protected void process(boolean zero) {
		super.process(zero);
		
		// 페이지 시작 번호 설정
		// 몫만큼 페이지 시작 번호 변경한다.
		int start = pageNo / pageSize;
		if (start &amp;gt;= 1) {
			// 나머지가 없으면 페이지 번호가 페이지 마지막 번호와 같아 몫을 감소 시킨다.
			if (pageNo % pageSize == 0){
				start--;
			}
			pageStartNo = (start * pageSize) + 1;
		}
		
		if (pageLastNo &amp;gt; 0) {
			// 페이지 종료 번호 설정
			pageEndNo = (pageStartNo - 1) + pageSize;
			// 페이지 종료 번호가 페이지 마지막 번호보다 크면 페이지 마지막 번호로 변경
			if (pageEndNo &amp;gt; pageLastNo) {
				pageEndNo = pageLastNo;
			}
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1765&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVOgZR/btrTVTGdNfD/WyuuD8QBAC2OgxxMCSF6jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVOgZR/btrTVTGdNfD/WyuuD8QBAC2OgxxMCSF6jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVOgZR/btrTVTGdNfD/WyuuD8QBAC2OgxxMCSF6jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVOgZR%2FbtrTVTGdNfD%2FWyuuD8QBAC2OgxxMCSF6jK%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;1765&quot; height=&quot;1195&quot; data-origin-width=&quot;1765&quot; data-origin-height=&quot;1195&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;span style=&quot;color: #333333;&quot;&gt;현재 Search 클래스에서 Paging 클래스를 변수로 사용하고 있습니다. 그래서 Search 클래스에서 Paging 클래스를 Pagination 클래스로 변경하여 사용할 수 있지만 Paging 클래스 만으로도 사용할 수 있는 곳이 있을 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그래서 Pagination 클래스를 변수로 사용하는 별도의 Search 클래스를 생성하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;먼저 Search 클래스에서 Paging 클래스 변수를 제외한 변수들과 Getter, Setter 메서드들을 베이스 클래스로 생성하고 Search 클래스에서 계승(상속) 받게&amp;nbsp; 변경하겠습니다. 그리고 베이스 클래스를 계승(상속) 받아서 SearchEx 클래스를 생성하고 Pagination 클래스를 변수로 사용하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Common Base Search Model 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에 com.home.study.common.search 패키지에&amp;nbsp;있는 패키지에&amp;nbsp;BaseSearch&amp;nbsp;클래스를&amp;nbsp;생성합니다.&amp;nbsp;(BaseSearch.java)&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Search 클래스에 Serializable가 구현(implements)되도록 class에 implements로 Serializable를 입력합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Search 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 &quot;Add generated serial version ID&quot;를 클릭하여 serialVersionUID를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;검색 타입(searchType), 검색 조건(searchCondition), 검색 키워드(searchKeyword), 사용 여부(useYesNo) 변수와 Getter, Setter를 기존 Search 클래스에서 복사하여 붙여 넣기 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671375438889&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.common.search;

import java.io.Serializable;

public class BaseSearch implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = -756754534938248926L;

	/**
	 * 검색 타입
	 */
	protected String searchType = &quot;&quot;;

	/**
	 * 검색 조건
	 */
	protected String searchCondition = &quot;&quot;;

	/**
	 * 검색 키워드
	 */
	protected String searchKeyword = &quot;&quot;;

	/**
	 * 사용 여부
	 */
	protected String useYesNo = &quot;&quot;;

	/**
	 * 검색 타입을 가져옵니다.
	 * @return 검색 타입
	 */
	public String getSearchType() {
		return searchType;
	}

	/**
	 * 검색 타입을 설정합니다.
	 * @param searchType 검색 타입
	 */
	public void setSearchType(String searchType) {
		this.searchType = searchType;
	}

	/**
	 * 검색 조건을 가져옵니다.
	 * @return 검색 조건
	 */
	public String getSearchCondition() {
		return searchCondition;
	}

	/**
	 * 검색 조건을 설정합니다.
	 * @param searchCondition 검색 조건
	 */
	public void setSearchCondition(String searchCondition) {
		this.searchCondition = searchCondition;
	}

	/**
	 * 검색 키워드를 가져옵니다.
	 * @return 검색 키워드
	 */
	public String getSearchKeyword() {
		return searchKeyword;
	}

	/**
	 * 검색 키워드를 설정합니다.
	 * @param searchKeyword 검색 키워드
	 */
	public void setSearchKeyword(String searchKeyword) {
		this.searchKeyword = searchKeyword;
	}


	/**
	 * 사용 여부를 가져옵니다.
	 * @return 사용 여부
	 */
	public String getUseYesNo() {
		return useYesNo;
	}

	/**
	 * 사용 여부를 설정합니다.
	 * @param useYesNo 사용 여부
	 */
	public void setUseYesNo(String useYesNo) {
		this.useYesNo = useYesNo;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlVMQ0/btrTRZ1Oxta/JTuU6CPVFM91Vy0C9MkBNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlVMQ0/btrTRZ1Oxta/JTuU6CPVFM91Vy0C9MkBNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlVMQ0/btrTRZ1Oxta/JTuU6CPVFM91Vy0C9MkBNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlVMQ0%2FbtrTRZ1Oxta%2FJTuU6CPVFM91Vy0C9MkBNk%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;1764&quot; height=&quot;1195&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&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;span style=&quot;color: #333333;&quot;&gt;2. Java Resource &amp;gt; src/main/java에&amp;nbsp;com.home.study.common.search 패키지에 있는 Search.java 파일을 오픈하고 수정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Search 클래스가 BaseSearch 클래스가 계승(상속)되도록 class에 extends를 추가합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671376166217&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.common.search;

public class Search extends BaseSearch {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 300076093391308064L;

	/**
	 * 페이징 객체
	 */
	private Paging paging = null;

	/**
	 * 페이징 객체를 가져옵니다.
	 * @return 페이징 객체
	 */
	public Paging getPaging() {
		return paging;
	}

	/**
	 * 페이징 객체를 설정합니다.
	 * @param paging 페이징 객체
	 */
	public void setPaging(Paging paging) {
		this.paging = paging;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9439348148950574&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block; text-align:center;&quot;
     data-ad-layout=&quot;in-article&quot;
     data-ad-format=&quot;fluid&quot;
     data-ad-client=&quot;ca-pub-9439348148950574&quot;
     data-ad-slot=&quot;2122595293&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Common SearchEx Model 추가하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java에 com.home.study.common.search 패키지에 BaseSearch 클래스를 계승(상속) 받아서 SearchEx 클래스를 생성합니다. (SearchEx.java)&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SearchEx 클래스에 BaseSearch 클래스가 계승(상속)되도록 class에 extends를 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SearchEx 클래스 위로 마우스를 이동합니다. 콘텍스트 메뉴에서 &quot;Add generated serial version ID&quot;를 클릭하여 serialVersionUID를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;SearchEx&amp;nbsp;클래스에 Pagination 클래스를 변수로 생성하고 Getter, Setter를 생성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671376004174&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.common.search;

public class SearchEx extends BaseSearch {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 863405122989816160L;

	/**
	 * 페이지네이션 객체
	 */
	private Pagination pagination = null;

	/**
	 * 페이지네이션 객체를 가져옵니다.
	 * @return 페이지네이션 객체
	 */
	public Pagination getPagination() {
		return pagination;
	}

	/**
	 * 페이지네이션 객체를 설정합니다.
	 * @param pagination 페이지네이션 객체
	 */
	public void setPagination(Pagination pagination) {
		this.pagination = pagination;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccVmK3/btrTUDcCu9L/9bmlEu7Jvio6MeZJKLdeEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccVmK3/btrTUDcCu9L/9bmlEu7Jvio6MeZJKLdeEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccVmK3/btrTUDcCu9L/9bmlEu7Jvio6MeZJKLdeEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccVmK3%2FbtrTUDcCu9L%2F9bmlEu7Jvio6MeZJKLdeEk%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;1764&quot; height=&quot;1195&quot; data-origin-width=&quot;1764&quot; data-origin-height=&quot;1195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project에 Board Search Model 수정하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1.&amp;nbsp;Java&amp;nbsp;Resource&amp;nbsp;&amp;gt;&amp;nbsp;src/main/java에&amp;nbsp;com.home.study.test1.board.model 패키지에 있는 BoardSearch.java 파일을 오픈하고 수정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;BoardSearch 클래스가 SearchEx 클래스로부터 계승(상속)되도록&amp;nbsp;변경합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671376610090&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.model;

import com.home.study.common.search.SearchEx;

public class BoardSearch extends SearchEx {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 8154425410965108205L;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Board Mapper XML에서 Pagination으로 수정하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;paging를 pagination으로 변경합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671377117723&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--
	게시판 리스트를 가져옵니다.
--&amp;gt;
&amp;lt;select id=&quot;selectBoardList&quot; parameterType=&quot;BoardSearch&quot; resultMap=&quot;BoardMap&quot;&amp;gt;
	SELECT BRD.BRD_SEQ,
	       BRD.BRD_SUBJECT,
	       BRD.REG_ID,
	       DATE_FORMAT(BRD.REG_DTM, '%Y-%m-%d %H:%i:%s') AS REG_DTM
	  FROM INT_BOARD_TB BRD
	  &amp;lt;include refid=&quot;whereBoardSearch&quot;/&amp;gt;
	  ORDER BY BRD.REG_DTM DESC
	  LIMIT #{pagination.pageStartRecordNo}, #{pagination.recordCountPerPage}
&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 Service - Board Implement에서 &lt;b&gt;Pagination으로 수정하기&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. Java Resource &amp;gt; src/main/java &amp;gt; com.home.study.test1.board.service.impl.BoardServiceImpl.java 파일을 오픈합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;paging 객체를 pagination 객체로 변경합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;getPaging(), setPaging() 메서드를 getPagination(),&amp;nbsp; setPagination() 메서드로 변경합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671377462864&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.home.study.test1.board.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Service
public class BoardServiceImpl implements IBoardService {

	@Autowired
	IBoardDao boardDao;

	@Override
	public List&amp;lt;Board&amp;gt; selectBoardList(BoardSearch boardSearch) {
		if (boardSearch.getPagination() == null) {
			boardSearch.setPagination(new Pagination());
		}
		
		int count = boardDao.selectBoardListCount(boardSearch);
		boardSearch.getPagination().setRecordTotalCount(count);
		
		List&amp;lt;Board&amp;gt; boardList = null;
		if (count &amp;gt; 0) {
			boardSearch.getPagination().processZero();
			boardList = boardDao.selectBoardList(boardSearch);
		}
		return boardList;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project의 main.jsp에 Pagination UI 수정하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. /src/main/webapp/WEB-INF/views/main/main.jsp 파일을 오픈하여 path에서 paging를 pagination으로 변경합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671378012201&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form:form modelAttribute=&quot;boardSearch&quot; autocomplete=&quot;off&quot;&amp;gt;
	&amp;lt;form:hidden path=&quot;pagination.pageNo&quot; /&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;form:select path=&quot;searchType&quot;&amp;gt;
			&amp;lt;form:option value=&quot;subject&quot; label=&quot;제목&quot; /&amp;gt;
			&amp;lt;form:option value=&quot;subjectandcontent&quot; label=&quot;제목+내용&quot; /&amp;gt;
		&amp;lt;/form:select&amp;gt;
		&amp;lt;form:select path=&quot;searchCondition&quot;&amp;gt;
			&amp;lt;form:option value=&quot;equal&quot; label=&quot;일치&quot; /&amp;gt;
			&amp;lt;form:option value=&quot;like&quot; label=&quot;포함&quot; /&amp;gt;
		&amp;lt;/form:select&amp;gt;
		&amp;lt;form:input path=&quot;searchKeyword&quot; placeholder=&quot;검색할 키워드를 입력하세요.&quot; /&amp;gt;
		&amp;lt;button id=&quot;searchBtn&quot; type=&quot;button&quot;&amp;gt;검색&amp;lt;/button&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;div class=&quot;search-result&quot;&amp;gt;
		&amp;lt;div&amp;gt;
			검색 결과 : ${boardSearch.pagination.recordTotalCount}건
		&amp;lt;/div&amp;gt;
		&amp;lt;div&amp;gt;
			&amp;lt;form:select path=&quot;pagination.recordCountPerPage&quot;&amp;gt;
				&amp;lt;form:option value=&quot;5&quot; label=&quot;5&quot; /&amp;gt;
				&amp;lt;form:option value=&quot;10&quot; label=&quot;10&quot; /&amp;gt;
				&amp;lt;form:option value=&quot;25&quot; label=&quot;25&quot; /&amp;gt;
				&amp;lt;form:option value=&quot;50&quot; label=&quot;50&quot; /&amp;gt;
				&amp;lt;form:option value=&quot;100&quot; label=&quot;100&quot; /&amp;gt;
			&amp;lt;/form:select&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/form:form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. pagination&amp;nbsp;UI를 수정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;페이지 &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;번호를 표시하는 JSTL의 반복문인 &amp;lt;c:forEach&amp;gt; 태그에서 begin 속성 값에 1 대신 boardSearch&amp;nbsp;객체에서 pagination 객체의 페이지 시작 번호(pageStartNo)로 변경하고 end 속성 값에 boardSearch&amp;nbsp;객체에서&amp;nbsp;paging 객체의 페이지 마지막 번호(pageLastNo) 대신&amp;nbsp;boardSearch&amp;nbsp;객체에서&amp;nbsp;pagination 객체의 페이지 종료 번호(pageEndNo)로 변경합니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px; color: #333333;&quot;&gt;전체 페이지 앞 번호는 &amp;lt;a&amp;gt; 태그로 생성하고 데이터 속성(data-pageno) 값에 1을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이전 페이지 사이즈 번호는 &amp;lt;a&amp;gt; 태그로 생성하고 데이터 속성(data-pageno) 값에는 페이지 시작 번호(pageStartNo)에서 1을 뺀 값을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;다음 페이지 사이즈 번호는 &amp;lt;a&amp;gt; 태그로 생성하고 데이터 속성(data-pageno) 값에는 페이지 종료 번호(pageEndNo)에서 1을 더한 값을 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;전체 페이지 마지막 번호는 &amp;lt;a&amp;gt; 태그로 생성하고 데이터 속성(data-pageno) 값에 페이지 마지막 번호(pageLastNo)를 추가합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추가한 &amp;lt;a&amp;gt; 태그들은 클릭 이벤트를 공통 처리하기 위해 href 속성은 void로 처리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1671378307705&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;c:if test=&quot;${not empty boardList}&quot;&amp;gt;
	&amp;lt;div&amp;gt;
		&amp;lt;ul id=&quot;boardPagination&quot; class=&quot;pagination&quot;&amp;gt;
			&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-first&quot; data-pageno=&quot;1&quot; href=&quot;javascript:void(0)&quot;&amp;gt;First&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-prev&quot; data-pageno=&quot;${boardSearch.pagination.pageStartNo - 1}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;&amp;amp;lt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;c:forEach var=&quot;page&quot; begin=&quot;${boardSearch.pagination.pageStartNo}&quot; end=&quot;${boardSearch.pagination.pageEndNo}&quot; step=&quot;1&quot;&amp;gt;
				&amp;lt;li class=&quot;page-item&amp;lt;c:if test=&quot;${boardSearch.pagination.pageNo == page}&quot;&amp;gt; active&amp;lt;/c:if&amp;gt;&quot;&amp;gt;
					&amp;lt;a class=&quot;page-link page-no&quot; data-pageno=&quot;${page}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;${page}&amp;lt;/a&amp;gt;
				&amp;lt;/li&amp;gt;
			&amp;lt;/c:forEach&amp;gt;
			&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-next&quot; data-pageno=&quot;${boardSearch.pagination.pageEndNo + 1}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;&amp;amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
			&amp;lt;li class=&quot;page-item&quot;&amp;gt;&amp;lt;a class=&quot;page-link page-last&quot; data-pageno=&quot;${boardSearch.pagination.pageLastNo}&quot; href=&quot;javascript:void(0)&quot;&amp;gt;Last&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
		&amp;lt;/ul&amp;gt;
	&amp;lt;/div&amp;gt;
&amp;lt;/c:if&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. &amp;lt;style&amp;gt; 태그에 페이지네이션 영역을 둥글게 라운드 하기 위해 CSS를 추가합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1671379572933&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.board ul.pagination li.page-item:first-child a.page-link { border-top-left-radius: 0.5em; border-bottom-left-radius: 0.5em; }
.board ul.pagination li.page-item:last-child a.page-link { border-top-right-radius: 0.5em; border-bottom-right-radius: 0.5em; }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Maven Spring Project를 실행하여 웹 브라우저로 확인하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. &quot;Servers&quot;탭에서 &quot;Tomcat9&quot;를 선택하고 &quot;start&quot;버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. 웹 브라우저에서 &quot;http://localhost:9000/index.do&quot;를 입력하고 페이지 크기를 10에서 5로 변경합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;1161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCAJZ/btrTRHmFhTj/RHZszLvNer6K1z2aVokKpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCAJZ/btrTRHmFhTj/RHZszLvNer6K1z2aVokKpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCAJZ/btrTRHmFhTj/RHZszLvNer6K1z2aVokKpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCAJZ%2FbtrTRHmFhTj%2FRHZszLvNer6K1z2aVokKpk%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;1674&quot; height=&quot;1161&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;1161&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러면 페이지네이션에 처음과 마지막 페이지로 이동하는 버튼과 이전/다음 페이지로 이동하는 버튼이 나타나는 것을 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그렇지만 현재 페이지 시작 번호(pageStartNo)가 1이기 때문에 이전 페이지 사이즈 번호는 0되고 페이지 종료 번호(pageEndNo)가 2이기 때문에 다음 페이지 사이즈 번호는 3이 되어 클릭 시 페이지 번호가 없어 오류가 발생할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그러나 Paging 클래스와 Pagination 클래스에서 현재 페이지 번호(pageNo)가 0 보다 작거나 같으면 1로 보정하고 페이지 마지막 번호(pageLastNo) 보다 크면 페이지 마지막 번호로 보정해 주기 때문에 오류가 발생하지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;이어서 페이지네이션에서 사용되는 이전 페이지 사이즈 번호와 다음 페이지 사이즈 번호를 내부에서 계산하고 버튼 활성화 여부도 처리하여 Script에서 처리 없이 사용할 수 있도록 하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Spring/Maven Project</category>
      <category>pagination</category>
      <category>Spring</category>
      <author>carrotweb</author>
      <guid isPermaLink="true">https://carrotweb.tistory.com/259</guid>
      <comments>https://carrotweb.tistory.com/259#entry259comment</comments>
      <pubDate>Sun, 25 Dec 2022 21:57:05 +0900</pubDate>
    </item>
  </channel>
</rss>