<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>불꽃놀이보고싶다</title>
    <link>https://jj-k-ul.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 29 Jul 2026 03:19:52 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>사용자가불꽃놀이좋아함</managingEditor>
    <image>
      <title>불꽃놀이보고싶다</title>
      <url>https://tistory1.daumcdn.net/tistory/3055016/attach/efb8935e22eb4d16923317c4e7a40fcc</url>
      <link>https://jj-k-ul.tistory.com</link>
    </image>
    <item>
      <title>INSERT + FOREIGN KEY 에러 테스트</title>
      <link>https://jj-k-ul.tistory.com/entry/INSERT-FOREIGN-KEY-%EC%97%90%EB%9F%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;이전 글: &lt;a href=&quot;https://jj-k-ul.tistory.com/entry/WMS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84-%EA%B8%B0%EC%B4%88-%E2%80%94-%EC%83%81%ED%92%88%C2%B7%EC%9E%AC%EA%B3%A0-%ED%85%8C%EC%9D%B4%EB%B8%94%EA%B3%BC-%EC%99%B8%EB%9E%98%ED%82%A4-%EC%A0%95%EB%A6%AC&quot;&gt;WMS DB 설계 기초&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h1&gt;WMS 데이터베이스 실습 — INSERT와 외래키 무결성 검증&lt;/h1&gt;
&lt;h2&gt;상품 등록 (INSERT)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO products (barcode, prod_name) VALUES (&amp;#39;1234&amp;#39;,&amp;#39;두쫀쿠&amp;#39;);  &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-25 오후 4.54.03.png&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9DEhg/dJMcadnv1oS/MXCbHVto1yLQLDRvZqEkxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9DEhg/dJMcadnv1oS/MXCbHVto1yLQLDRvZqEkxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9DEhg/dJMcadnv1oS/MXCbHVto1yLQLDRvZqEkxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9DEhg%2FdJMcadnv1oS%2FMXCbHVto1yLQLDRvZqEkxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;283&quot; height=&quot;53&quot; data-filename=&quot;스크린샷 2026-02-25 오후 4.54.03.png&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;재고 등록 (INSERT)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO inventory (barcode, quantity, location_code) VALUES (&amp;#39;1234&amp;#39;, 100, &amp;#39;A-1-1&amp;#39;);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-02-25 오후 4.53.47.png&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ohglY/dJMcaih5pmB/MzRLByMCfe90QqNfh6xQ1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ohglY/dJMcaih5pmB/MzRLByMCfe90QqNfh6xQ1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ohglY/dJMcaih5pmB/MzRLByMCfe90QqNfh6xQ1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FohglY%2FdJMcaih5pmB%2FMzRLByMCfe90QqNfh6xQ1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;58&quot; data-filename=&quot;스크린샷 2026-02-25 오후 4.53.47.png&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Foreign Key(외래키) 무결성 검증 — 에러 유발 테스트&lt;/h2&gt;
&lt;p&gt;존재하지 않는 바코드 &amp;#39;9999&amp;#39;로 재고 등록&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;INSERT INTO inventory (barcode, quantity, location_code) VALUES (&amp;#39;9999&amp;#39;, 50, &amp;#39;B-1-1&amp;#39;);&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;  에러 메시지&lt;/h3&gt;
&lt;p&gt;inventory 테이블을 만드는데 애러발생&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Cannot add or update a child row: a foreign key constraint fails (`wms_db`.`inventory`, CONSTRAINT `inventory_ibfk_1` FOREIGN KEY (`barcode`) REFERENCES `products` (`barcode`))&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;원인 분석&lt;/h3&gt;
&lt;p&gt;products 테이블에 &amp;#39;9999&amp;#39;라는 바코드를 가진 상품이 없으므로 inventory에 재고 넣을 수 없음&lt;/p&gt;
&lt;h2&gt;✅ 한 줄 정리&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;  FOREIGN KEY의 핵심 역할 - 데이터 무결성(Data Integrity) 보장&lt;/strong&gt;&lt;/p&gt;</description>
      <category>DB _ SQL</category>
      <category>DB설계</category>
      <category>foreignkey</category>
      <category>insert</category>
      <category>sql</category>
      <category>데이터무결성</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/77</guid>
      <comments>https://jj-k-ul.tistory.com/entry/INSERT-FOREIGN-KEY-%EC%97%90%EB%9F%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8#entry77comment</comments>
      <pubDate>Wed, 25 Feb 2026 17:05:58 +0900</pubDate>
    </item>
    <item>
      <title>WMS 데이터베이스 설계 기초 &amp;mdash; 상품&amp;middot;재고 테이블과 외래키 정리</title>
      <link>https://jj-k-ul.tistory.com/entry/WMS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84-%EA%B8%B0%EC%B4%88-%E2%80%94-%EC%83%81%ED%92%88%C2%B7%EC%9E%AC%EA%B3%A0-%ED%85%8C%EC%9D%B4%EB%B8%94%EA%B3%BC-%EC%99%B8%EB%9E%98%ED%82%A4-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;h1&gt;WMS의 기초가 되는 데이터베이스 설계(Database Schema Design)&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;WMS(Warehouse Management System, 창고관리시스템)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;어떤 물건이 어디에 있고, 어디로 가야 하는가?&amp;quot;&lt;/strong&gt; 를 관리하는 시스템&lt;br&gt;창고 안으로 들어오는 물건(입고)과 나가는 물건(출고)의 &lt;strong&gt;정보&lt;/strong&gt;를 체계적으로 관리&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;주요 기능&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;입고 / 출고 관리&lt;/li&gt;
&lt;li&gt;재고 위치 최적화 (Slotting)&lt;/li&gt;
&lt;li&gt;유통기한 관리&lt;/li&gt;
&lt;li&gt;재고 실사&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;개발 관점에&lt;/strong&gt;&lt;br&gt;바코드, RFID 등을 활용해 재고 정확도를 100%에 가깝게 유지하고, 동선을 효율화하는 로직이 중요&lt;br&gt;목표: &lt;strong&gt;재고 가시성 확보&lt;/strong&gt;및 &lt;strong&gt;물류 비용 절감&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;상품(Product) 테이블 설계&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE products (
    prod_id  INT AUTO_INCREMENT PRIMARY KEY,  -- 숫자, 자동 증가 (1, 2, 3...)
    barcode  VARCHAR(50),                      -- 바코드 번호 (최대 50자)
    prod_name VARCHAR(100)                     -- 상품명 (최대 100자)
);&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt; ️ PRIMARY KEY (기본키) VS   UNIQUE (고유키)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;중복을 허용하지 않는다&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;PRIMARY KEY (기본키)&lt;/th&gt;
&lt;th&gt;UNIQUE (고유키)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;개수&lt;/td&gt;
&lt;td&gt;테이블당 &lt;strong&gt;1개만&lt;/strong&gt; 가능&lt;/td&gt;
&lt;td&gt;여러 개 설정 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NULL 허용&lt;/td&gt;
&lt;td&gt;❌ Not Null&lt;/td&gt;
&lt;td&gt;✅ Null 허용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;td&gt;행(Row)을 대표하는 식별자&lt;/td&gt;
&lt;td&gt;아이디, 이메일, 전화번호 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비유&lt;/td&gt;
&lt;td&gt;조직의 유일무이한 두목&lt;/td&gt;
&lt;td&gt;행동대장&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;  CHAR (고정 길이) VS   VARCHAR (가변 길이)&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;CHAR(10)&lt;/th&gt;
&lt;th&gt;VARCHAR(10)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;저장 방식&lt;/td&gt;
&lt;td&gt;3글자 넣어도 10칸 전부 차지 (나머지는 공백)&lt;/td&gt;
&lt;td&gt;3글자 넣으면 3칸만 차지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;공간 효율&lt;/td&gt;
&lt;td&gt;낮음 (낭비 발생)&lt;/td&gt;
&lt;td&gt;높음 (알뜰살뜰)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;검색 속도&lt;/td&gt;
&lt;td&gt;약간 더 빠름&lt;/td&gt;
&lt;td&gt;크기 계산이 필요해 상대적으로 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;용도&lt;/td&gt;
&lt;td&gt;주민번호, 성별(M/F), 국가코드&lt;/td&gt;
&lt;td&gt;이름, 주소, 게시글 제목&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WMS 예시&lt;/td&gt;
&lt;td&gt;창고 구역 코드 (길이가 고정된 데이터)&lt;/td&gt;
&lt;td&gt;상품명 (길이가 제각각)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;길이가 항상 일정하면 &lt;code&gt;CHAR&lt;/code&gt;, 길이가 들쭉날쭉하면 &lt;code&gt;VARCHAR&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;재고(Inventory) 테이블 설계&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;CREATE TABLE inventory (
    inv_id        INT AUTO_INCREMENT PRIMARY KEY,
    barcode       VARCHAR(50),
    quantity      INT DEFAULT 0,          -- 숫자로 지정하고 기본 값은 0 
    location_code VARCHAR(20),            -- 창고 내 위치 (예: A-1-1)
    FOREIGN KEY (barcode) REFERENCES products(barcode)
    -- inventory의 barcode는 반드시 products 테이블에 존재해야 한다
);&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;⛓️ FOREIGN KEY와 데이터 무결성&lt;/h3&gt;
&lt;p&gt;FOREIGN KEY(외래키)는 &lt;strong&gt;부모-자식 관계&lt;/strong&gt;를 통해 데이터 무결성을 보장&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;products 테이블 (부모)
    └── inventory 테이블 (자식)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;inventory에 barcode를 입력하려고 할 때 -&amp;gt; products 테이블 barcode 자동으로 검문&lt;br&gt;부모 테이블 products에 존재하지 않는 barcode면 에러처리&lt;/p&gt;
&lt;h3&gt;ON DELETE / ON UPDATE 옵션&lt;/h3&gt;
&lt;p&gt;부모 테이블 products에서 바코드를 삭제하거나 수정하려고 하면 ??&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;옵션&lt;/th&gt;
&lt;th&gt;동작&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RESTRICT&lt;/strong&gt; (기본값)&lt;/td&gt;
&lt;td&gt;부모의 삭제와 수정을 막음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CASCADE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;부모-&amp;gt; 삭제/수정, 자식-&amp;gt; 함께 삭제/수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SET NULL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;부모가 삭제되면 자식의 해당 컬럼을 NULL로 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;사용 예시&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FOREIGN KEY (barcode) REFERENCES products(barcode)
    ON DELETE CASCADE   -- 부모(products) 삭제 시 자식(inventory)도 삭제
    ON UPDATE RESTRICT  -- 부모(products) 수정 불가 ❌
);&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;FOREIGN KEY 설정 실패&lt;/h2&gt;
&lt;h3&gt;  에러 메시지&lt;/h3&gt;
&lt;p&gt;inventory 테이블을 만드는데 애러발생&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Failed to add the foreign key constraint.
Missing unique key for constraint &amp;#39;inventory_ibfk_1&amp;#39; in the referenced table &amp;#39;products&amp;#39;
-&amp;gt; 참조하려는 부모(products)의 바코드에 &amp;#39;UNIQUE(유일함)&amp;#39; 보장이 없어서 연결할 수 없음&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;원인 분석&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;참조할 대상(부모)은 반드시 유일해야 한다.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;FOREIGN KEY로 참조하려는 컬럼(&lt;code&gt;products.barcode&lt;/code&gt;)에 &lt;code&gt;UNIQUE&lt;/code&gt; 또는 &lt;code&gt;PRIMARY KEY&lt;/code&gt; 설정이 안 되어 있다면&lt;br&gt;같은 바코드가 여러 행에 존재할 수 있음&lt;/p&gt;
&lt;h3&gt;해결 방법&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ALTER TABLE products ADD UNIQUE (barcode);
-- products 테이블 수정할건데
-- barcode에 UNIQUE 규칙을 추가할거야&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;구조 확인&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;DESC products;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;✅ 한 줄 정리&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PRIMARY KEY&lt;/strong&gt;:  테이블의 대표 식별자, 딱 1개, NULL 불가&lt;br&gt;&lt;strong&gt;UNIQUE&lt;/strong&gt;: 중복 불가, 여러 개 설정 가능, NULL 허용&lt;br&gt;&lt;strong&gt;CHAR vs VARCHAR&lt;/strong&gt;: 고정 길이 vs 가변 길이, WMS에선 구역 코드엔 CHAR, 상품명엔 VARCHAR&lt;br&gt;&lt;strong&gt;FOREIGN KEY&lt;/strong&gt;: 부모-자식 관계로 데이터 무결성 보장&lt;br&gt;&lt;strong&gt;ON DELETE/UPDATE&lt;/strong&gt;: CASCADE(연쇄), RESTRICT(차단), SET NULL(무효화)&lt;/p&gt;</description>
      <category>DB _ SQL</category>
      <category>DB설계</category>
      <category>foreignkey</category>
      <category>mysql</category>
      <category>primarykey</category>
      <category>데이터베이스설계</category>
      <category>물류시스템</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/76</guid>
      <comments>https://jj-k-ul.tistory.com/entry/WMS-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%84%A4%EA%B3%84-%EA%B8%B0%EC%B4%88-%E2%80%94-%EC%83%81%ED%92%88%C2%B7%EC%9E%AC%EA%B3%A0-%ED%85%8C%EC%9D%B4%EB%B8%94%EA%B3%BC-%EC%99%B8%EB%9E%98%ED%82%A4-%EC%A0%95%EB%A6%AC#entry76comment</comments>
      <pubDate>Wed, 25 Feb 2026 16:13:51 +0900</pubDate>
    </item>
    <item>
      <title>VS Code + Spring Boot CRUD 만들어보기</title>
      <link>https://jj-k-ul.tistory.com/entry/VS-Code-Spring-Boot-CRUD-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0</link>
      <description>&lt;h1&gt;VS Code에서 Spring Initializr로 프로젝트 만들기&lt;/h1&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;명령 팔레트 열기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윈도우: &lt;code&gt;Ctrl + Shift + P&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;맥: &lt;code&gt;Cmd + Shift + P&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Spring Initializr: Create a Gradle Project...&lt;/code&gt; (또는 Maven Project) 검색 후 선택&lt;/li&gt;
&lt;li&gt;엔터엔터 선택
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spring Boot 버전&lt;/li&gt;
&lt;li&gt;Language: Java&lt;/li&gt;
&lt;li&gt;Group Id, Artifact Id&lt;/li&gt;
&lt;li&gt;Build Tool: Maven / Gradle&lt;/li&gt;
&lt;li&gt;Dependencies: Spring Web, Spring Data JPA, H2 혹은 MySQL 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;a href=&quot;https://start.spring.io/&quot;&gt;Spring Initializr&lt;/a&gt;에서 설정 다운로드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정들을 웹에서 선택 &amp;gt; GENERATE 버튼 &amp;gt; ZIP 다운로드 &amp;gt; VS Code에서 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Maven&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Java 프로젝트용 &lt;b&gt;빌드 도구&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;라이브러리(의존성) 관리, 컴파일, 패키징(JAR/WAR) 등을 자동으로 수행&lt;/li&gt;
&lt;li&gt;npm (JavaScript) = Maven (Java)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;pom.xml&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Maven 프로젝트의 &lt;b&gt;설정 파일&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&amp;asymp;&amp;asymp;&amp;asymp; &lt;b&gt;package.json&lt;/b&gt; 와 비슷 (어떻게 빌드할지)&lt;br /&gt;├── 프로젝트 정보 (이름, 버전 등)&lt;br /&gt;├── 어떤 라이브러리를 쓸지 (dependencies)&lt;br /&gt;├── 어떤 플러그인을 쓸지&lt;br /&gt;└── 빌드 방법 (빌드 라이프사이클 설정)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;!-- pom.xml 예시 일부 --&amp;gt;
&amp;lt;project&amp;gt;
  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;

  &amp;lt;groupId&amp;gt;com.example&amp;lt;/groupId&amp;gt;
  &amp;lt;artifactId&amp;gt;demo&amp;lt;/artifactId&amp;gt;
  &amp;lt;version&amp;gt;0.0.1-SNAPSHOT&amp;lt;/version&amp;gt;

  &amp;lt;dependencies&amp;gt;
    &amp;lt;!-- 여기 안에 spring-boot-starter-web 같은 의존성들이 들어감 --&amp;gt;
  &amp;lt;/dependencies&amp;gt;
&amp;lt;/project&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;의존성(라이브러리) 추가하는 방법&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;VS Code &amp;gt; 명령 팔레트 &amp;gt; Maven: Add a Dependency... 사용 (편의 기능)&lt;/li&gt;
&lt;li&gt;pom.xml 직접 수정 (정석)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mvnrepository.com/&quot;&gt;Maven Central Repository&lt;/a&gt; 에서 검색 후 XML 코드 복사, pom.xml 붙여넣기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;빌드 명령: mvn clean install&lt;/h2&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;mvn clean install &amp;asymp;&amp;asymp;&amp;asymp; npm install + 빌드까지 한 번에 돌린 느낌
// clean -&amp;gt; 이전 빌드 삭제
// 새로 빌드
// install -&amp;gt; 프로젝트 컴파일 + 테스트 + 패키징(JAR 생성)
// 로컬 저장소에 배포&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&amp;nbsp;&lt;/th&gt;
&lt;th&gt;React(npm)&lt;/th&gt;
&lt;th&gt;Java(Maven)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;라이브러리 정의 파일&lt;/td&gt;
&lt;td&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pom.xml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;라이브러리 추가 방식&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install ***&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;...&amp;lt;/dependency&amp;gt; XML 추가&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;설치 및 반영&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mvn clean install&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>Java _ Spring</category>
      <category>crud</category>
      <category>spring boot</category>
      <category>vs code</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/75</guid>
      <comments>https://jj-k-ul.tistory.com/entry/VS-Code-Spring-Boot-CRUD-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B4%EA%B8%B0#entry75comment</comments>
      <pubDate>Tue, 17 Feb 2026 03:08:57 +0900</pubDate>
    </item>
    <item>
      <title>JavaScript Map vs Java HashMap</title>
      <link>https://jj-k-ul.tistory.com/entry/JavaScript-Map-vs-Java-HashMap</link>
      <description>&lt;h1&gt;JavaScript Map vs Java HashMap&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;JavaScript: Map 기본 사용법&lt;/h2&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;const userMap = new Map();

// 데이터 추가
userMap.set('name', '길동');
userMap.set('age', 19);

// 데이터 조회
userMap.get('name');  // '길동'

// 존재 확인 및 크기
userMap.has('name');  // true
userMap.size;         // 2&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Java: HashMap 기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 차이점: &lt;b&gt;Map -&amp;gt; 인터페이스, HashMap -&amp;gt; Map을 구현한 클래스 -&amp;gt; 세트&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;// 타입 지정 + 구현체 선택 -&amp;gt; Map 타입인데  HashMap으로 만들겠다
Map&amp;lt;String, Object&amp;gt; userMap = new HashMap&amp;lt;&amp;gt;();
HashMap&amp;lt;String, Object&amp;gt; userMap = new HashMap&amp;lt;&amp;gt;();

// 데이터 추가
userMap.put(&quot;name&quot;, &quot;길동&quot;);
userMap.put(&quot;age&quot;, 19);

// 데이터 조회
userMap.get(&quot;name&quot;);          // &quot;길동&quot;

// 존재 확인 및 크기
userMap.containsKey(&quot;name&quot;);  // true
userMap.size();               // 2 (메서드 호출)&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;메서드 비교&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;기능&lt;/th&gt;
&lt;th&gt;JavaScript&lt;/th&gt;
&lt;th&gt;Java&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;추가&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set(key, value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;put(key, value)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;조회&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get(key)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get(key)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;존재 확인&lt;/td&gt;
&lt;td&gt;&lt;code&gt;has(key)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;containsKey(key)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;크기&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size&lt;/code&gt; (프로퍼티)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;size()&lt;/code&gt; (메서드)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;반복문 비교&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JavaScript: forEach 사용&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const users = new Map();
users.set('user1', { name: '철수', age: 30 });
users.set('user2', { name: '영희', age: 25 });

users.forEach((value, key) =&amp;gt; {
  console.log(key, value);
});&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Java: for-each 사용&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Map&amp;lt;String, User&amp;gt; users = new HashMap&amp;lt;&amp;gt;();
users.put(&quot;user1&quot;, new User(&quot;철수&quot;, 30));
users.put(&quot;user2&quot;, new User(&quot;영희&quot;, 25));

for (String key : users.keySet()) {
  System.out.println(key + &quot;: &quot; + users.get(key));
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Spring Repository 패턴&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class StudentRepository {
  // 필드: 클래스 안에 선언된 변수
  // ⚛️ React -&amp;gt; useRef / useState처럼 호출마다 사라지지 않고 유지됨
  private final Map&amp;lt;String, Student&amp;gt; studentMap = new HashMap&amp;lt;&amp;gt;();

  public void save(Student student) {
    studentMap.put(student.getName(), student);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;save 함수 실행 과정&lt;/h3&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;// 1. Repository 필드 선언 (컴포넌트 상태처럼 유지됨)
private final StudentRepository studentRepository;

// 2. Student 객체 생성 (저장할 실제 데이터)
Student student = new Student(
  studentInfoDto.getName(), 
  studentInfoDto.getAge(), 
  studentInfoDto.getAddress()
);

// 3. Repository에 저장
studentRepository.save(student);&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 한 줄 정리:&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript -&amp;gt; Map 하나로 끝&lt;br /&gt;Java -------&amp;gt; Map: (설계도) + HashMap: (실제 구현체), &amp;lt;Key타입, Value타입&amp;gt; 필수&lt;/p&gt;</description>
      <category>Java _ Spring</category>
      <category>HashMap</category>
      <category>Java</category>
      <category>javascript</category>
      <category>map</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/74</guid>
      <comments>https://jj-k-ul.tistory.com/entry/JavaScript-Map-vs-Java-HashMap#entry74comment</comments>
      <pubDate>Mon, 16 Feb 2026 17:37:44 +0900</pubDate>
    </item>
    <item>
      <title>Spring Service DTO 실습: private final getter 정리</title>
      <link>https://jj-k-ul.tistory.com/entry/Spring-Service-DTO-%EC%8B%A4%EC%8A%B5-private-final-getter-%EC%A0%95%EB%A6%AC</link>
      <description>&lt;h1&gt;Spring Service DTO 실습: private final getter 정리&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;프론트엔드 → 백엔드 전환 !&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;  DTO: Data Transfer Object&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;application/dto/StudentDto.java (데이터 상자)&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class StudentDto {
    //  String(타입) name(변수명)
    private String name;        // 문자열 학생 이름 변수
    private int studentNumber;  // 숫자 학번 변수

    public String getName() { // getter/setter
        return name;
    }    
    public void setName(String name) {
        this.name = name;  // 검증 로직 추가 가능
    }

    // Entity와 필드 다를 수 있음 (보안용)
    // 예: Entity엔 password도 있지만 DTO엔 제외
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;private&lt;/code&gt; -&amp;gt; 이 변수는 나만 쓸 거야!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스 &lt;strong&gt;내부&lt;/strong&gt;에서는 자유롭게 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;외부&lt;/strong&gt;에서는 &lt;strong&gt;직접 접근 불가&lt;/strong&gt; (getter/setter로만)&lt;/li&gt;
&lt;li&gt;실수로 외부에서 함부로 바꾸는 것 방지 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;getter/setter 개념&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;public class StudentDto {
    private String name;  // ❌ 다른 파일에서 직접 접근 불가!

    //   getter 함수: &amp;quot;name 값을 보여줘!&amp;quot;
    public String getName() {
        return name;
    }
}
StudentDto student = new StudentDto();
// student.name = &amp;quot;홍길동&amp;quot;;  // ❌ 컴파일 에러!
String name = student.getName();  // ✅ 가능! getter로만 접근&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;⚛️ React&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;const [name, setName] = useState&amp;lt;string&amp;gt;(&amp;quot;&amp;quot;);  
name        // Getter 역할
setName()   // Setter 역할
const student = { name: &amp;quot;홍길동&amp;quot; };
console.log(student.name);  // ✅ 직접 접근 OK

Java: 직접 접근 불가 → 함수로만!
StudentDto student = new StudentDto();
student.getName()  // Getter ✅ 함수로만 접근
student.setName()  // Setter ✅ 함수로만 접근&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;React&lt;/th&gt;
&lt;th&gt;Java&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;student.name&lt;/td&gt;
&lt;td&gt;student.getName()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setName(value)&lt;/td&gt;
&lt;td&gt;student.setName(value)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;application/service/StudentService.java&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class StudentService {
    // 접근제한 + 불변
    private final StudentRepository repo;

    public StudentDto create(StudentDto dto) {
        // 검증 로직
        if (dto.getName() == null) throw new IllegalArgumentException(&amp;quot;이름 필수&amp;quot;);

        Student entity = new Student(dto.getName(), dto.getStudentNumber());
        repo.save(entity);
        return new StudentDto(entity); // DTO 변환
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;final&lt;/code&gt; -&amp;gt; 절대 바꾸지 않아!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스 &lt;strong&gt;내부&lt;/strong&gt;에서는 자유롭게 사용&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;외부&lt;/strong&gt;에서는 &lt;strong&gt;직접 접근 불가&lt;/strong&gt; (getter/setter로만)&lt;/li&gt;
&lt;li&gt;실수로 외부에서 함부로 바꾸는 것 방지 ✅&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;private vs final 차이 비교&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;final&lt;/code&gt; -&amp;gt; 값 바꾸기 방지&lt;br&gt;&lt;code&gt;private&lt;/code&gt; -&amp;gt; 직접 접근 방지&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;키워드&lt;/th&gt;
&lt;th&gt;목적&lt;/th&gt;
&lt;th&gt;비유&lt;/th&gt;
&lt;th&gt;코드 예시&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;private&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;외부에서 직접 접근 차단&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;집 안 물건, 문 잠금&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;student.name = &amp;quot;김철수&amp;quot;&lt;/code&gt; ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;final&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;한 번 설정 후 값 변경 차단&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;quot;접착제로 붙인 라벨&amp;quot;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;repo = 다른Repo&lt;/code&gt; ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;public (없거나 public일 때)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;외부에서 직접 접근 가능!&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class StudentDto {
    public String name;        // ✅ 직접 접근 가능
    public int studentNumber;  // ✅ 직접 접근 가능
}

StudentDto student = new StudentDto();
student.name = &amp;quot;홍길동&amp;quot;;          // ✅ OK!
System.out.println(student.name); // ✅ OK!&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;✅ 한 줄 정리:&lt;/h2&gt;
&lt;p&gt;private -------&amp;gt; 안 보여줄래 (캡슐화)&lt;br&gt;final ---------&amp;gt; 바꾸지 않을래 (불변성)&lt;br&gt;getter/setter -&amp;gt; 필요할 때만 보여줄래&lt;br&gt;Service -------&amp;gt; 검증 + 비즈니스 로직 처리&lt;/p&gt;</description>
      <category>Java _ Spring</category>
      <category>DTO</category>
      <category>getter</category>
      <category>private</category>
      <category>react</category>
      <category>setter</category>
      <category>spring</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/73</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Spring-Service-DTO-%EC%8B%A4%EC%8A%B5-private-final-getter-%EC%A0%95%EB%A6%AC#entry73comment</comments>
      <pubDate>Mon, 16 Feb 2026 16:11:50 +0900</pubDate>
    </item>
    <item>
      <title>Spring Service와 DTO 역할</title>
      <link>https://jj-k-ul.tistory.com/entry/Spring-Service%EC%99%80-DTO-%EC%97%AD%ED%95%A0</link>
      <description>&lt;h1&gt;Spring Service와 DTO 역할: 계층별 폴더 구조 정리&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Service와 DTO 핵심 역할&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Service&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;업무 규칙, 비즈니스 흐름 담당&lt;/li&gt;
&lt;li&gt;예외처리, 데이터 저장/조회, 입력값 검증 로직&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DTO (Data Transfer Object)&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;&quot;데이터 상자&quot; 역할&lt;/li&gt;
&lt;li&gt;계층 간 데이터 운반 (Controller &amp;harr; Service)&lt;/li&gt;
&lt;li&gt;Entity와 분리해 보안/성능 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  권장 폴더 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;src/main/java/com/example/&lt;/b&gt;&lt;br /&gt;│&lt;br /&gt;├── application/ # 유즈케이스 (기능별 로직)&lt;br /&gt;│ ├── service/ # Service (선생님: 어떻게 처리할지 담당)&lt;br /&gt;│ └── dto/ # DTO (이름,나이,번호 정보만 전달)&lt;br /&gt;│&lt;br /&gt;├── domain/ # 도메인 규칙, Entity (학교)&lt;br /&gt;│ └── entity/ # 이름/번호로 구분되는 핵심 데이터 (사람,반)&lt;br /&gt;└── repository/ # 데이터 저장/조회 (DB 접근)&lt;/p&gt;</description>
      <category>Java _ Spring</category>
      <category>DDD 계층</category>
      <category>Java</category>
      <category>spring</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/72</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Spring-Service%EC%99%80-DTO-%EC%97%AD%ED%95%A0#entry72comment</comments>
      <pubDate>Mon, 16 Feb 2026 14:27:36 +0900</pubDate>
    </item>
    <item>
      <title>[React] html-react-parser</title>
      <link>https://jj-k-ul.tistory.com/entry/React-html-react-parser</link>
      <description>&lt;h1&gt;html-react-parser 안전하게 HTML 렌더링&lt;/h1&gt;
&lt;p&gt;서버에서 받아온 HTML 태그가 포함된 문자열을 화면에 그대로 렌더링해야 할 때 -&amp;gt; &lt;code&gt;dangerouslySetInnerHTML&lt;/code&gt; 사용한다&lt;/p&gt;
&lt;h2&gt;dangerouslySetInnerHTML&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const App = () =&amp;gt; {
const htmlString = `&amp;lt;p&amp;gt;!! 나는 &amp;lt;strong&amp;gt;위험한&amp;lt;/strong&amp;gt; 속성이다 !!&amp;lt;/p&amp;gt;`;

  return (
      &amp;lt;div dangerouslySetInnerHTML={{ __html: htmlString }} /&amp;gt;
  );
};

export default App;&lt;/code&gt;&lt;/pre&gt;&lt;h1&gt;dangerouslySetInnerHTML 사용을 지양해야 하는 이유&lt;/h1&gt;
&lt;p&gt;React는 &lt;strong&gt;XSS(Cross-Site Scripting)&lt;/strong&gt; 공격을 방지하기 위해 렌더링 과정에서 HTML 이스케이프(Escape) 처리를 한다&lt;br&gt;HTML이나 JavaScript 코드가 컴포넌트에 삽입되는 것을 제한하는 React의 보호 기능을 무시하고&lt;br&gt;dangerouslySetInnerHTML를 사용하면 강제로 HTML 직접 삽입&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;공격!&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;React 기본 기능은 위 스크립트를 &lt;strong&gt;문자열&lt;/strong&gt;로 받지만 &amp;quot;&amp;lt; script &amp;gt;공격!&amp;lt; /script &amp;gt;&amp;quot;&lt;br&gt;⚠️ dangerouslySetInnerHTML를 쓰면 문자열로 받지 않고 script로 들어와 코드가 실행된다&lt;br&gt;이런 위험이 있으므로 말그대로 &lt;strong&gt;&amp;#39;위험(dangerous)&amp;#39;&lt;/strong&gt; 해진다&lt;/p&gt;
&lt;h2&gt;html-react-parser 사용&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.npmjs.com/package/html-react-parser&quot;&gt;html-react-parser&lt;/a&gt;&lt;br&gt;dangerouslySetInnerHTML를 사용하다가 보안상의 이슈로 &lt;strong&gt;&lt;code&gt;html-react-parser&lt;/code&gt;&lt;/strong&gt; 라이브러리 사용&lt;/p&gt;
&lt;h3&gt;✅ html-react-parser 장점&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;컴포넌트 변환:&lt;/strong&gt; 문자열 주입❌, HTML을 리액트 엘리먼트로 파싱하여 변환&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;안전한 렌더링:&lt;/strong&gt; 필요한 경우 특정 태그를 필터링하거나 리액트의 라이프사이클 안에서 안전하게 렌더링을 제어 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;  라이브러리 설치&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;npm install html-react-parser
npm install @types/html-react-parser

yarn add html-react-parser
yarn add @types/html-react-parser&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;간단 사용법&lt;/h3&gt;
&lt;p&gt;parse() 함수를 사용하여 HTML을 동적으로 렌더링할 수 있다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import parse from &amp;#39;html-react-parser&amp;#39;;

const App = () =&amp;gt; {
  const htmlString = `
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;!! Hello !! World !!&amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
  `;

  return (
    &amp;lt;div&amp;gt;
      {parse(htmlString)}
    &amp;lt;/div&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;</description>
      <category>React</category>
      <category>dangerouslySetInnerHTML</category>
      <category>html-react-parser</category>
      <category>react</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/71</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-html-react-parser#entry71comment</comments>
      <pubDate>Fri, 20 Sep 2024 13:25:50 +0900</pubDate>
    </item>
    <item>
      <title>[React] clsx 라이브러리</title>
      <link>https://jj-k-ul.tistory.com/entry/React-clsx-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 이름을 조건부로 병합하거나 동적으로 관리할때 사용&lt;/p&gt;
&lt;figure id=&quot;og_1726725605687&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;clsx&quot; data-og-description=&quot;A tiny (239B) utility for constructing className strings conditionally.. Latest version: 2.1.1, last published: 5 months ago. Start using clsx in your project by running &amp;#96;npm i clsx&amp;#96;. There are 10443 other projects in the npm registry using clsx.&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/clsx&quot; data-og-url=&quot;https://www.npmjs.com/package/clsx&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oIZLn/hyW6CUbuX3/zRywXVl2sZtbBrlL4MBl90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/clsx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/clsx&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oIZLn/hyW6CUbuX3/zRywXVl2sZtbBrlL4MBl90/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;clsx&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A tiny (239B) utility for constructing className strings conditionally.. Latest version: 2.1.1, last published: 5 months ago. Start using clsx in your project by running `npm i clsx`. There are 10443 other projects in the npm registry using clsx.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라이브러리 install&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1726725722382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install clsx

yarn add clsx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1726725435866&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import clsx from 'clsx';

function Button({ isPrimary, isDisabled, onClickEvent, text }) {
  const className = clsx('btn', {
    'btn-primary': isPrimary,
    'btn-disabled': isDisabled,
  });

  return(
  	&amp;lt;button
      type=&quot;button&quot;
      onClick={onClickEvent}
      className={className}
    &amp;gt;
      {text}
    &amp;lt;/button&amp;gt;
);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isPrimary가 true -&amp;gt; btn-primary 클래스 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isDisabled가 true -&amp;gt; btn-disabled 클래스가 추가&lt;/p&gt;
&lt;pre id=&quot;code_1726724170807&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;li className={clsx({ [style.show]:
				(step &amp;gt; 1 &amp;amp;&amp;amp; step &amp;lt; 5) || step === 9 },
				{ [style.selected]: step &amp;gt; 2 })}
&amp;gt;
  &amp;lt;button type=&quot;button&quot;&amp;gt;
    &amp;lt;span className={style.icon_box}&amp;gt;
      &amp;lt;Icon name=&quot;calendar_line&quot; color=&quot;purple&quot; /&amp;gt;
    &amp;lt;/span&amp;gt;
    &amp;lt;span className={style.title}&amp;gt;시작&amp;lt;/span&amp;gt;
    &amp;lt;span className={style.text_box}&amp;gt;
      &amp;lt;Icon name=&quot;arrow_right&quot; color=&quot;black&quot; size={20} /&amp;gt;
    &amp;lt;/span&amp;gt;
  &amp;lt;/button&amp;gt;
&amp;lt;/li&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;style.show가 적용되는 조건 -&amp;gt; step &amp;gt; 1 &amp;amp;&amp;amp; step &amp;lt; 5 이거나 step === 9 일때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step이 3 이상일 때 -&amp;gt; style.selected 클래스가 적용&lt;/p&gt;</description>
      <category>React</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/70</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-clsx-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC#entry70comment</comments>
      <pubDate>Thu, 19 Sep 2024 15:08:39 +0900</pubDate>
    </item>
    <item>
      <title>[React] useOutletContext로 props 전달</title>
      <link>https://jj-k-ul.tistory.com/entry/React-useOutletContext%EB%A1%9C-props-%EC%A0%84%EB%8B%AC</link>
      <description>&lt;h1&gt;[React] useOutletContext: 중첩 라우트(Outlet)에서 자식에게 props 전달하기&lt;/h1&gt;
&lt;p&gt;부모 레이아웃의 상태를 자식 컴포넌트에게 전달해야 할 때&lt;br&gt;Props Drilling을 피하고 깔끔하게 데이터를 공유할 수 있는 &lt;strong&gt;useOutletContext&lt;/strong&gt; 사용&lt;br&gt;useOutletContext -&amp;gt; &lt;strong&gt;&amp;quot;특정 라우트 트리(Route Tree) 안에서의 미니 전역 상태 관리&amp;quot;&lt;/strong&gt;&lt;br&gt;  Props Drilling&lt;br&gt;부모의 상태를 저~~ 밑에 있는 자식에게 전달하기 위해 여러 단계를 거치는 현상&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;라우터 설정 (Router Setup)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;import { createBrowserRouter } from &amp;#39;react-router-dom&amp;#39;;

export default createBrowserRouter([
  {
    path: &amp;#39;&amp;#39;,
    element: [&amp;lt;MainLayout /&amp;gt;],
    errorElement: &amp;lt;ErrorPage /&amp;gt;,
    children: [
      {
        path: &amp;#39;/home&amp;#39;,
        element: &amp;lt;Home /&amp;gt;,
      },
      {
        path: &amp;#39;/work&amp;#39;,
        element: &amp;lt;WorkLayout /&amp;gt;,
        children: [
          { path: &amp;#39;&amp;#39;, element: &amp;lt;WorkList /&amp;gt; },
          { path: &amp;#39;:workId&amp;#39;, element: &amp;lt;WorkDetail /&amp;gt; },
        ],
      },
    ],
  },
]);&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;부모 컴포넌트: 데이터 전달 (Outlet context)&lt;/h2&gt;
&lt;h3&gt;WorkLayout.tsx&lt;/h3&gt;
&lt;p&gt;태그에 &lt;strong&gt;context&lt;/strong&gt; 속성을 사용하여 전달하고 싶은 데이터 넣는다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { Outlet } from &amp;#39;react-router-dom&amp;#39;;

function WorkLayout() {
    const [workList, setWorkList] = useState&amp;lt;workListItem[]&amp;gt;([]);
    return (
        &amp;lt;&amp;gt;
            &amp;lt;Outlet context={{ workList }} /&amp;gt;
        &amp;lt;/&amp;gt;
    );
}

export default WorkLayout;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;자식 컴포넌트: 데이터 사용 (useOutletContext)&lt;/h2&gt;
&lt;h3&gt;WorkList.tsx&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;useOutletContext&lt;/strong&gt; 훅을 사용하여 부모가 보낸 데이터를 가져온다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { useOutletContext } from &amp;#39;react-router-dom&amp;#39;;

function WorkList() {
    const [workList, setWorkList] = useOutletContext&amp;lt;workListItem[]&amp;gt;([]);
    return (
        &amp;lt;div&amp;gt;
            {workList?.map((item, index) =&amp;gt; (
                &amp;lt;p key={index}&amp;gt;
                    {item}
                &amp;lt;/p&amp;gt;
            ))}
        &amp;lt;/div&amp;gt;
    );
}
export default WorkList;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;✅ 한 줄 정리:&lt;/h2&gt;
&lt;p&gt;Props Drilling: 나는 안 쓰는데 내 자식 주려고 보따리 &lt;strong&gt;들고 있는&lt;/strong&gt; 상태&lt;br&gt;useOutletContext: 부모가 &lt;strong&gt;던져준&lt;/strong&gt; 보따리를 자식이 필요할 때 바로 꺼내 쓰는 도구&lt;/p&gt;</description>
      <category>React</category>
      <category>outlet</category>
      <category>react</category>
      <category>useoutletcontext</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/69</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-useOutletContext%EB%A1%9C-props-%EC%A0%84%EB%8B%AC#entry69comment</comments>
      <pubDate>Fri, 30 Aug 2024 11:23:17 +0900</pubDate>
    </item>
    <item>
      <title>[Python] pip error: externally-managed-environment</title>
      <link>https://jj-k-ul.tistory.com/entry/Python-pip-error-externally-managed-environment</link>
      <description>&lt;pre id=&quot;code_1718991229586&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 그저 flask 패키지 설치하고 싶었을 뿐인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꽤 오랜시간 해결하지 못하고 있었다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;에러&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V3Ri5/btsH8E1Qu0Z/LaGSHqaR1tBjnVoqGAcfpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V3Ri5/btsH8E1Qu0Z/LaGSHqaR1tBjnVoqGAcfpK/img.png&quot; data-alt=&quot;error: externally-managed-environment&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V3Ri5/btsH8E1Qu0Z/LaGSHqaR1tBjnVoqGAcfpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV3Ri5%2FbtsH8E1Qu0Z%2FLaGSHqaR1tBjnVoqGAcfpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;425&quot; data-origin-width=&quot;1616&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;error: externally-managed-environment&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은.. 모르겠다...&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해결&amp;nbsp;방안&lt;/b&gt;&lt;/h4&gt;
&lt;figure id=&quot;og_1718990946666&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;How do I solve &amp;quot;error: externally-managed-environment&amp;quot; every time I use pip 3?&quot; data-og-description=&quot;Error message: error: externally-managed-environment &amp;times; This environment is externally managed ╰─&amp;gt; To install Python packages system-wide, try apt install python3-xyz, where xyz is the pack...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/75608323/how-do-i-solve-error-externally-managed-environment-every-time-i-use-pip-3&quot; data-og-url=&quot;https://stackoverflow.com/questions/75608323/how-do-i-solve-error-externally-managed-environment-every-time-i-use-pip-3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bBuzIv/hyWoHJKWOp/Pl24H2hzJLkkNJb9RBFuk0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/75608323/how-do-i-solve-error-externally-managed-environment-every-time-i-use-pip-3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/75608323/how-do-i-solve-error-externally-managed-environment-every-time-i-use-pip-3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bBuzIv/hyWoHJKWOp/Pl24H2hzJLkkNJb9RBFuk0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;How do I solve &quot;error: externally-managed-environment&quot; every time I use pip 3?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Error message: error: externally-managed-environment &amp;times; This environment is externally managed ╰─&amp;gt; To install Python packages system-wide, try apt install python3-xyz, where xyz is the pack...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1718990924132&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python -m pip config set global.break-system-packages true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pip의 설정을 변경하여 시스템 패키지를 깨뜨릴 수 있는 동작을 허용하는 옵션을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;global.break-system-packages&lt;/b&gt;:&lt;/b&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;시스템 패키지 관리자(apt, yum)와 pip 사이의 충돌을 방지하기 위해 사용된다&lt;/p&gt;</description>
      <category>에러일지</category>
      <category>PIP</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/63</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Python-pip-error-externally-managed-environment#entry63comment</comments>
      <pubDate>Sat, 22 Jun 2024 02:41:30 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] SSH Key 설정하기 failed: No space left on device</title>
      <link>https://jj-k-ul.tistory.com/entry/Linux-SSH-Key-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1160659047086768&quot;&gt;&lt;/script&gt;
&lt;!-- 티스토리수평형광고 --&gt;&lt;/p&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-1160659047086768&quot; data-ad-slot=&quot;3364846236&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718980791916&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ssh-keygen -t rsa&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RSA 알고리즘을 사용하여 SSH 키 (공개 키, 비공개 키)를 생성하라는 명령어다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.40.50.png&quot; data-origin-width=&quot;2120&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDHbAi/btsH87a6qsO/Lg0NQX3wiiCJqxaMbn4TvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDHbAi/btsH87a6qsO/Lg0NQX3wiiCJqxaMbn4TvK/img.png&quot; data-alt=&quot;failed: No space left on device&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDHbAi/btsH87a6qsO/Lg0NQX3wiiCJqxaMbn4TvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDHbAi%2FbtsH87a6qsO%2FLg0NQX3wiiCJqxaMbn4TvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;135&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.40.50.png&quot; data-origin-width=&quot;2120&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;failed: No space left on device&lt;/figcaption&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;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;failed: No space left on device&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;디스크 공간이 부족해서 키 파일을 저장할 수 없다고 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디스크용량확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718981132546&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;df -h&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로그파일 삭제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718981214515&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo rm -rf /var/log/*.old&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;캐시 정리&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718981554200&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get clean
sudo apt-get autoremove&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.47.56.png&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHMQHI/btsH8xhmpoq/0Qa3u7hseFY67gCCRPCLH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHMQHI/btsH8xhmpoq/0Qa3u7hseFY67gCCRPCLH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHMQHI/btsH8xhmpoq/0Qa3u7hseFY67gCCRPCLH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHMQHI%2FbtsH8xhmpoq%2F0Qa3u7hseFY67gCCRPCLH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;385&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.47.56.png&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하고 나니 나도 rsa 나무가 나타났다 성공 !!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.49.03.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ht8on/btsH7UqyvwB/eGYfTDvwPoq8LtUmBK6NuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ht8on/btsH7UqyvwB/eGYfTDvwPoq8LtUmBK6NuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ht8on/btsH7UqyvwB/eGYfTDvwPoq8LtUmBK6NuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHt8on%2FbtsH7UqyvwB%2FeGYfTDvwPoq8LtUmBK6NuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;467&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.49.03.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더 목록을 보면 .ssh 파일이 생겨있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.54.52.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oojIw/btsH9IontiZ/BSsUKQGKk4csynmiWc0Wp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oojIw/btsH9IontiZ/BSsUKQGKk4csynmiWc0Wp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oojIw/btsH9IontiZ/BSsUKQGKk4csynmiWc0Wp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoojIw%2FbtsH9IontiZ%2FBSsUKQGKk4csynmiWc0Wp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;220&quot; data-filename=&quot;스크린샷 2024-06-21 오후 11.54.52.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.ssh 폴더에 들어가 보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id_rsa 비공개 키 파일,&amp;nbsp; id_rsa.pub 공개 키 파일, authorized_keys 파일이 생겼다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인강에서는 authorized_keys 파일이 없었어서 뭔가 하고 보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;authorized_keys :&lt;span&gt; &lt;/span&gt;&lt;/b&gt;SSH 서버에서 클라이언트의 공개 키를 저장하는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트의 비공개 키가 authorized_keys 파일에 저장된 공개 키와 일치하면, 서버는 해당 클라이언트의 접속을 허용시켜 준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;키&amp;nbsp;기반&amp;nbsp;인증을&amp;nbsp;사용하면&amp;nbsp;비밀번호&amp;nbsp;입력&amp;nbsp;없이&amp;nbsp;자동화된&amp;nbsp;접속이&amp;nbsp;가능하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;authorized_keys 파일을 삭제하면 저장된 모든 공개 키를 잃게 되어 서버에 접속할 수 없게 되니 삭제하지 말라고 한다&lt;/p&gt;</description>
      <category>Linux</category>
      <category>authorized_keys</category>
      <category>SSH</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/62</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Linux-SSH-Key-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0#entry62comment</comments>
      <pubDate>Fri, 21 Jun 2024 23:36:19 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] VScode 설치 &amp;amp; python 명령어 변경</title>
      <link>https://jj-k-ul.tistory.com/entry/Linux-VScode-%EC%84%A4%EC%B9%98-python-%ED%99%95%EC%9D%B8</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;VScode 설치&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 코드를 작성하기 위해 VScode를 다운로드한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;vscode.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAE7xI/btsHUUitRkA/sZE8YiXlrkV2R3P4K5cdzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAE7xI/btsHUUitRkA/sZE8YiXlrkV2R3P4K5cdzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAE7xI/btsHUUitRkA/sZE8YiXlrkV2R3P4K5cdzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAE7xI%2FbtsHUUitRkA%2FsZE8YiXlrkV2R3P4K5cdzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;386&quot; data-filename=&quot;vscode.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ubuntu 운영체제에 arm64 버전의 .deb 파일로 패키징 된 VScode를 설치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dpkg.png&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Syv7G/btsHUvwKuIL/iwKApaMk1rdh3KAoru9kCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Syv7G/btsHUvwKuIL/iwKApaMk1rdh3KAoru9kCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Syv7G/btsHUvwKuIL/iwKApaMk1rdh3KAoru9kCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSyv7G%2FbtsHUvwKuIL%2FiwKApaMk1rdh3KAoru9kCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;324&quot; data-filename=&quot;dpkg.png&quot; data-origin-width=&quot;1674&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dpkg 명령어:&lt;/b&gt; 패키지를 설치, 업데이트, 제거하는 데 사용된다&lt;/p&gt;
&lt;pre id=&quot;code_1718046734150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo dpkg -i vscode 파일명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음이고 그냥 보면서 따라 만들 거니까 했지만, 아무리 봐도 계정명이랑 너무 바보 같다  &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-11 오전 4.22.28.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;1142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RyMuy/btsHU5RGQwq/umdThX2uEXcLCoSQSkdCck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RyMuy/btsHU5RGQwq/umdThX2uEXcLCoSQSkdCck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RyMuy/btsHU5RGQwq/umdThX2uEXcLCoSQSkdCck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRyMuy%2FbtsHU5RGQwq%2FumdThX2uEXcLCoSQSkdCck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;408&quot; data-filename=&quot;스크린샷 2024-06-11 오전 4.22.28.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;1142&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;python3 -&amp;gt; python 명령어 변경&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우분투 리눅스는 python을 기본으로 제공한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode도 설치했겠다 python이 잘 작동되는지 실행해보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python이 없단다 python3가 있다는 거군&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 쓸 때마다 뒤에 3 붙이면 불편하니 python 명령어로 python3 실행시키기로 했다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-11 오전 4.31.59.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XuBnC/btsHTTStAZG/NgrQtrQbxp2Nt0elPrK8uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XuBnC/btsHTTStAZG/NgrQtrQbxp2Nt0elPrK8uK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XuBnC/btsHTTStAZG/NgrQtrQbxp2Nt0elPrK8uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXuBnC%2FbtsHTTStAZG%2FNgrQtrQbxp2Nt0elPrK8uK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;176&quot; data-filename=&quot;스크린샷 2024-06-11 오전 4.31.59.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1718047795298&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install python-is-python3 -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-y 옵션은&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-filename=&quot;스크린샷 2024-06-11 오전 4.35.11.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkTRX5/btsHUbSRyzM/6GE3ieE6xJCh9pbPJ2NPDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkTRX5/btsHUbSRyzM/6GE3ieE6xJCh9pbPJ2NPDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkTRX5/btsHUbSRyzM/6GE3ieE6xJCh9pbPJ2NPDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkTRX5%2FbtsHUbSRyzM%2F6GE3ieE6xJCh9pbPJ2NPDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;137&quot; data-filename=&quot;스크린샷 2024-06-11 오전 4.35.11.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;190&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>Linux</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/60</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Linux-VScode-%EC%84%A4%EC%B9%98-python-%ED%99%95%EC%9D%B8#entry60comment</comments>
      <pubDate>Tue, 11 Jun 2024 10:13:22 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Mac M2 VMware Fusion로 Ubuntu Server &amp;amp; GUI 설치</title>
      <link>https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion%EB%A1%9C-Ubuntu-%EC%84%A4%EC%B9%98</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;환경&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Macbook M2 pro&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;우분투:&amp;nbsp;ubuntu-24.04-live-server-arm64&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;가상머신:&amp;nbsp;VMware&amp;nbsp;Fusion&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;목표&lt;/span&gt;&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; text-align: left;&quot;&gt;VMware&amp;nbsp;Fusion에&amp;nbsp;&lt;/span&gt;리눅스 우분투 설치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Ubuntu GUI 설치&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;Ubuntu Server for ARM ISO image&lt;/span&gt;&lt;/h1&gt;
&lt;figure id=&quot;og_1718036697959&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://ubuntu.com/download/server/arm&quot; data-og-description=&quot;&quot; data-og-host=&quot;ubuntu.com&quot; data-og-source-url=&quot;https://ubuntu.com/download/server/arm&quot; data-og-url=&quot;https://ubuntu.com/download/server/arm&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://ubuntu.com/download/server/arm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ubuntu.com/download/server/arm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://ubuntu.com/download/server/arm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ubuntu.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u11lD/btsHTgAvZWT/82TQs4JFEIXUYkXkd13Lx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u11lD/btsHTgAvZWT/82TQs4JFEIXUYkXkd13Lx0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;1050&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.58.29.png&quot; style=&quot;width: 49.2215%; margin-right: 10px;&quot; data-widthpercent=&quot;49.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u11lD/btsHTgAvZWT/82TQs4JFEIXUYkXkd13Lx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu11lD%2FbtsHTgAvZWT%2F82TQs4JFEIXUYkXkd13Lx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1256&quot; height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Kahnp/btsHUCh8bfu/NhqqhULRkAVENT8hF98nlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Kahnp/btsHUCh8bfu/NhqqhULRkAVENT8hF98nlK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;1040&quot; data-filename=&quot;스크린샷 2024-06-11 오전 12.11.53.png&quot; style=&quot;width: 49.6157%;&quot; data-widthpercent=&quot;50.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Kahnp/btsHUCh8bfu/NhqqhULRkAVENT8hF98nlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKahnp%2FbtsHUCh8bfu%2FNhqqhULRkAVENT8hF98nlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1254&quot; height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;VMware Fusion에 다운 받은 ubuntu-24.04-live-server-arm64 이미지를 넣어준다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Try or Install Ubuntu Server&lt;span style=&quot;background-color: #ffffff; 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;1182&quot; data-origin-height=&quot;1286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V9Jhw/btsHTk3MRTA/lVUyIplgROFZ1Dyyj6etd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V9Jhw/btsHTk3MRTA/lVUyIplgROFZ1Dyyj6etd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V9Jhw/btsHTk3MRTA/lVUyIplgROFZ1Dyyj6etd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV9Jhw%2FbtsHTk3MRTA%2FlVUyIplgROFZ1Dyyj6etd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1182&quot; height=&quot;1286&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;1286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;키보드 언어설정 &amp;gt; Ubuntu Server 선택 &amp;gt; 프록시 설정 (  Done ) &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;904&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJvNtS/btsHUPIiV41/lQQnNEx7EjEamHlTOmFkhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJvNtS/btsHUPIiV41/lQQnNEx7EjEamHlTOmFkhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJvNtS/btsHUPIiV41/lQQnNEx7EjEamHlTOmFkhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJvNtS%2FbtsHUPIiV41%2FlQQnNEx7EjEamHlTOmFkhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;1034&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;1034&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;gt; 파티션 설정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Custom storage layout를 많이 하는 것 같아 시도하였지만;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;무엇을 어떻게 설정해야할지 모르겠어서 일단은 LVM으로 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;LVM:&lt;/b&gt; Linux에서 디스크 저장소를 동적으로 크기 조정과 디스크 공간 통합을 해주는 시스템&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;1870&quot; data-origin-height=&quot;1032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vOljj/btsHS8P6Gf1/5YRS3CkNRmI7X0oKTmV850/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vOljj/btsHS8P6Gf1/5YRS3CkNRmI7X0oKTmV850/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vOljj/btsHS8P6Gf1/5YRS3CkNRmI7X0oKTmV850/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvOljj%2FbtsHS8P6Gf1%2F5YRS3CkNRmI7X0oKTmV850%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1870&quot; height=&quot;1032&quot; data-origin-width=&quot;1870&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;&lt;span&gt;&amp;gt; 계정정보 입력 &amp;gt; OpenSSH server 설치 &amp;gt; 서버에서 사용할 패키지 선택&lt;span style=&quot;text-align: start;&quot;&gt; (  Done ) &amp;gt; Reboot&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;1186&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IRmm1/btsHU8gxDen/PHwCcFd4s37PIhLsMIh7Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IRmm1/btsHU8gxDen/PHwCcFd4s37PIhLsMIh7Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IRmm1/btsHU8gxDen/PHwCcFd4s37PIhLsMIh7Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIRmm1%2FbtsHU8gxDen%2FPHwCcFd4s37PIhLsMIh7Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1186&quot; height=&quot;1012&quot; data-origin-width=&quot;1186&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;인강에서는 desktop버전으로 다운받으라고 했지만 arm desktop은 못 찾겠는걸&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;일단 중요한 건 같은 arm64이니까 server버전이여도 뭐 상관없겠지 하고 ubuntu live server arm64를 다운 받았더니&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;인강을 따라갈 수가 없다  &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;server와 desktop는 GUI환경 유무와 일부 패키지 차이라고 한다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래도 회사에서 보던 터미널 창 나와서 조금 반갑고 신기했다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&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;2286&quot; data-origin-height=&quot;1396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxsJFw/btsHTWn3dPb/nuDBbXYvdMKVUoIpKLXXtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxsJFw/btsHTWn3dPb/nuDBbXYvdMKVUoIpKLXXtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxsJFw/btsHTWn3dPb/nuDBbXYvdMKVUoIpKLXXtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxsJFw%2FbtsHTWn3dPb%2FnuDBbXYvdMKVUoIpKLXXtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2286&quot; height=&quot;1396&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;1396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;잠시 삭제할까 생각하다가 desktop버전은 언제 찾나 싶어 GUI를 설치해보려고 한다&lt;/span&gt;&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span&gt;Ubuntu Server GUI 설치&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;apt-get 명령어:&lt;/b&gt;&amp;nbsp;Ubuntu 소프트웨어 패키지 관리(설치, 삭제, 업데이트)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Ubuntu Server 업데이트:&lt;/b&gt; 시스템 패키지 목록을 업데이트하고 시스템을 최신 상태로 유지&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718039211029&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get update // 사용 가능한 패키지 목록과 버전 업데이트
sudo apt-get upgrade // 시스템에 설치된 모든 패키지를 최신 버전으로 업그레이드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;GUI 패키지 설치&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718038018263&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt-get install --no-install-recommends ubuntu-desktop
or
sudo apt-get install ubuntu-desktop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;--no-install-recommends 옵션:&lt;/b&gt; 이 옵션을 사용하면 패키지양이 줄어들어&amp;nbsp;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial,                    sans-serif; letter-spacing: 0px;&quot;&gt;시스템 자원을 덜 사용하게 되지만, 필요한 추가 기능이나 의존성 패키지를 놓치게 될 수도 있다&lt;/span&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;1636&quot; data-origin-height=&quot;1100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1sjrD/btsHTBdpFfr/8s21rZPGK2xjt1HmzqE6Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1sjrD/btsHTBdpFfr/8s21rZPGK2xjt1HmzqE6Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1sjrD/btsHTBdpFfr/8s21rZPGK2xjt1HmzqE6Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1sjrD%2FbtsHTBdpFfr%2F8s21rZPGK2xjt1HmzqE6Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1636&quot; height=&quot;1100&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;1100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그냥 desktop버전을 찾을걸 후회할 정도의 시간이 걸렸다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;시스템 재부팅:&lt;/b&gt; 설치 완료되면 재부팅하여 변경 사항 적용&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1718038505103&quot; class=&quot;ebnf&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo reboot&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;3024&quot; data-origin-height=&quot;1964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CxxAo/btsHU636yi0/ambiKJBbkd27SO15EyE0S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CxxAo/btsHU636yi0/ambiKJBbkd27SO15EyE0S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CxxAo/btsHU636yi0/ambiKJBbkd27SO15EyE0S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCxxAo%2FbtsHU636yi0%2FambiKJBbkd27SO15EyE0S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;1964&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;1964&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Linux</category>
      <category>gui</category>
      <category>ubuntu</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/59</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion%EB%A1%9C-Ubuntu-%EC%84%A4%EC%B9%98#entry59comment</comments>
      <pubDate>Tue, 11 Jun 2024 00:39:15 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] Mac M2 VMware Fusion 설치</title>
      <link>https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion-%EC%84%A4%EC%B9%98</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;환경&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Macbook M2 pro&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;목표&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: left;&quot;&gt;VMware Fusion&lt;/span&gt;&amp;nbsp;설치&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;VMware Fusion&lt;/h1&gt;
&lt;figure id=&quot;og_1718019478641&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Introducing VMware Cross-Cloud Services&quot; data-og-description=&quot;Discover how VMware Cross-Cloud services give organizations freedom and control without trade-offs.&quot; data-og-host=&quot;www.vmware.com&quot; data-og-source-url=&quot;https://www.vmware.com/&quot; data-og-url=&quot;https://www.vmware.com/content/vmware/vmware-published-sites/us&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gwaLj/hyWllMwl8l/9hslllIQoSxzrtePtG6IC1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/cO47cU/hyWles6q8G/5TQ6exnmLWVmQPkbh1xkR0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://www.vmware.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.vmware.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gwaLj/hyWllMwl8l/9hslllIQoSxzrtePtG6IC1/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/cO47cU/hyWles6q8G/5TQ6exnmLWVmQPkbh1xkR0/img.png?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introducing VMware Cross-Cloud Services&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Discover how VMware Cross-Cloud services give organizations freedom and control without trade-offs.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.vmware.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Products &amp;gt; Desktop Hypervisor &amp;gt; Fusion Pro&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-10 오후 8.54.26.png&quot; data-origin-width=&quot;2594&quot; data-origin-height=&quot;1532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhjESz/btsHUcYvCCj/46lJrdRhEqIxLO63Eg444K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhjESz/btsHUcYvCCj/46lJrdRhEqIxLO63Eg444K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhjESz/btsHUcYvCCj/46lJrdRhEqIxLO63Eg444K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhjESz%2FbtsHUcYvCCj%2F46lJrdRhEqIxLO63Eg444K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2594&quot; height=&quot;1532&quot; data-filename=&quot;스크린샷 2024-06-10 오후 8.54.26.png&quot; data-origin-width=&quot;2594&quot; data-origin-height=&quot;1532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.43.05.png&quot; data-origin-width=&quot;2554&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XT55c/btsHTD3jtaY/LaVumqn6gkaA3hotqKgUvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XT55c/btsHTD3jtaY/LaVumqn6gkaA3hotqKgUvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XT55c/btsHTD3jtaY/LaVumqn6gkaA3hotqKgUvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXT55c%2FbtsHTD3jtaY%2FLaVumqn6gkaA3hotqKgUvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2554&quot; height=&quot;610&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.43.05.png&quot; data-origin-width=&quot;2554&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for mac 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 다운로드로 진행될 줄 알았는데 broadcom이라는 페이지로 이동된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 안되고 왜 페이지가 열리나 해서 찾아보니&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;broadcom이 VMwear 인수를 했다고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24년 5월 13일 부터 Fusion Pro 13와 Workstation Pro 17은 무료배포하기로 했다고 한다(개인 사용자 용도)&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;BROADCOM&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.50.44.png&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;934&quot;&gt;&lt;a href=&quot;https://blogs.vmware.com/teamfusion/2024/05/fusion-pro-now-available-free-for-personal-use.html&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfKogs/btsHS9BrOeM/Tf9KKDCKxYFynzoDh7ogyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfKogs%2FbtsHS9BrOeM%2FTf9KKDCKxYFynzoDh7ogyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1484&quot; height=&quot;934&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.50.44.png&quot; data-origin-width=&quot;1484&quot; data-origin-height=&quot;934&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;https://blogs.vmware.com/teamfusion/2024/05/fusion-pro-now-available-free-for-personal-use.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1718021552349&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Home - Support Portal - Broadcom support portal&quot; data-og-description=&quot;It appears your Broadcom Products and Services are supported by one of our certified Support partners Click below to be redirected to the appropriate Support Partner Portal to request support For non-product related issues (Support Portal / Licensing) Clic&quot; data-og-host=&quot;support.broadcom.com&quot; data-og-source-url=&quot;https://support.broadcom.com/&quot; data-og-url=&quot;https://support.broadcom.com/web/ecx&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6247R/hyWljgR4yu/KtMEZqKbwL0beIS8O01Ekk/img.png?width=3000&amp;amp;height=3000&amp;amp;face=0_0_3000_3000,https://scrap.kakaocdn.net/dn/ksS9Y/hyWlgEsLoo/IX4bHIIOKZ8RGQkcyVckMK/img.png?width=1250&amp;amp;height=1250&amp;amp;face=0_0_1250_1250,https://scrap.kakaocdn.net/dn/Ccbk9/hyWgXNnyeW/Btn5TPD8ZYAfcppQ63O7Fk/img.png?width=1250&amp;amp;height=1250&amp;amp;face=0_0_1250_1250&quot;&gt;&lt;a href=&quot;https://support.broadcom.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://support.broadcom.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6247R/hyWljgR4yu/KtMEZqKbwL0beIS8O01Ekk/img.png?width=3000&amp;amp;height=3000&amp;amp;face=0_0_3000_3000,https://scrap.kakaocdn.net/dn/ksS9Y/hyWlgEsLoo/IX4bHIIOKZ8RGQkcyVckMK/img.png?width=1250&amp;amp;height=1250&amp;amp;face=0_0_1250_1250,https://scrap.kakaocdn.net/dn/Ccbk9/hyWgXNnyeW/Btn5TPD8ZYAfcppQ63O7Fk/img.png?width=1250&amp;amp;height=1250&amp;amp;face=0_0_1250_1250');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Home - Support Portal - Broadcom support portal&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;It appears your Broadcom Products and Services are supported by one of our certified Support partners Click below to be redirected to the appropriate Support Partner Portal to request support For non-product related issues (Support Portal / Licensing) Clic&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;support.broadcom.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;broadcom 사이트에 들어가서 로그인 후&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. My Downloads &amp;gt; VMware Cloud Foundation &amp;gt; VMware Fusion 검색&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpMxk5/btsHTFGAYZk/kzdOoaJKcDKCz4JEv7AVW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpMxk5/btsHTFGAYZk/kzdOoaJKcDKCz4JEv7AVW0/img.png&quot; data-origin-width=&quot;2070&quot; data-origin-height=&quot;1194&quot; data-filename=&quot;스크린샷 2024-06-10 오후 10.35.05.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 39.2261%; margin-right: 10px;&quot; data-widthpercent=&quot;39.69&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpMxk5/btsHTFGAYZk/kzdOoaJKcDKCz4JEv7AVW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpMxk5%2FbtsHTFGAYZk%2FkzdOoaJKcDKCz4JEv7AVW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1194&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VtGNu/btsHS7p4zuI/sBMpjhAEo9dHsHyuxgPh90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VtGNu/btsHS7p4zuI/sBMpjhAEo9dHsHyuxgPh90/img.png&quot; data-origin-width=&quot;3014&quot; data-origin-height=&quot;1144&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.27.23.png&quot; data-is-animation=&quot;false&quot; style=&quot;width: 59.6111%;&quot; data-widthpercent=&quot;60.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VtGNu/btsHS7p4zuI/sBMpjhAEo9dHsHyuxgPh90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVtGNu%2FbtsHS7p4zuI%2FsBMpjhAEo9dHsHyuxgPh90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3014&quot; height=&quot;1144&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMware Fusion Pro 13&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.40.57.png&quot; data-origin-width=&quot;2186&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVPsCN/btsHUB4yG3n/CuNjlV8lBLVKyl38DnQ1vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVPsCN/btsHUB4yG3n/CuNjlV8lBLVKyl38DnQ1vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVPsCN/btsHUB4yG3n/CuNjlV8lBLVKyl38DnQ1vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVPsCN%2FbtsHUB4yG3n%2FCuNjlV8lBLVKyl38DnQ1vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2186&quot; height=&quot;1222&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.40.57.png&quot; data-origin-width=&quot;2186&quot; data-origin-height=&quot;1222&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;나의 집 주소를 적고 나면 다운로드 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.34.58.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewOvfq/btsHU5c15jw/9sltOzPX9aBTsKOSPJpBKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewOvfq/btsHU5c15jw/9sltOzPX9aBTsKOSPJpBKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewOvfq/btsHU5c15jw/9sltOzPX9aBTsKOSPJpBKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FewOvfq%2FbtsHU5c15jw%2F9sltOzPX9aBTsKOSPJpBKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;1010&quot; data-filename=&quot;스크린샷 2024-06-10 오후 11.34.58.png&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;Ubuntu 설치&lt;/h1&gt;
&lt;figure id=&quot;og_1718033980933&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Mac M2 VMware Fusion로 Ubuntu 설치&quot; data-og-description=&quot;Ubuntu Server for ARM ISO&amp;nbsp;image&amp;nbsp;https://ubuntu.com/download/server/arm&amp;nbsp;ubuntu.com&quot; data-og-host=&quot;jj-k-ul.tistory.com&quot; data-og-source-url=&quot;https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion%EB%A1%9C-Ubuntu-%EC%84%A4%EC%B9%98&quot; data-og-url=&quot;https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion%EB%A1%9C-Ubuntu-%EC%84%A4%EC%B9%98&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/C8p6J/hyWg0cd139/N69rlm7Mw744TQUAnVrpWk/img.png?width=800&amp;amp;height=663&amp;amp;face=0_0_800_663,https://scrap.kakaocdn.net/dn/pvifW/hyWlbpDGJw/Ud85xngKiaIxLBwB2NWcKK/img.png?width=800&amp;amp;height=663&amp;amp;face=0_0_800_663,https://scrap.kakaocdn.net/dn/MOlGY/hyWle7KeOP/6CAjCjCH7ekrH02za8eYMK/img.png?width=1254&amp;amp;height=1040&amp;amp;face=0_0_1254_1040&quot;&gt;&lt;a href=&quot;https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion%EB%A1%9C-Ubuntu-%EC%84%A4%EC%B9%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion%EB%A1%9C-Ubuntu-%EC%84%A4%EC%B9%98&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/C8p6J/hyWg0cd139/N69rlm7Mw744TQUAnVrpWk/img.png?width=800&amp;amp;height=663&amp;amp;face=0_0_800_663,https://scrap.kakaocdn.net/dn/pvifW/hyWlbpDGJw/Ud85xngKiaIxLBwB2NWcKK/img.png?width=800&amp;amp;height=663&amp;amp;face=0_0_800_663,https://scrap.kakaocdn.net/dn/MOlGY/hyWle7KeOP/6CAjCjCH7ekrH02za8eYMK/img.png?width=1254&amp;amp;height=1040&amp;amp;face=0_0_1254_1040');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mac M2 VMware Fusion로 Ubuntu 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu Server for ARM ISO&amp;nbsp;image&amp;nbsp;https://ubuntu.com/download/server/arm&amp;nbsp;ubuntu.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jj-k-ul.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux</category>
      <category>Vmware</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/58</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Mac-M2-VMware-Fusion-%EC%84%A4%EC%B9%98#entry58comment</comments>
      <pubDate>Tue, 11 Jun 2024 00:32:52 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] iOS 에뮬레이터에서 가상 키보드 보이도록 설정</title>
      <link>https://jj-k-ul.tistory.com/entry/Flutter-iOS-%EC%97%90%EB%AE%AC%EB%A0%88%EC%9D%B4%ED%84%B0%EC%97%90%EC%84%9C-%EA%B0%80%EC%83%81-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B3%B4%EC%9D%B4%EB%8F%84%EB%A1%9D-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-04 오후 5.13.56.png&quot; data-origin-width=&quot;1624&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSZ0c4/btsHOCJuC0w/IkVcNgfL98MBgfacPgH9bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSZ0c4/btsHOCJuC0w/IkVcNgfL98MBgfacPgH9bK/img.png&quot; data-alt=&quot;ios simulator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSZ0c4/btsHOCJuC0w/IkVcNgfL98MBgfacPgH9bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSZ0c4%2FbtsHOCJuC0w%2FIkVcNgfL98MBgfacPgH9bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1624&quot; height=&quot;514&quot; data-filename=&quot;스크린샷 2024-06-04 오후 5.13.56.png&quot; data-origin-width=&quot;1624&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ios simulator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O &amp;gt; Keyboard &amp;gt; Connect Hardware Keyboard -&amp;gt; 체크 해제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( Shift(⇧) + Command(⌘) + K )&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <category>Flutter</category>
      <category>ios</category>
      <category>에뮬레이터</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/57</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Flutter-iOS-%EC%97%90%EB%AE%AC%EB%A0%88%EC%9D%B4%ED%84%B0%EC%97%90%EC%84%9C-%EA%B0%80%EC%83%81-%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%B3%B4%EC%9D%B4%EB%8F%84%EB%A1%9D-%EC%84%A4%EC%A0%95#entry57comment</comments>
      <pubDate>Tue, 4 Jun 2024 17:16:43 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] flutter doctor: Java버전 &amp;amp; Android Licenses 이슈</title>
      <link>https://jj-k-ul.tistory.com/entry/Flutter-flutter-doctor</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;역시나 쉽지 않은 flutter Android Studio 세팅일지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-04 오후 3.49.59.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X7OBN/btsHM6kwKEN/CGNxB0MUJiTeA4DKAS1Vc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X7OBN/btsHM6kwKEN/CGNxB0MUJiTeA4DKAS1Vc1/img.png&quot; data-alt=&quot;flutter doctor error&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X7OBN/btsHM6kwKEN/CGNxB0MUJiTeA4DKAS1Vc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX7OBN%2FbtsHM6kwKEN%2FCGNxB0MUJiTeA4DKAS1Vc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1138&quot; height=&quot;420&quot; data-filename=&quot;스크린샷 2024-06-04 오후 3.49.59.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flutter doctor error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;1. Unable to find bundled Java version.&lt;/h2&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;pre id=&quot;code_1717484000851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /Applications/Android\ Studio.app/Contents
ln -s jbr jre&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Studio.app의 Contents로 이동해서&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-04 오후 3.59.38.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zh43r/btsHNTdJOKn/ouxpHFXXLUtOsZFVPoUfkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zh43r/btsHNTdJOKn/ouxpHFXXLUtOsZFVPoUfkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zh43r/btsHNTdJOKn/ouxpHFXXLUtOsZFVPoUfkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZh43r%2FbtsHNTdJOKn%2FouxpHFXXLUtOsZFVPoUfkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1042&quot; height=&quot;88&quot; data-filename=&quot;스크린샷 2024-06-04 오후 3.59.38.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;jbr 폴더 내용을 jre 폴더로 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복사해 주고 나니 자바 버전 이슈는 해결&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;2. Android&amp;nbsp;Licenses&lt;/h2&gt;
&lt;pre id=&quot;code_1717484201063&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;flutter doctor --android-licenses&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-06-04 오후 4.12.27.png&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FmgNu/btsHNev4xoE/uTGx9KDZHDRpQgsTOxjcZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FmgNu/btsHNev4xoE/uTGx9KDZHDRpQgsTOxjcZK/img.png&quot; data-alt=&quot;Android toolchain&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FmgNu/btsHNev4xoE/uTGx9KDZHDRpQgsTOxjcZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFmgNu%2FbtsHNev4xoE%2FuTGx9KDZHDRpQgsTOxjcZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1318&quot; height=&quot;618&quot; data-filename=&quot;스크린샷 2024-06-04 오후 4.12.27.png&quot; data-origin-width=&quot;1318&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Android toolchain&lt;/figcaption&gt;
&lt;/figure&gt;
&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-filename=&quot;스크린샷 2024-06-04 오후 4.14.42.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9Ro0Y/btsHOl8UsJ8/Vc90NMNwCWYRVO99737hAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9Ro0Y/btsHOl8UsJ8/Vc90NMNwCWYRVO99737hAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9Ro0Y/btsHOl8UsJ8/Vc90NMNwCWYRVO99737hAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9Ro0Y%2FbtsHOl8UsJ8%2FVc90NMNwCWYRVO99737hAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;336&quot; data-filename=&quot;스크린샷 2024-06-04 오후 4.14.42.png&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 이제 진짜 드디어 flutter 시작이다&lt;/p&gt;</description>
      <category>에러일지</category>
      <category>Flutter</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/56</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Flutter-flutter-doctor#entry56comment</comments>
      <pubDate>Tue, 4 Jun 2024 16:03:55 +0900</pubDate>
    </item>
    <item>
      <title>내가 쓰기 좋았던 목업 사이트</title>
      <link>https://jj-k-ul.tistory.com/entry/%EB%82%B4%EA%B0%80-%EC%93%B0%EA%B8%B0-%EC%A2%8B%EC%95%98%EB%8D%98-%EB%AA%A9%EC%97%85-%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 포토샵&lt;/p&gt;
&lt;figure id=&quot;og_1710324433512&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Photopea | Online Photo Editor&quot; data-og-description=&quot;✕ Photopea: advanced photo editor Free online photo editor supporting PSD, XCF, Sketch, XD and CDR formats. (Adobe Photoshop, GIMP, Sketch App, Adobe XD and CorelDRAW). Create a new image or open existing files from your computer. Save your work as PSD (&quot; data-og-host=&quot;www.photopea.com&quot; data-og-source-url=&quot;https://www.photopea.com/&quot; data-og-url=&quot;https://www.photopea.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.photopea.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.photopea.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Photopea | Online Photo Editor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;✕ Photopea: advanced photo editor Free online photo editor supporting PSD, XCF, Sketch, XD and CDR formats. (Adobe Photoshop, GIMP, Sketch App, Adobe XD and CorelDRAW). Create a new image or open existing files from your computer. Save your work as PSD (&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.photopea.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. shots.so -&amp;nbsp;디바이스 목업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림자 &amp;amp; 배경 색을 넣어주고 고를 수 있다&lt;/p&gt;
&lt;figure id=&quot;og_1710324453385&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Create Amazing Mockups&quot; data-og-description=&quot;Create Amazing Mockups&quot; data-og-host=&quot;www.shots.so&quot; data-og-source-url=&quot;https://shots.so/&quot; data-og-url=&quot;https://www.shots.so/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d03toV/hyVxorbtPL/iIW1VUONpX5frPjgpK6cTK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=1398_474_1626_702,https://scrap.kakaocdn.net/dn/TBaxR/hyVxx2Hlc5/k5gbAV0hUTJkfYwcdfJmn0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=1398_474_1626_702,https://scrap.kakaocdn.net/dn/bIaUzt/hyVxBcZktE/ij3EzOm3i0qqdqQ4zu0MC1/img.jpg?width=534&amp;amp;height=400&amp;amp;face=0_0_534_400&quot;&gt;&lt;a href=&quot;https://shots.so/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://shots.so/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d03toV/hyVxorbtPL/iIW1VUONpX5frPjgpK6cTK/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=1398_474_1626_702,https://scrap.kakaocdn.net/dn/TBaxR/hyVxx2Hlc5/k5gbAV0hUTJkfYwcdfJmn0/img.jpg?width=1920&amp;amp;height=1080&amp;amp;face=1398_474_1626_702,https://scrap.kakaocdn.net/dn/bIaUzt/hyVxBcZktE/ij3EzOm3i0qqdqQ4zu0MC1/img.jpg?width=534&amp;amp;height=400&amp;amp;face=0_0_534_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Create Amazing Mockups&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Create Amazing Mockups&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.shots.so&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp; mockup.photos&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배경 &amp;amp; 인물들이 같이 나오는 목업 종류가 많다&lt;/p&gt;
&lt;figure id=&quot;og_1710324523491&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Mockup Photos - High quality mockup templates from around the world&quot; data-og-description=&quot;Mockup Photos collects high quality mockup images from around the world. Use Mockup Photos to generate app screenshots in seconds. Choose between 1000s of images created by individual creators&quot; data-og-host=&quot;mockup.photos&quot; data-og-source-url=&quot;https://mockup.photos/&quot; data-og-url=&quot;https://mockup.photos/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bH4X8E/hyVALZjvSr/jeYl6ht810NISfh7QoqLkk/img.jpg?width=2000&amp;amp;height=1333&amp;amp;face=0_0_2000_1333&quot;&gt;&lt;a href=&quot;https://mockup.photos/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mockup.photos/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bH4X8E/hyVALZjvSr/jeYl6ht810NISfh7QoqLkk/img.jpg?width=2000&amp;amp;height=1333&amp;amp;face=0_0_2000_1333');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mockup Photos - High quality mockup templates from around the world&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Mockup Photos collects high quality mockup images from around the world. Use Mockup Photos to generate app screenshots in seconds. Choose between 1000s of images created by individual creators&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mockup.photos&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/55</guid>
      <comments>https://jj-k-ul.tistory.com/entry/%EB%82%B4%EA%B0%80-%EC%93%B0%EA%B8%B0-%EC%A2%8B%EC%95%98%EB%8D%98-%EB%AA%A9%EC%97%85-%EC%82%AC%EC%9D%B4%ED%8A%B8#entry55comment</comments>
      <pubDate>Wed, 13 Mar 2024 19:10:29 +0900</pubDate>
    </item>
    <item>
      <title>[React] R3F(React Three Fiber) 상자 만들어보기</title>
      <link>https://jj-k-ul.tistory.com/entry/React-R3FReact-Three-Fiber</link>
      <description>&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;React에서 사용하는 three.js : React Three Fiber (R3F)&lt;/b&gt; &lt;/b&gt;&lt;/h2&gt;
&lt;figure id=&quot;og_1700804899201&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;React Three Fiber Documentation&quot; data-og-description=&quot;React-three-fiber is a React renderer for three.js&quot; data-og-host=&quot;docs.pmnd.rs&quot; data-og-source-url=&quot;https://docs.pmnd.rs/react-three-fiber/getting-started/introduction&quot; data-og-url=&quot;https://docs.pmnd.rs/react-three-fiber&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DzMVv/hyUB2BPQ68/wetrDk4wid682q0Y36T9B0/img.jpg?width=1220&amp;amp;height=650&amp;amp;face=0_0_1220_650,https://scrap.kakaocdn.net/dn/IQSig/hyUB6Yxd8e/YzqaIhYBfkxhoeHsKAxU8k/img.jpg?width=1750&amp;amp;height=500&amp;amp;face=0_0_1750_500&quot;&gt;&lt;a href=&quot;https://docs.pmnd.rs/react-three-fiber/getting-started/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.pmnd.rs/react-three-fiber/getting-started/introduction&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DzMVv/hyUB2BPQ68/wetrDk4wid682q0Y36T9B0/img.jpg?width=1220&amp;amp;height=650&amp;amp;face=0_0_1220_650,https://scrap.kakaocdn.net/dn/IQSig/hyUB6Yxd8e/YzqaIhYBfkxhoeHsKAxU8k/img.jpg?width=1750&amp;amp;height=500&amp;amp;face=0_0_1750_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;React Three Fiber Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React-three-fiber is a React renderer for three.js&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.pmnd.rs&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Three.js는 WebGL을 사용하는 3D &lt;span style=&quot;color: #374151; text-align: start;&quot;&gt;그래픽 &lt;/span&gt;라이브러리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R3F는 React와 Three.js를 통합하여 React 기반 애플리케이션에서 Three.js를 사용할 수 있도록 도와주는 도구&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관련 라이브러리 install&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1700804953274&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install three @types/three @react-three/fiber
or
yarn add three @types/three @react-three/fiber&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;App.jsx&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App 파일에 Canvas 태그 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Box3D 컴포넌트에서 Canvas 내부 내용을 그려줄 것이다&lt;/p&gt;
&lt;pre id=&quot;code_1700804997016&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Canvas } from '@react-three/fiber';
import Box3D from './Box3D';
import './App.css';

const App = () =&amp;gt; {
    return (
        &amp;lt;Canvas&amp;gt;
            &amp;lt;Box3D /&amp;gt;
        &amp;lt;/Canvas&amp;gt;
    );
};

export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;b&gt;App.css&lt;/b&gt;&lt;/b&gt;&lt;/h3&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;css 설정없이 작업하면 크기가 작으니 일단은 잘 보이게 크기를 준다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1700806247712&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;body {
    padding: 0;
    margin: 0;
}

#root {
    width: 100%;
    height: 100vh;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Box3D.jsx&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;boxGeometry&lt;span&gt; (상자 모양의 3D 객체를 생성한다)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mesh 태그(3D&amp;nbsp;객체를&amp;nbsp;만들&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;클래스)를 만들고 그 안에 &amp;lt;boxGeometry /&amp;gt; 박스 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;boxGeometry의&lt;span&gt;&amp;nbsp;args 속성을 사용하여 배열로 [가로, 세로, 깊이] 값을 설정해주면 크기가 지정된다&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701997369188&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Box3D = () =&amp;gt; {
    return (
        &amp;lt;&amp;gt;
            &amp;lt;axesHelper /&amp;gt;
            &amp;lt;mesh&amp;gt;
                &amp;lt;boxGeometry /&amp;gt;
                // &amp;lt;boxGeometry args={[2, 3, 4]} /&amp;gt;
                &amp;lt;meshStandardMaterial color={'blue'} /&amp;gt;
            &amp;lt;/mesh&amp;gt;
        &amp;lt;/&amp;gt;
    );
};

export default Box3D;&lt;/code&gt;&lt;/pre&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;boxGeometry&lt;span&gt;&lt;span&gt;&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;329&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlKdA7/btsAO5eLkAN/K4fXRRbZAsa6Gx5lTOXek1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlKdA7/btsAO5eLkAN/K4fXRRbZAsa6Gx5lTOXek1/img.png&quot; data-alt=&quot;boxGeometry 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlKdA7/btsAO5eLkAN/K4fXRRbZAsa6Gx5lTOXek1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlKdA7%2FbtsAO5eLkAN%2FK4fXRRbZAsa6Gx5lTOXek1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;329&quot; height=&quot;313&quot; data-origin-width=&quot;329&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;boxGeometry 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;meshStandardMaterial color={'blue'} 으로 도형의 색 설정&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&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;directionalLight&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;직사광 추가&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h4&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;lt;directionalLight position={[1, 1, 1]} /&amp;gt; 으로 설정해준다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;position은 배열로 표현되고 X, Y, Z 축을 따라 빛의 위치를 지정한다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;X축으로 1,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Y축으로 1,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Z축으로 1의 위치에 직사광을 배치한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A2Adv/btsAScKFOWb/gc58cKuaSA8eT5TLlCzq1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A2Adv/btsAScKFOWb/gc58cKuaSA8eT5TLlCzq1K/img.png&quot; data-alt=&quot;directionalLight&amp;amp;nbsp;&amp;amp;nbsp;직사광 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A2Adv/btsAScKFOWb/gc58cKuaSA8eT5TLlCzq1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA2Adv%2FbtsAScKFOWb%2Fgc58cKuaSA8eT5TLlCzq1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;369&quot; height=&quot;376&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;directionalLight&amp;nbsp;&amp;nbsp;직사광 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1700805089029&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const Box3D = () =&amp;gt; {
    return (
        &amp;lt;&amp;gt;
            &amp;lt;directionalLight position={[1, 1, 1]} /&amp;gt; {/* 직사광 추가 */}
            &amp;lt;axesHelper /&amp;gt;
            &amp;lt;mesh rotation={[0, (45 * Math.PI) / 180, 0]}&amp;gt;
                &amp;lt;boxGeometry /&amp;gt;
                &amp;lt;meshStandardMaterial color={'blue'} /&amp;gt;
            &amp;lt;/mesh&amp;gt;
        &amp;lt;/&amp;gt;
    );
};

export default Box3D;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;rotation 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rotation을 넣어 도형에 입체감을 넣어보았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rotation={[0,&amp;nbsp;(45&amp;nbsp;*&amp;nbsp;Math.PI)&amp;nbsp;/&amp;nbsp;180,&amp;nbsp;0]}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;X축 회전 : X축 회전하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y축 회전 : 45도를&amp;nbsp;라디안으로&amp;nbsp;변환한&amp;nbsp;값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Z축 회전 : Z축 회전하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y축 중심으로 45도 회전했다는 뜻이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4FG7o/btsAPloh4Nw/KwfZrC9mNFkCykNFtfHKok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4FG7o/btsAPloh4Nw/KwfZrC9mNFkCykNFtfHKok/img.png&quot; data-alt=&quot;rotation 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4FG7o/btsAPloh4Nw/KwfZrC9mNFkCykNFtfHKok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4FG7o%2FbtsAPloh4Nw%2FKwfZrC9mNFkCykNFtfHKok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;363&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;rotation 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;useFrame 훅 사용 ( 자동 회전 모션 추가 )&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 React의 useRef 를 이용해 이전에 만들어 놓은 mesh 상자를 참조시킨다&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R3F에서 제공하는 useFrame 훅 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 프레임이 렌더링 되기 직전에 실행하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매 프레임마다 mesh의 rotation값을 변경하여 회전효과를 줄 것이다&lt;/p&gt;
&lt;pre id=&quot;code_1700806901414&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { useRef } from 'react';
import { useFrame } from '@react-three/fiber';

const Box3D = () =&amp;gt; {
    const refMesh = useRef();
    useFrame((state, delta) =&amp;gt; {
        // delta - 이전 프레임과 현재 프레임 사이의 경과시간 ms
        refMesh.current.rotation.y += delta;
    });
    return (
        &amp;lt;&amp;gt;
            &amp;lt;directionalLight position={[1, 1, 1]} /&amp;gt; {/* 직사광 추가 */}
            &amp;lt;axesHelper /&amp;gt;
            &amp;lt;mesh ref={refMesh} rotation={[0, (45 * Math.PI) / 180, 0]}&amp;gt;
                {/* x축으로 0도, y축으로 45도, x축으로 0도 만큼 회전해라 */}
                &amp;lt;boxGeometry /&amp;gt;
                &amp;lt;meshStandardMaterial color={'blue'} /&amp;gt;
            &amp;lt;/mesh&amp;gt;
        &amp;lt;/&amp;gt;
    );
};

export default Box3D;&lt;/code&gt;&lt;/pre&gt;

            &lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
                &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
            &lt;/figure&gt;
        
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Three.js</category>
      <category>R3F</category>
      <category>React Three</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/53</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-R3FReact-Three-Fiber#entry53comment</comments>
      <pubDate>Fri, 24 Nov 2023 14:58:47 +0900</pubDate>
    </item>
    <item>
      <title>[React] Cypress로 E2E 테스트</title>
      <link>https://jj-k-ul.tistory.com/entry/React-Cypress%EB%A1%9C-E2E-%ED%85%8C%EC%8A%A4%ED%8A%B8</link>
      <description>&lt;h1 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;E2E 테스트&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;(&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;End-to-End&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;사용자의&amp;nbsp;관점에서&amp;nbsp;애플리케이션을&amp;nbsp;테스트&lt;br /&gt;애플리케이션의&amp;nbsp;모든&amp;nbsp;부분이&amp;nbsp;의도한&amp;nbsp;대로&amp;nbsp;작동하는지&amp;nbsp;확인하는&amp;nbsp;데&amp;nbsp;중점을&amp;nbsp;둔다&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1699939097154&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;cypress&quot; data-og-description=&quot;Cypress is a next generation front end testing tool built for the modern web. Latest version: 13.5.0, last published: 5 days ago. Start using cypress in your project by running &amp;#96;npm i cypress&amp;#96;. There are 521 other projects in the npm registry using cypress&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/cypress&quot; data-og-url=&quot;https://www.npmjs.com/package/cypress&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bltbRJ/hyUyAdjGNX/4SrDsKkaftz2xnKqM0UeHK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/cypress&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/cypress&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bltbRJ/hyUyAdjGNX/4SrDsKkaftz2xnKqM0UeHK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;cypress&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Cypress is a next generation front end testing tool built for the modern web. Latest version: 13.5.0, last published: 5 days ago. Start using cypress in your project by running `npm i cypress`. There are 521 other projects in the npm registry using cypress&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라이브러리 install&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699939109955&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install --dev cypress
yarn add --dev cypress&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cypress 공식 사이트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 친절하다&lt;/p&gt;
&lt;figure id=&quot;og_1699939152374&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Why Cypress? | Cypress Documentation&quot; data-og-description=&quot;What you'll learn&quot; data-og-host=&quot;docs.cypress.io&quot; data-og-source-url=&quot;https://docs.cypress.io/guides/overview/why-cypress&quot; data-og-url=&quot;https://docs.cypress.io/guides/overview/why-cypress&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hya9a/hyUyk9nRAk/KtOaSViG8z5jqrFNoRw3F1/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/blLZkO/hyUuRHKwGK/tvoJ7F6uU7S2cIKjwTvSp0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/dszs33/hyUyvb0yRN/XkUbIIKyXiBI40ybjrz3OK/img.png?width=2555&amp;amp;height=1417&amp;amp;face=0_0_2555_1417&quot;&gt;&lt;a href=&quot;https://docs.cypress.io/guides/overview/why-cypress&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.cypress.io/guides/overview/why-cypress&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hya9a/hyUyk9nRAk/KtOaSViG8z5jqrFNoRw3F1/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/blLZkO/hyUuRHKwGK/tvoJ7F6uU7S2cIKjwTvSp0/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300,https://scrap.kakaocdn.net/dn/dszs33/hyUyvb0yRN/XkUbIIKyXiBI40ybjrz3OK/img.png?width=2555&amp;amp;height=1417&amp;amp;face=0_0_2555_1417');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Why Cypress? | Cypress Documentation&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;What you'll learn&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.cypress.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;package.json&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scripts 추가&lt;/p&gt;
&lt;pre id=&quot;code_1699939196751&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;scripts&quot;: {
  &quot;cypress:open&quot;: &quot;cypress open&quot;
},&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;typescript를 사용한다면 &lt;b&gt;tsconfig.json&lt;/b&gt;에도 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**cy.ts파일에서 cy를 찾을 수 없다고 ( cannot find name cy&amp;nbsp; ) 소스코드에서 빨갛게 표시가 되었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;compilerOptions : types&quot;: [&quot;cypress&quot;] 넣으니 해결&lt;/p&gt;
&lt;pre id=&quot;code_1699939329530&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;compilerOptions&quot;: {
    &quot;types&quot;: [&quot;cypress&quot;]
  },
  &quot;include&quot;: [&quot;./cypress/**/*&quot;]
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cypress.config.ts &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 새로 추가&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;baseUrl에 test할 페이지 주소를 넣어준다&lt;/p&gt;
&lt;pre id=&quot;code_1699939408629&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { defineConfig } from 'cypress';

export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:1234',
  },
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cypress:open: &quot;cypress open&quot;를 실행하면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cO2d58/btsAmqoRYfv/0dKKg1e6tW92KVm7lWbXpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cO2d58/btsAmqoRYfv/0dKKg1e6tW92KVm7lWbXpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cO2d58/btsAmqoRYfv/0dKKg1e6tW92KVm7lWbXpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcO2d58%2FbtsAmqoRYfv%2F0dKKg1e6tW92KVm7lWbXpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;768&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1170&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;E2E Testing 클릭 하면 에러 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/90Y6O/btsAi4tBSxg/qo1AEtQhxIuTr7Ba3RUEZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/90Y6O/btsAi4tBSxg/qo1AEtQhxIuTr7Ba3RUEZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/90Y6O/btsAi4tBSxg/qo1AEtQhxIuTr7Ba3RUEZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F90Y6O%2FbtsAi4tBSxg%2Fqo1AEtQhxIuTr7Ba3RUEZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;437&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;437&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;209&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cg0jqm/btsAjuZIAHs/8dvGAVMKQH0VR2AR5qiPI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cg0jqm/btsAjuZIAHs/8dvGAVMKQH0VR2AR5qiPI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cg0jqm/btsAjuZIAHs/8dvGAVMKQH0VR2AR5qiPI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcg0jqm%2FbtsAjuZIAHs%2F8dvGAVMKQH0VR2AR5qiPI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;209&quot; height=&quot;50&quot; data-origin-width=&quot;209&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시키는 대로 cypress&amp;nbsp;&amp;gt;&amp;nbsp;support&amp;nbsp;&amp;gt;&amp;nbsp;e2e.ts&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더와&amp;nbsp;ts&amp;nbsp;파일을&amp;nbsp;만들어서&amp;nbsp;준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( 자동으로 생성될거같은데 아니네... )&lt;br /&gt;e2e.ts 내용은 비어있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 맞는지는 좀더 알아봐야겠다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더와 파일 생성 후 E2E Testing 누르면 브라우저를 고르라고 한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmSkjS/btsAm3z8Hil/NTQm7vbuxvaV1YRIIBQhV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmSkjS/btsAm3z8Hil/NTQm7vbuxvaV1YRIIBQhV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmSkjS/btsAm3z8Hil/NTQm7vbuxvaV1YRIIBQhV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmSkjS%2FbtsAm3z8Hil%2FNTQm7vbuxvaV1YRIIBQhV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;407&quot; data-origin-width=&quot;591&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬으로 진행하고 start 하면 크롬창이 하나 뜬다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEI6Hm/btsAjvj4YOY/k2ai1oJKbe9rHQoRqVPDCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEI6Hm/btsAjvj4YOY/k2ai1oJKbe9rHQoRqVPDCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEI6Hm/btsAjvj4YOY/k2ai1oJKbe9rHQoRqVPDCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEI6Hm%2FbtsAjvj4YOY%2Fk2ai1oJKbe9rHQoRqVPDCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1123&quot; height=&quot;686&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wHiX9/btsAkl2u2Gz/xkLHoYwYuMKJvCgLJkptu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wHiX9/btsAkl2u2Gz/xkLHoYwYuMKJvCgLJkptu0/img.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;346&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;54.83&quot; data-filename=&quot;blob&quot; style=&quot;width: 54.1927%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wHiX9/btsAkl2u2Gz/xkLHoYwYuMKJvCgLJkptu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwHiX9%2FbtsAkl2u2Gz%2FxkLHoYwYuMKJvCgLJkptu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;346&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cexRMz/btsAjPbEYq1/L8w5xqXyxZORk9IXJnjYoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cexRMz/btsAjPbEYq1/L8w5xqXyxZORk9IXJnjYoK/img.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;420&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;45.17&quot; data-filename=&quot;blob&quot; style=&quot;width: 44.6445%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cexRMz/btsAjPbEYq1/L8w5xqXyxZORk9IXJnjYoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcexRMz%2FbtsAjPbEYq1%2FL8w5xqXyxZORk9IXJnjYoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;420&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Create&amp;nbsp;new&amp;nbsp;spec으로&amp;nbsp;새로운&amp;nbsp;E2E&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;277&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NI9Fg/btsAcT0LeSU/IOXfsx0MjU6knW6CY2fva1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NI9Fg/btsAcT0LeSU/IOXfsx0MjU6knW6CY2fva1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NI9Fg/btsAcT0LeSU/IOXfsx0MjU6knW6CY2fva1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNI9Fg%2FbtsAcT0LeSU%2FIOXfsx0MjU6knW6CY2fva1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;277&quot; height=&quot;115&quot; data-origin-width=&quot;277&quot; data-origin-height=&quot;115&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_1699943744364&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;describe('계정 생성', () =&amp;gt; {
  it('계정 생성 하기 버튼을 클릭하여 계정 생성', () =&amp;gt; {
    cy.visit('/login');
    cy.get('#joinBtn').click();
    cy.get('#joinEmail').type('naver@naver.com');
    cy.get('#joinPassword').type('naver@naver.com');
    cy.get('#joinConfirmPassword').type('test');
    cy.get('#joinName').type('naver@naver.com');

    cy.get('#joinName').clear().type('나는테스트');
    cy.get('#joinConfirmPassword').clear().type('naver@naver.com');
    cy.get('.btn').click();
    cy.get('#resultDone').click();
  });
});&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;1669&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOWV6a/btsAki5No7z/GnC45ekt1X0J8YEUF96dRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOWV6a/btsAki5No7z/GnC45ekt1X0J8YEUF96dRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOWV6a/btsAki5No7z/GnC45ekt1X0J8YEUF96dRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOWV6a%2FbtsAki5No7z%2FGnC45ekt1X0J8YEUF96dRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1669&quot; height=&quot;932&quot; data-origin-width=&quot;1669&quot; data-origin-height=&quot;932&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>React</category>
      <category>CYPRESS</category>
      <category>e2e</category>
      <category>react</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/51</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-Cypress%EB%A1%9C-E2E-%ED%85%8C%EC%8A%A4%ED%8A%B8#entry51comment</comments>
      <pubDate>Tue, 14 Nov 2023 15:12:18 +0900</pubDate>
    </item>
    <item>
      <title>[React] react-csv 사용 데이터 csv 파일 다운로드</title>
      <link>https://jj-k-ul.tistory.com/entry/React-react-csv-%EC%82%AC%EC%9A%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C</link>
      <description>&lt;h1&gt;[React] react-csv 라이브러리로 데이터를 CSV 파일로 다운로드하기&lt;/h1&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.npmjs.com/package/react-csv&quot;&gt;React-csv 공식 문서 바로가기&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;React에서 JSON 데이터를 간편하게 CSV 형식으로 변환하고 다운로드할 수 있게 해주는 &lt;strong&gt;react-csv&lt;/strong&gt; 라이브러리 사용법&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1.   react-csv 라이브러리 설치&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYZfDX/btsA4cZaqnb/k5LcvU4hiyyNuLEA0ksz1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYZfDX/btsA4cZaqnb/k5LcvU4hiyyNuLEA0ksz1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYZfDX/btsA4cZaqnb/k5LcvU4hiyyNuLEA0ksz1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYZfDX%2FbtsA4cZaqnb%2Fk5LcvU4hiyyNuLEA0ksz1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;371&quot; height=&quot;188&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install react-csv
npm install @types/react-csv
or
yarn add react-csv
yarn add @types/react-csv&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;CSVLink 와 CSVDownload&lt;/h3&gt;
&lt;p&gt;CSVLink, CSVDownload -&amp;gt; 두 가지 방식의 컴포넌트를 제공&lt;/p&gt;
&lt;h4&gt;CSVLink&lt;/h4&gt;
&lt;p&gt;- 해당 링크를 &lt;strong&gt;클릭하면&lt;/strong&gt; csv 파일이 다운로드된다 (일반적)&lt;/p&gt;
&lt;h4&gt;CSVDownload&lt;/h4&gt;
&lt;p&gt;- 컴포넌트가 &lt;strong&gt;렌더링(마운트)되는 즉시&lt;/strong&gt; csv 파일이 &lt;strong&gt;자동&lt;/strong&gt; 다운로드된다&lt;/p&gt;
&lt;h2&gt;2. header, data 설정&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// header 설정
// label은 엑셀 상단에 노출될 이름, key는 데이터의 객체 키와 매칭
const headers = [
  { label: &amp;quot;Name&amp;quot;, key: &amp;quot;name&amp;quot; },
  { label: &amp;quot;Email&amp;quot;, key: &amp;quot;email&amp;quot; },
  { label: &amp;quot;Gender&amp;quot;, key: &amp;quot;gender&amp;quot; }
  { label: &amp;quot;Phone&amp;quot;, key: &amp;quot;phone&amp;quot; }
]

// 데이터 설정
// headers의 key와 일치하는 프로퍼티를 가진 객체 배열
const data = [
  { name: &amp;quot;홍길동&amp;quot;, email: &amp;quot;aaa@bbb.com&amp;quot;, gender: &amp;quot;남&amp;quot;, phone:&amp;quot;01012345678&amp;quot;},
  { name: &amp;quot;고길동&amp;quot;, email: &amp;quot;aaa@bbb.com&amp;quot;, gender: &amp;quot;여&amp;quot;, phone:&amp;quot;01010101010&amp;quot;},
  { name: &amp;quot;이길동&amp;quot;, email: &amp;quot;aaa@bbb.com&amp;quot;, gender: &amp;quot;남&amp;quot;, phone:&amp;quot;01098765432&amp;quot;},
];&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;header의 label은 csv 파일 시트에 표시되는 값 (th 같은 값)&lt;br&gt;*&lt;em&gt;  header의 key값과 data의 key값이 같아야 보여진다 *&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;3. 컴포넌트 적용&lt;/h2&gt;
&lt;p&gt;파일명에 날짜를 포함시키는 경우 -&amp;gt; &lt;strong&gt;moment&lt;/strong&gt;, &lt;strong&gt;date-fns&lt;/strong&gt; 라이브러리 사용&lt;/p&gt;
&lt;h3&gt;CSVLink 사용 (클릭 시 다운로드)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import { CSVLink, CSVDownload }  from &amp;#39;react-csv&amp;#39;;
import moment from &amp;#39;moment/moment&amp;#39;;
import { format } from &amp;#39;date-fns&amp;#39;;

&amp;lt;CSVLink
      headers={headers}
      data={data}
      className=&amp;quot;btn btn-csv&amp;quot;
      target=&amp;quot;_blank&amp;quot;

      // 1. moment를 사용하는 경우

     filename={`${moment(startDate).format(&amp;#39;YYYY.MM.DD&amp;#39;)}_${moment(endDate).format(&amp;#39;YYYY.MM.DD&amp;#39;)}_user_data.csv`}

      // 2. date-fns를 사용하는 경우

      filename={`${format(new Date(startDate), &amp;#39;yyyy.MM.dd&amp;#39;)}_${format(new Date(endDate), &amp;#39;yyyy.MM.dd&amp;#39;)}_user_data.csv`}
&amp;gt;
      엑셀(CSV) 다운로드
&amp;lt;/CSVLink&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;CSVDownload 사용 (마운트 시 즉시 다운로드)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import { CSVLink, CSVDownload }  from &amp;#39;react-csv&amp;#39;;

&amp;lt;CSVDownload headers={headers} data={data} target=&amp;quot;_blank&amp;quot; /&amp;gt;;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;⚠️ csv 파일(텍스트 기반의 데이터 형식)이라 스타일(글자 색상, 배경색, 셀 병합)은 입힐 수 없다&lt;/h3&gt;</description>
      <category>메모같은기록</category>
      <category>react-csv</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/50</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-react-csv-%EC%82%AC%EC%9A%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-csv-%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C#entry50comment</comments>
      <pubDate>Tue, 7 Nov 2023 11:40:34 +0900</pubDate>
    </item>
    <item>
      <title>[React] exceljs 사용 데이터 엑셀 다운로드</title>
      <link>https://jj-k-ul.tistory.com/entry/React-exceljs-%EC%82%AC%EC%9A%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%91%EC%85%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;기존엔 react-csv를 사용했는데 한국어 입력시 오류가 나서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 라이브러리를 찾아보았다&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;exceljs와 file-saver 라이브러리인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exceljs만으로는 아쉽게도 client쪽에서 엑셀 다운로드가 지원되지 않는다고 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exceljs - JavaScript 환경에서 엑셀 파일을 생성, 수정, 읽기, 쓰기 기능을 하는 라이브러리&lt;/p&gt;
&lt;figure id=&quot;og_1726805508527&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;exceljs&quot; data-og-description=&quot;Excel Workbook Manager - Read and Write xlsx and csv Files.. Latest version: 4.4.0, last published: a year ago. Start using exceljs in your project by running &amp;#96;npm i exceljs&amp;#96;. There are 1565 other projects in the npm registry using exceljs.&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/exceljs&quot; data-og-url=&quot;https://www.npmjs.com/package/exceljs&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tdEoP/hyW6DeA4JD/5cDi0BemxEuo4s8O5K8XWK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/exceljs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/exceljs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tdEoP/hyW6DeA4JD/5cDi0BemxEuo4s8O5K8XWK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;exceljs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Excel Workbook Manager - Read and Write xlsx and csv Files.. Latest version: 4.4.0, last published: a year ago. Start using exceljs in your project by running `npm i exceljs`. There are 1565 other projects in the npm registry using exceljs.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file-saver - 클라이언트에서&amp;nbsp;파일&amp;nbsp;저장을&amp;nbsp;도와주는&amp;nbsp;라이브러리&lt;/p&gt;
&lt;figure id=&quot;og_1726805460738&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;file-saver&quot; data-og-description=&quot;An HTML5 saveAs() FileSaver implementation. Latest version: 2.0.5, last published: 4 years ago. Start using file-saver in your project by running &amp;#96;npm i file-saver&amp;#96;. There are 5105 other projects in the npm registry using file-saver.&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/package/file-saver&quot; data-og-url=&quot;https://www.npmjs.com/package/file-saver&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/01ngJ/hyW6GWHMzd/zppMUfu43WgNYKTjPKVtCK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/package/file-saver&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/package/file-saver&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/01ngJ/hyW6GWHMzd/zppMUfu43WgNYKTjPKVtCK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;file-saver&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An HTML5 saveAs() FileSaver implementation. Latest version: 2.0.5, last published: 4 years ago. Start using file-saver in your project by running `npm i file-saver`. There are 5105 other projects in the npm registry using file-saver.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;라이브러리 install&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1699321811976&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install exceljs
npm install @types/exceljs

yarn add file-saver
yarn add @types/file-saver&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699321131090&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { Workbook } from 'exceljs';
import { saveAs } from 'file-saver';

const workbook = new Workbook();
const sheet1 = workbook.addWorksheet('엑셀 시트1');
const sheet2 = workbook.addWorksheet('엑셀 시트2');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/49</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-exceljs-%EC%82%AC%EC%9A%A9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%97%91%EC%85%80-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C#entry49comment</comments>
      <pubDate>Tue, 7 Nov 2023 10:56:05 +0900</pubDate>
    </item>
    <item>
      <title>[React] React.memo &amp;amp; useMemo</title>
      <link>https://jj-k-ul.tistory.com/entry/React-Reactmemo-useMemo</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;React.memo는 컴포넌트 자체의 렌더링을 최적화하는 데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useMemo는 특정 값이나 변수의 계산된 값을 저장하여 재계산을 방지하는 데 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1699251441050&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;export default React.memo(Component);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트의 렌더링 최적화를 위해 React.memo를 사용하는 것만으로 충분할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useMemo는 특정 변수에 대한 성능 최적화를 위해 추가적으로 사용될 수 있다.&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/48</guid>
      <comments>https://jj-k-ul.tistory.com/entry/React-Reactmemo-useMemo#entry48comment</comments>
      <pubDate>Mon, 6 Nov 2023 15:17:35 +0900</pubDate>
    </item>
    <item>
      <title>[에러일지] Next.js: &amp;quot;url&amp;quot; parameter is not allowed</title>
      <link>https://jj-k-ul.tistory.com/entry/Next-JS-url-parameter-is-not-allowed</link>
      <description>&lt;h1&gt;[Next.js] Image 태그 외부 리소스 에러: &amp;quot;url&amp;quot; parameter is not allowed&lt;/h1&gt;
&lt;p&gt;Next.js에서 &lt;code&gt;next/image&lt;/code&gt; 컴포넌트를 사용하여 외부 이미지를 사용하려 할 때 발생&lt;br&gt;보안 설정으로 인해 이미지가 엑스박스로 뜨거나, &lt;code&gt;&amp;quot;url&amp;quot; parameter is not allowed&lt;/code&gt;라는 에러 메시지 표시&lt;/p&gt;
&lt;h2&gt;  문제 현상&lt;/h2&gt;
&lt;p&gt;import Image from &amp;quot;next/image&amp;quot;&lt;br&gt;Next.js 코드에서 외부 URL 이미지를 사용하려 할 때 발생&lt;/p&gt;
&lt;p&gt;이미지 최적화 Image 태그에서 외부 리소스가 적용하지 않음&lt;/p&gt;
&lt;p&gt;이미지 URL을 주소창에 직접 입력하면 잘 나오지만, 프로젝트 내 &lt;Image&gt; 태그를 통해서는 렌더링되지 않음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;24&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWduf9/btszKE8TI4C/QxMlOeYge5ReIfhqESpX8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWduf9/btszKE8TI4C/QxMlOeYge5ReIfhqESpX8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWduf9/btszKE8TI4C/QxMlOeYge5ReIfhqESpX8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWduf9%2FbtszKE8TI4C%2FQxMlOeYge5ReIfhqESpX8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;231&quot; height=&quot;24&quot; data-origin-width=&quot;231&quot; data-origin-height=&quot;24&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;✅ 해결 방법&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;domains&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;next.config.js 파일에서 domains 수정 -&amp;gt; 외부 이미지 도메인을 명시적으로 허용&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;module.exports = {
  images: {
    domains: [images.url.com], // 허용할 도메인 주소입력
  },
};&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;보안상의 이유로 애플리케이션이 특정 도메인에서만 이미지를 허용할 때 사용함&lt;/p&gt;
&lt;h3&gt;2. &lt;strong&gt;remotePatterns&lt;/strong&gt; (권장 방식) ⭐&lt;/h3&gt;
&lt;p&gt;보다 유연한 이미지 로딩 패턴을 정의하는 데 사용&lt;br&gt;다양한 도메인에서 이미지를 가져와야 하는 경우, 프로토콜과 호스트 이름을 유연하게 설정할 수 있다&lt;br&gt;&lt;strong&gt;Next.js 14 이상 권장&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  images: {
    remotePatterns: [
      {
        protocol: &amp;#39;https&amp;#39;,
        hostname: &amp;#39;domains.com&amp;#39;, // 와일드카드(*) 사용 가능
        port: &amp;#39;&amp;#39;,
        pathname: &amp;#39;/**&amp;#39;, // 모든 경로 허용
      },
    ],
  },&lt;/code&gt;&lt;/pre&gt;</description>
      <category>에러일지</category>
      <category>nextjs</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/47</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Next-JS-url-parameter-is-not-allowed#entry47comment</comments>
      <pubDate>Fri, 3 Nov 2023 16:04:49 +0900</pubDate>
    </item>
    <item>
      <title>[Axios] interceptors</title>
      <link>https://jj-k-ul.tistory.com/entry/Axios-interceptors</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Axios&amp;nbsp;interceptors는&amp;nbsp;then&amp;nbsp;또는&amp;nbsp;catch로&amp;nbsp;처리되기&amp;nbsp;전에&amp;nbsp;요청과&amp;nbsp;응답을&amp;nbsp;가로챌수&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1695718565976&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import axios from 'axios';

요청 전 
axios.interceptors.request.use(
  (config) =&amp;gt; {
   // 요청이 전달되기 전에 작업 수행
    return config;
  },
  (error) =&amp;gt; {
   // 요청 오류가 있는 작업 수행
    return Promise.reject(error);
  },
);

응답 전
axios.interceptors.response.use(
  (response) =&amp;gt; {
   // 응답 데이터가 있는 작업 수행
    return response;
  },
  (error) =&amp;gt; {
  // 응답 오류가 있는 작업 수행
    if (error.response?.status === 401) {
    console.log('error', error.response);
    }
    return Promise.reject(error);
  },
);&lt;/code&gt;&lt;/pre&gt;</description>
      <category>메모같은기록</category>
      <category>axios</category>
      <category>interceptors</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/46</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Axios-interceptors#entry46comment</comments>
      <pubDate>Tue, 26 Sep 2023 17:56:24 +0900</pubDate>
    </item>
    <item>
      <title>[Flutter] Text Overflow 문자 줄바꿈, 말줄임, 페이드</title>
      <link>https://jj-k-ul.tistory.com/entry/Flutter-Text-Overflow-%EB%AC%B8%EC%9E%90-%EC%A4%84%EB%B0%94%EA%BF%88-%EB%A7%90%EC%A4%84%EC%9E%84-%ED%8E%98%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h1&gt;[Flutter] TextOverflow 완벽 가이드: 문자 줄바꿈, 말줄임(...), 페이드 효과&lt;/h1&gt;
&lt;h2&gt;기본 Text Widget (정상 출력)&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;113&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTPFEv/btstTqPLHyr/7QWNod4z8OwYQI42zXxwTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTPFEv/btstTqPLHyr/7QWNod4z8OwYQI42zXxwTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTPFEv/btstTqPLHyr/7QWNod4z8OwYQI42zXxwTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTPFEv%2FbtstTqPLHyr%2F7QWNod4z8OwYQI42zXxwTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;113&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;113&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Text(
  &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
  style: TextStyle(
    fontSize: 18,
    fontWeight: FontWeight.w500,
    color: WhiteColor,
  ),
),&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;TextOverflow.clip (경계에서 자르기) ✂️&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Su4MG/btstNAMEVHZ/KdlWLVMuTGjikfXZDyOmuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Su4MG/btstNAMEVHZ/KdlWLVMuTGjikfXZDyOmuK/img.png&quot; data-alt=&quot;TextOverflow.clip&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Su4MG/btstNAMEVHZ/KdlWLVMuTGjikfXZDyOmuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSu4MG%2FbtstNAMEVHZ%2FKdlWLVMuTGjikfXZDyOmuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;90&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TextOverflow.clip&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;부모 위젯의 경계를 벗어나면 텍스트를 그냥 잘라버려 표시되지 않는다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SizedBox(
  width: double.infinity,
  height: 50,
  child: Text(
    &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
    style: TextStyle(
      fontSize: 18,
      fontWeight: FontWeight.w500,
      color: WhiteColor,
    ),
    overflow: TextOverflow.clip,
  ),
),&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;TextOverflow.fade (흐려지는 효과)  ️&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXTnEF/btstQUYr5bT/oVAVb8aS8vgIuo88pIQ541/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXTnEF/btstQUYr5bT/oVAVb8aS8vgIuo88pIQ541/img.png&quot; data-alt=&quot;TextOverflow.fade&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXTnEF/btstQUYr5bT/oVAVb8aS8vgIuo88pIQ541/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXTnEF%2FbtstQUYr5bT%2FoVAVb8aS8vgIuo88pIQ541%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;90&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TextOverflow.fade&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;텍스트가 끝부분에서 서서히 사라지는 듯한 효과&lt;/p&gt;
&lt;h3&gt;수직 페이드 (기본값)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;SizedBox(
  width: double.infinity,
  height: 50,
  child: Text(
    &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
    style: TextStyle(
      fontSize: 18,
      fontWeight: FontWeight.w500,
      color: WhiteColor,
    ),
    overflow: TextOverflow.fade,
  ),
),&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;fade 효과 수평으로 (오른쪽 끝 효과)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D933R/btstMCKOBhQ/C2Kn1sU85sa1iAsPaj8kb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D933R/btstMCKOBhQ/C2Kn1sU85sa1iAsPaj8kb0/img.png&quot; data-alt=&quot;TextOverflow.fade -&amp;amp;amp;nbsp;softWrap: false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D933R/btstMCKOBhQ/C2Kn1sU85sa1iAsPaj8kb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD933R%2FbtstMCKOBhQ%2FC2Kn1sU85sa1iAsPaj8kb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;73&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TextOverflow.fade -&amp;amp;nbsp;softWrap: false&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;softWrap: false 를 넣어야 우리한테 익숙한 오른쪽 끝에서 텍스트가 흐려지는 효과를 줄 수 있다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SizedBox(
  width: double.infinity,
  height: 50,
  child: Text(
    &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
    style: TextStyle(
      fontSize: 18,
      fontWeight: FontWeight.w500,
      color: WhiteColor,
    ),
    softWrap: false,
    overflow: TextOverflow.fade,
  ),
),&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;TextOverflow.ellipsis (말줄임표 ...)  &lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFkTBC/btstTaGde74/vanJm1DmPY0o2LUUqKTmwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFkTBC/btstTaGde74/vanJm1DmPY0o2LUUqKTmwk/img.png&quot; data-alt=&quot;TextOverflow.ellipsis&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFkTBC/btstTaGde74/vanJm1DmPY0o2LUUqKTmwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFkTBC%2FbtstTaGde74%2FvanJm1DmPY0o2LUUqKTmwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;74&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TextOverflow.ellipsis&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;말줄임표 ...&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Text(
  &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
  style: TextStyle(
    fontSize: 18,
    fontWeight: FontWeight.w500,
    color: WhiteColor,
  ),
  overflow: TextOverflow.ellipsis,
),&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;ellipsis 여러 줄(Multi-line) 말줄임&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dz79HW/btstMDbPpro/QFbrKVPvATRLD8sP9EGZTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dz79HW/btstMDbPpro/QFbrKVPvATRLD8sP9EGZTK/img.png&quot; data-alt=&quot;TextOverflow.ellipsis&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dz79HW/btstMDbPpro/QFbrKVPvATRLD8sP9EGZTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdz79HW%2FbtstMDbPpro%2FQFbrKVPvATRLD8sP9EGZTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;86&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TextOverflow.ellipsis&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;2줄 이상의 말줄임표를 주고 싶을때 &lt;strong&gt;maxLines&lt;/strong&gt; 추가&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Text(
  &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
  style: TextStyle(
    fontSize: 18,
    fontWeight: FontWeight.w500,
    color: WhiteColor,
  ),
  overflow: TextOverflow.ellipsis,
  maxLines: 2, // 2줄까지만 보여주고 이후는 ... 처리
),&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;TextOverflow.visible (넘쳐도 그대로 출력)  ️&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GvLKk/btstVftK1ze/0LwWFF8OtrgFhpRgk2kaSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GvLKk/btstVftK1ze/0LwWFF8OtrgFhpRgk2kaSk/img.png&quot; data-alt=&quot;TextOverflow.visible&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GvLKk/btstVftK1ze/0LwWFF8OtrgFhpRgk2kaSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGvLKk%2FbtstVftK1ze%2F0LwWFF8OtrgFhpRgk2kaSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;110&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TextOverflow.visible&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;clip과 반대로 &lt;strong&gt;경계를 벗어나도 잘리지 않고 그대로&lt;/strong&gt; 나타난다&lt;br&gt;⚠️ 다른 위젯과 겹칠 수 있다&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Container(
  width: double.infinity,
  height: 50,
  color: Colors.blue,
  child: const Text(
    &amp;#39;나는 언덕 잔디가 이 지나가는 헤는 것은 하나에 있습니다. 아무 가을 책상을 아이들의 위에도 하나에 이웃 내린 위에 봅니다.&amp;#39;,
    style: TextStyle(
      fontSize: 18,
      fontWeight: FontWeight.w500,
      color: WhiteColor,
    ),
    overflow: TextOverflow.visible,
    // maxLines: 2,
  ),
),&lt;/code&gt;&lt;/pre&gt;</description>
      <category>메모같은기록</category>
      <category>Flutter</category>
      <category>textoverflow</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/45</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Flutter-Text-Overflow-%EB%AC%B8%EC%9E%90-%EC%A4%84%EB%B0%94%EA%BF%88-%EB%A7%90%EC%A4%84%EC%9E%84-%ED%8E%98%EC%9D%B4%EB%93%9C#entry45comment</comments>
      <pubDate>Wed, 13 Sep 2023 14:22:33 +0900</pubDate>
    </item>
    <item>
      <title>[에러일지] Pass 본인인증 Window: message 이벤트</title>
      <link>https://jj-k-ul.tistory.com/entry/%EC%97%90%EB%9F%AC%EC%9D%BC%EC%A7%80-Pass-%EB%B3%B8%EC%9D%B8%EC%9D%B8%EC%A6%9D-Window-message-%EC%9D%B4%EB%B2%A4%ED%8A%B8</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Window: message 이벤트&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새창을&amp;nbsp;띄워&amp;nbsp;PASS&amp;nbsp;본인인증을&amp;nbsp;하였지만&amp;nbsp;본인인증 버튼를 누른 (현재) 페이지에서는&amp;nbsp;본인인증이&amp;nbsp;완료&amp;nbsp;되었는지&amp;nbsp;모름&lt;/p&gt;
&lt;!-- 티스토리수평형광고 --&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메세지&amp;nbsp;수신을&amp;nbsp;위해&amp;nbsp;사용함&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;useEffect(() =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.addEventListener('message', (event) =&amp;gt; {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const { verified } = event.data;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (verified) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;axios
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.post(`${backUrl}/api/account/identification`, {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name: event.data.name,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;birthdate: event.data.birthdate,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gender: event.data.gender,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CI: event.data.CI,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;phoneNumber: event.data.phoneNumber,
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.then((response) =&amp;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;console.log(response);
&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.catch((error) =&amp;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;console.log(error.response);
&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;&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;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;}, []);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;본인인증 후 받아온 값을 서버에 넘겨주고 .then 에서 페이지 이동 or 현재 페이지에서 이벤트 실행&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>에러일지</category>
      <category>react</category>
      <category>본인인증</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/44</guid>
      <comments>https://jj-k-ul.tistory.com/entry/%EC%97%90%EB%9F%AC%EC%9D%BC%EC%A7%80-Pass-%EB%B3%B8%EC%9D%B8%EC%9D%B8%EC%A6%9D-Window-message-%EC%9D%B4%EB%B2%A4%ED%8A%B8#entry44comment</comments>
      <pubDate>Tue, 12 Sep 2023 14:35:45 +0900</pubDate>
    </item>
    <item>
      <title>flutter secure storage</title>
      <link>https://jj-k-ul.tistory.com/entry/flutter-secure-storage</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1160659047086768&quot; data-mce-fragment=&quot;1&quot;&gt;&lt;/script&gt;
&lt;!-- 티스토리수평형광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-1160659047086768&quot; data-ad-slot=&quot;3364846236&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script data-mce-fragment=&quot;1&quot;&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
디바이스 내부에 정보를 저장하기 위함&lt;/li&gt;
&lt;li&gt;Android에서는 keystore 영역, iOS에서는 keychain 내부 저장소 영역을 사용&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>메모같은기록</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/40</guid>
      <comments>https://jj-k-ul.tistory.com/entry/flutter-secure-storage#entry40comment</comments>
      <pubDate>Mon, 28 Aug 2023 11:07:47 +0900</pubDate>
    </item>
    <item>
      <title>토큰과 세션</title>
      <link>https://jj-k-ul.tistory.com/entry/%ED%86%A0%ED%81%B0%EA%B3%BC-%EC%84%B8%EC%85%98</link>
      <description>&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;베이스64 인코딩 된 스트링&lt;/li&gt;
&lt;li&gt;헤더, 페이로드, 시그니처 구성&lt;/li&gt;
&lt;li&gt;데이터베이스에 저장하지 않음 시그니처값을 검증해서 매번 확인 필요없음&lt;/li&gt;
&lt;li&gt;정보가 토큰에 모두 담겨있기에 정보유출 위험&lt;/li&gt;
&lt;/ul&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;유저 정보를 데이터베이스에 저장&lt;/li&gt;
&lt;li&gt;ID값으로 구성 - 클라 요청보낼때 ID같이 보내면 정보받음&lt;/li&gt;
&lt;li&gt;서버에서 생성 , 클라에서 쿠키로 저장&lt;/li&gt;
&lt;li&gt;요청때마다 데이터베이스 매번 확인&lt;/li&gt;
&lt;li&gt;서버저장이므로 클라에서 노출위험 없음&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>메모같은기록</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/39</guid>
      <comments>https://jj-k-ul.tistory.com/entry/%ED%86%A0%ED%81%B0%EA%B3%BC-%EC%84%B8%EC%85%98#entry39comment</comments>
      <pubDate>Mon, 28 Aug 2023 11:07:11 +0900</pubDate>
    </item>
    <item>
      <title>배포할때 yarn.lock 충돌나면</title>
      <link>https://jj-k-ul.tistory.com/entry/%EB%B0%B0%ED%8F%AC%ED%95%A0%EB%95%8C-yarnlock-%EC%B6%A9%EB%8F%8C%EB%82%98%EB%A9%B4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tkQGT/btsA4eQbMh0/jCYrvYxzKNUbrXeU8Ban81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tkQGT/btsA4eQbMh0/jCYrvYxzKNUbrXeU8Ban81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tkQGT/btsA4eQbMh0/jCYrvYxzKNUbrXeU8Ban81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtkQGT%2FbtsA4eQbMh0%2FjCYrvYxzKNUbrXeU8Ban81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;221&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;1. yarn.lock 삭제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제되니 주의 !! 2번은 더 사용할것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rm -rf yarn.lock&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;2. git yarn.lock 받아오기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;git checkout -- yarn.lock&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/36</guid>
      <comments>https://jj-k-ul.tistory.com/entry/%EB%B0%B0%ED%8F%AC%ED%95%A0%EB%95%8C-yarnlock-%EC%B6%A9%EB%8F%8C%EB%82%98%EB%A9%B4#entry36comment</comments>
      <pubDate>Wed, 26 Apr 2023 14:17:42 +0900</pubDate>
    </item>
    <item>
      <title>[에러일지] useRef: Object is possibly 'null' 에러</title>
      <link>https://jj-k-ul.tistory.com/entry/%EC%97%90%EB%9F%AC%EC%9D%BC%EC%A7%80-useRef</link>
      <description>&lt;h1&gt;useRef: Object is possibly &amp;#39;null&amp;#39; 에러&lt;/h1&gt;
&lt;p&gt;JavaScript 코드를 TypeScript로 변환하는 중 발생된 에러&lt;br&gt;JavaScript에서는 잘 돌아가던게 에러가 뜬다&lt;/p&gt;
&lt;h2&gt;  에러 메시지&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Object is possibly &amp;#39;null&amp;#39;.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;useRef.PNG&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIXFmM/btr8keKRDDr/7654oqjcQbk0mJ55pY6l9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIXFmM/btr8keKRDDr/7654oqjcQbk0mJ55pY6l9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIXFmM/btr8keKRDDr/7654oqjcQbk0mJ55pY6l9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIXFmM%2Fbtr8keKRDDr%2F7654oqjcQbk0mJ55pY6l9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;175&quot; data-filename=&quot;useRef.PNG&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;원인 분석&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;useRef&lt;/code&gt;의 &lt;code&gt;current&lt;/code&gt; 객체는 &lt;strong&gt;컴포넌트 렌더링이 완료된 후&lt;/strong&gt;에 만들어진다&lt;br&gt;TypeScript는 렌더링 전 &lt;code&gt;current&lt;/code&gt;가 &lt;code&gt;null&lt;/code&gt;일 수 있다는 걸 알기 때문에 에러 발생&lt;/p&gt;
&lt;h2&gt;해결 방법&lt;/h2&gt;
&lt;p&gt;null 여부를 먼저 확인한 후 접근&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (footerRef.current) {
  // null이 아닐 때만 실행
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;✅ 한 줄 정리&lt;/h2&gt;
&lt;p&gt;TypeScript는 &lt;code&gt;useRef.current&lt;/code&gt;가 &lt;code&gt;null&lt;/code&gt;일 수 있다는 걸 안다 — 쓰기 전에 확인하자&lt;/p&gt;</description>
      <category>에러일지</category>
      <category>null</category>
      <category>typescript</category>
      <category>useref</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/19</guid>
      <comments>https://jj-k-ul.tistory.com/entry/%EC%97%90%EB%9F%AC%EC%9D%BC%EC%A7%80-useRef#entry19comment</comments>
      <pubDate>Thu, 6 Apr 2023 17:20:16 +0900</pubDate>
    </item>
    <item>
      <title>[ETC] GitHub 사용해보자</title>
      <link>https://jj-k-ul.tistory.com/entry/GitHub-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub&amp;nbsp;사용해보자&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com&quot;&gt;https://github.com&lt;/a&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;repo.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RWC62/btqvkyzewXC/spAhdbHQoc7zmpjXXXMV51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RWC62/btqvkyzewXC/spAhdbHQoc7zmpjXXXMV51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RWC62/btqvkyzewXC/spAhdbHQoc7zmpjXXXMV51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRWC62%2FbtqvkyzewXC%2FspAhdbHQoc7zmpjXXXMV51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;181&quot; height=&quot;345&quot; data-filename=&quot;repo.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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: #777777;&quot;&gt;로그인 후 Your repositories 페이지에 들어가 준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;New 버튼을 눌러주면 이런 화면 이 뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&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-filename=&quot;open.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b77b33/btqvkxG837h/ErI9eOFEVxYYN3oNlM2EK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b77b33/btqvkxG837h/ErI9eOFEVxYYN3oNlM2EK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b77b33/btqvkxG837h/ErI9eOFEVxYYN3oNlM2EK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb77b33%2FbtqvkxG837h%2FErI9eOFEVxYYN3oNlM2EK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;483&quot; height=&quot;410&quot; data-filename=&quot;open.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Initialize this repository with a README 체크를 안 해주어도 무방하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;온라인 저장소 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;test.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byBR2e/btqvflPoXbQ/rDfUpA6XKr7yP171AM3rs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byBR2e/btqvflPoXbQ/rDfUpA6XKr7yP171AM3rs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byBR2e/btqvflPoXbQ/rDfUpA6XKr7yP171AM3rs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyBR2e%2FbtqvflPoXbQ%2FrDfUpA6XKr7yP171AM3rs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;695&quot; height=&quot;135&quot; data-filename=&quot;test.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;del.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C38xU/btqvibrs7Kq/fHT4KYKpNMTnLGa8Px7wl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C38xU/btqvibrs7Kq/fHT4KYKpNMTnLGa8Px7wl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C38xU/btqvibrs7Kq/fHT4KYKpNMTnLGa8Px7wl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC38xU%2Fbtqvibrs7Kq%2FfHT4KYKpNMTnLGa8Px7wl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;245&quot; data-filename=&quot;del.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; Settings 페이지에 들어가 쭉 내려가&amp;nbsp;&lt;span&gt;Delete this repository 클릭!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;s.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS1ZDC/btqvflWaKgQ/SutykACuucK3ScN2ZFRVdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS1ZDC/btqvflWaKgQ/SutykACuucK3ScN2ZFRVdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS1ZDC/btqvflWaKgQ/SutykACuucK3ScN2ZFRVdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS1ZDC%2FbtqvflWaKgQ%2FSutykACuucK3ScN2ZFRVdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;218&quot; data-filename=&quot;s.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제할 저장소 명을 적으라는 팝업이 뜨는데 적어주고 나면 끝.&lt;b&gt; 삭제!&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;&lt;b&gt;github 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;git bash를 설치하고 열어본다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1557904217486&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global user.name &quot;커밋에 뜰 내 이름&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1557904221916&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global user.email &quot;github 가입할 때 쓴 내 메일&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;b&gt;로컬파일 온라인 저장소에 올리기&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬파일에서&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;git bash열고&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1557904527028&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git init
git remote add origin&amp;nbsp;https://github.com/나의 아이디/온라인 저장소 파일명.git
git add.
git commit -m &quot;커밋명&quot;
git push origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;push 하면 로그인을 하라고 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본인의 github ID와 비밀번호를 치면 &lt;b&gt;업로드 완성! 완성!&lt;/b&gt;&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <category>bash</category>
      <category>github</category>
      <category>온라인 저장소</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/14</guid>
      <comments>https://jj-k-ul.tistory.com/entry/GitHub-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90#entry14comment</comments>
      <pubDate>Wed, 15 May 2019 11:10:34 +0900</pubDate>
    </item>
    <item>
      <title>[Three.js ] Three.js dat.GUI를 이용해보자</title>
      <link>https://jj-k-ul.tistory.com/entry/Threejs-datGUI%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90</link>
      <description>&lt;!-- 티스토리수평형광고 --&gt;
&lt;h1 data-ke-size=&quot;size16&quot;&gt;dat.GUI를 이용해보자&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dat.GUI는 구글의 엔지니어들이 만든 라이브러리로,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dat.GUI가 생성 한 패널 부분에서 매개 변수를 변경하면 이미지의 위치, 크기, 회전 속도 등을 동적으로 반영할 수 있도록 한다. ( 일단 재밌다 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gui.PNG&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byCK2V/btqvgGx0q2j/kkkc2YKiEjrk78W4xOIQ71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byCK2V/btqvgGx0q2j/kkkc2YKiEjrk78W4xOIQ71/img.png&quot; data-alt=&quot;https://threejs.org/ 예제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byCK2V/btqvgGx0q2j/kkkc2YKiEjrk78W4xOIQ71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyCK2V%2FbtqvgGx0q2j%2Fkkkc2YKiEjrk78W4xOIQ71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;526&quot; data-filename=&quot;gui.PNG&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://threejs.org/ 예제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지의 우측 상단에 있는 &lt;span style=&quot;color: #333333;&quot;&gt;UI가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;dat.GUI를 실행하면 나타난다!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;script 추가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://threejs.org/ 사이트에서 파일을 다운로드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 파일(three.js-master) &amp;gt; examples &amp;gt; js &amp;gt; libs &amp;gt; dat.gui.min.js를 사용하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1557797906527&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;WebGL-output&quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;./js/three.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;./js/dat.gui.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;객체 추가&lt;/h2&gt;
&lt;pre id=&quot;code_1557797933702&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
var sphere;		
var controls = new function () {
  this.spherePosX = 0;
  this.spherePosY = 5;
  this.spherePosZ = 0;
  this.sphereScale = 1;
  this.redraw = function () {
    var sphereGeometry = new THREE.SphereGeometry(controls.sphereScale, 50, 50);
    var sphereMaterial = new THREE.MeshLambertMaterial({color: 0xd4db7a});
    sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
    sphere.position.set(controls.spherePosX, controls.spherePosY, controls.spherePosZ);
    scene.add(sphere);
  };		
};
&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;화면 안의 sphere를 X축, Y축, Z축 이동과 크기를 조절하려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;controls의 초기값을 설정한다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dat.gui.png&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nb4aJ/btqviGKJ7qy/DbW1bAgyx5qmoapr4ClkU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nb4aJ/btqviGKJ7qy/DbW1bAgyx5qmoapr4ClkU1/img.png&quot; data-alt=&quot;dat.gui&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nb4aJ/btqviGKJ7qy/DbW1bAgyx5qmoapr4ClkU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnb4aJ%2FbtqviGKJ7qy%2FDbW1bAgyx5qmoapr4ClkU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;246&quot; height=&quot;157&quot; data-filename=&quot;dat.gui.png&quot; data-origin-width=&quot;246&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;dat.gui&lt;/figcaption&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;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;sphere의 크기, 위치의 값 (controls.sphereScale, controls.spherePosX,&amp;nbsp;controls.spherePosY,&amp;nbsp;controls.spherePosZ)을 받아올 것이기 때문에&amp;nbsp;&lt;/span&gt;redraw 함수 안에 따로 넣어 주었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1557800631999&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
  var gui = new dat.GUI();
  guiSphere = gui.addFolder('guiSphere');
  guiSphere.add(controls, 'spherePosX', -20, 20);
  guiSphere.add(controls, 'spherePosY', 5, 20);
  guiSphere.add(controls, 'spherePosZ', -15, 15);
  guiSphere.add(controls, 'sphereScale', 1, 10);
  camera.lookAt(scene.position);
  controls.redraw();
  render();
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;guiSphere라는 folder를 추가한다. -&amp;nbsp;gui.add(controls,&amp;nbsp;'spherePosX',&amp;nbsp;-20,&amp;nbsp;20); 하면 폴더 없이 추가된다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체명 뒤의 숫자는 범위를 나타낸다. (-20 부터 20 까지) 조절 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1557802200505&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
  function render() {          
      sphere.position.x = controls.spherePosX;
      sphere.position.y = controls.spherePosY;
      sphere.position.z = controls.spherePosZ;
      sphere.scale.x = controls.sphereScale;
      sphere.scale.y = controls.sphereScale;
      sphere.scale.z = controls.sphereScale;

      requestAnimationFrame(render);
      renderer.render(scene, camera);
  } 
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sphere의 position.x 값에&amp;nbsp;controls의 spherePosX를 넣어준다.&lt;/p&gt;
&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 class=&quot;codepen&quot; style=&quot;height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;265&quot; data-theme-id=&quot;dark&quot; data-default-tab=&quot;result&quot; data-user=&quot;JaeCool&quot; data-slug-hash=&quot;rgaeRL&quot; data-pen-title=&quot;rgaeRL&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/JaeCool/pen/rgaeRL/&quot;&gt; rgaeRL&lt;/a&gt; by JaeCool (&lt;a href=&quot;https://codepen.io/JaeCool&quot;&gt;@JaeCool&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;</description>
      <category>Three.js</category>
      <category>dat.gui</category>
      <category>three.js</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/12</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Threejs-datGUI%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90#entry12comment</comments>
      <pubDate>Mon, 6 May 2019 23:05:02 +0900</pubDate>
    </item>
    <item>
      <title>[CSS] CSS3 Flex Box 레이아웃</title>
      <link>https://jj-k-ul.tistory.com/entry/CSS3-Flex-Box-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot; &lt;span style=&quot;color: #333333;&quot;&gt;Flexbox&lt;/span&gt;의 장점을 한 마디로 표현하면 '복잡한 계산 없이 요소의 크기와 순서를 유연하게 배치할 수 있다'라고 할 수 있다. 정렬, 방향, 순서, 크기 등을 유연하게 조절할 수 있기 때문에 별도의 분기 처리를 줄일 수 있고, CSS만으로 다양한 레이아웃을 구현할 수 있다 &quot; - 네이버&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&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;오호~&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;caniuse.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3ZGu/btquVx2mjTF/j67fSLzPF3lbeUPL4ZdFuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3ZGu/btquVx2mjTF/j67fSLzPF3lbeUPL4ZdFuK/img.png&quot; data-alt=&quot;caniuse -&amp;amp;amp;nbsp;Flex 지원율&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3ZGu/btquVx2mjTF/j67fSLzPF3lbeUPL4ZdFuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3ZGu%2FbtquVx2mjTF%2Fj67fSLzPF3lbeUPL4ZdFuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;403&quot; data-filename=&quot;caniuse.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;caniuse -&amp;amp;nbsp;Flex 지원율&lt;/figcaption&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;&lt;span style=&quot;color: #333333;&quot;&gt;display: -webkit-box;&lt;span&gt;&amp;nbsp;,&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;display: -ms-flexbox;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;display: flex; 접두어를 넣어주자!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&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;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;flex_container&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;)에 display:flex 아니면 &lt;span&gt;display:inline-flex&lt;/span&gt;을 주면 그 안의 div는 flex item이 된다 (간단!!)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1557799105865&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body&amp;gt;
  &amp;lt;style type=&quot;text/css&quot;&amp;gt;
  	.flex_container {display:flex;}
  &amp;lt;/style&amp;gt;
  &amp;lt;div class=&quot;flex_container&quot;&amp;gt;
      &amp;lt;div&amp;gt;1&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;2&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;3&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;4&amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto; display: flex; justify-content: space-around;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flex-direction&lt;/b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;- flex item의 상하좌우 &lt;b&gt;방향&lt;/b&gt;을 설정한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;flex-direction :&amp;nbsp;&lt;/span&gt;column || column-reverse ||&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;row ||&amp;nbsp;&lt;/span&gt;row-reverse ;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;direction.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqK7fA/btquWMdKA4j/Hm7yMks74DHqPhxqpS1Vc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqK7fA/btquWMdKA4j/Hm7yMks74DHqPhxqpS1Vc1/img.png&quot; data-alt=&quot;flex-direction&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqK7fA/btquWMdKA4j/Hm7yMks74DHqPhxqpS1Vc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqK7fA%2FbtquWMdKA4j%2FHm7yMks74DHqPhxqpS1Vc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-filename=&quot;direction.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex-direction&lt;/figcaption&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;&lt;span&gt;자식 요소에&amp;nbsp;&lt;/span&gt;float&lt;span&gt;를 적용하였는데 부모 요소의 height가 0으로 되어버리는 경우가 있다&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&gt;이를 해결하기 위해 ( 본인 )은 가상 선택자를 써서&amp;nbsp;clear 해주었었다&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&gt;하지만 flex는 그러한 이슈가 없다는 것이다!! ( 좋다..! )&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&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;&quot;&gt;&lt;span&gt;&lt;b&gt;Flex-wrap&lt;/b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;- &lt;span style=&quot;color: #333333;&quot;&gt;flex item의 위치를&amp;nbsp;&lt;/span&gt;&lt;b&gt;줄 바꿈 할지&lt;/b&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;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;flex-&lt;span style=&quot;color: #000000;&quot;&gt;wrap&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;wrap&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;|| nowrap || wrap-reverse&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;;&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 alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wrap.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eMBh6q/btquT2oxpPh/5QjfuBlAQqFAjAybmWCjFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eMBh6q/btquT2oxpPh/5QjfuBlAQqFAjAybmWCjFk/img.png&quot; data-alt=&quot;flex-wrap&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eMBh6q/btquT2oxpPh/5QjfuBlAQqFAjAybmWCjFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeMBh6q%2FbtquT2oxpPh%2F5QjfuBlAQqFAjAybmWCjFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-filename=&quot;wrap.PNG&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex-wrap&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nowrap은 default값이다&lt;/p&gt;
&lt;p data-ke-size=&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;b&gt;Flex-&lt;span&gt;flow&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;-&amp;nbsp;&lt;span&gt;flex-direction 속성과 flex-wrap 속성을 한 줄로 단축시켜 적을 수 있다&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;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;flex-&lt;span&gt;flow&amp;nbsp;&lt;/span&gt;:&amp;nbsp;flex-direction&amp;nbsp;flex-wrap ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;flex_study flow_study&quot; style=&quot;margin-top: 45px;&quot;&gt;
&lt;div class=&quot;flex_wrap&quot;&gt;
&lt;div class=&quot;flex_container a01&quot; style=&quot;flex-flow: row nowrap; -webkit-flex-flow: row nowrap;&quot;&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flow.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHcgli/btquWlCf9Zc/2AqwpeAig3fdl2QkywdPW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHcgli/btquWlCf9Zc/2AqwpeAig3fdl2QkywdPW1/img.png&quot; data-alt=&quot;flex- flow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHcgli/btquWlCf9Zc/2AqwpeAig3fdl2QkywdPW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHcgli%2FbtquWlCf9Zc%2F2AqwpeAig3fdl2QkywdPW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-filename=&quot;flow.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex- flow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flex-basis -&amp;nbsp;&lt;/b&gt;flexible item의 길이를 설정한다&amp;nbsp;( default값은 auto )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;flex-basis :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;number |&lt;span style=&quot;color: #000000;&quot;&gt;| auto || initial || inherit ;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flex-basis.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcX539/btquWkwvtE7/zhTLpUTdFBvYhn2oDHd610/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcX539/btquWkwvtE7/zhTLpUTdFBvYhn2oDHd610/img.png&quot; data-alt=&quot;flex-basis&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcX539/btquWkwvtE7/zhTLpUTdFBvYhn2oDHd610/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcX539%2FbtquWkwvtE7%2FzhTLpUTdFBvYhn2oDHd610%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-filename=&quot;flex-basis.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex-basis&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flex-grow -&amp;nbsp;&lt;/b&gt;flexible item의 너비를 설정한다&amp;nbsp;( default값은 0 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;flex-grow :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;number |&lt;span style=&quot;color: #000000;&quot;&gt;| initial || inherit ;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flex-grow.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgJsF/btquXukD7uh/vfBJjxKUhrRk68KPiMKFDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgJsF/btquXukD7uh/vfBJjxKUhrRk68KPiMKFDk/img.png&quot; data-alt=&quot;flex-grow&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgJsF/btquXukD7uh/vfBJjxKUhrRk68KPiMKFDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgJsF%2FbtquXukD7uh%2FvfBJjxKUhrRk68KPiMKFDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; data-filename=&quot;flex-grow.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;flex-grow&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>메모같은기록</category>
      <category>Flex</category>
      <category>플렉스</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/11</guid>
      <comments>https://jj-k-ul.tistory.com/entry/CSS3-Flex-Box-%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83#entry11comment</comments>
      <pubDate>Thu, 2 May 2019 16:36:55 +0900</pubDate>
    </item>
    <item>
      <title>[Three.js ] Three.js 간단한 Animation를 넣어보자</title>
      <link>https://jj-k-ul.tistory.com/entry/Threejs-%EA%B0%84%EB%8B%A8%ED%95%9C-Animation%EB%A5%BC-%EB%84%A3%EC%96%B4%EB%B3%B4%EC%9E%90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;!-- 티스토리수평형광고 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-1160659047086768&quot; data-ad-slot=&quot;3364846236&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;Three.js 간단한 Animation를 넣어보자&lt;/b&gt; &lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;requestAnimationFrame 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Animation 효과를 주기 위해 setInterval 함수를 쓸 수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setInterval는 브라우저의 다른 탭을 사용할 때도 계속 호출되기 때문에 CPU를 많이 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 보안하기 위하여 Three.js의 내장 함수인 requestAnimationFrame를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 건 microsoft에서 나온 &lt;a href=&quot;https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/dev-guides/hh920765(v=vs.85)&quot;&gt;requestAnimationFrame&lt;/a&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;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/API/Window/requestAnimationFrame&quot;&gt;https://developer.mozilla.org/ko/docs/Web/API/Window/requestAnimationFrame&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;b&gt;requestAnimationFrame 시작!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;plane과 scene, 그리고 cube까지 만들어놓는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 소스에서 animation이라는 함수를 추가하여 Animation 효과를 줄 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1557798918065&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	function animation() {          
        cube.rotation.x += 0.02;
        cube.rotation.y += 0.02;
        cube.rotation.z += 0.02;  
        requestAnimationFrame(animation);        
        renderer.render(scene, camera);
    }    
    animation();
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;animation이 호출될 때마다 cube의 x축, y축, z축에 rotation속성이 0.02씩 증가를 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 안에서 Animation이 무한 반복되도록 requestAnimationFrame함수에 animation인자를 넣어 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에선 전체 장면 생성 후 renderer.render를 호출하였는데, Animation을 시작하기 위해서 animation함수를 호출한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;&quot; data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-default-tab=&quot;result&quot; data-user=&quot;JaeCool&quot; data-slug-hash=&quot;axLYKQ&quot; data-pen-title=&quot;axLYKQ&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/JaeCool/pen/axLYKQ/&quot;&gt; axLYKQ&lt;/a&gt; by JaeCool (&lt;a href=&quot;https://codepen.io/JaeCool&quot;&gt;@JaeCool&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오호 cube가 움직인다.&lt;/p&gt;
&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;나는 20면체를 만들 건데 cube를 만들었던 방식과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도형을 새로운 변수에 담아 scene에 추가!!&lt;/p&gt;
&lt;pre id=&quot;code_1557798945991&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	var icosahedronGeometry = new THREE.IcosahedronGeometry(4, 4, 4);
	var icosahedronMaterial = new THREE.MeshLambertMaterial({color: 0x12db00, wireframe: false});
	var icosahedron = new THREE.Mesh(icosahedronGeometry, icosahedronMaterial);
	icosahedron.castShadow = true;
	icosahedron.position.x = -4;
	icosahedron.position.y = 5;
	icosahedron.position.z = 0;
	scene.add(icosahedron);  
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;div class=&quot;table-overflow&quot;&gt;
&lt;div class=&quot;table-overflow&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;icosahedronGeometry에서 THREE.IcosahedronGeometry로 변경을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;three.js안에 여러 도형(ex - CircleGeometry)이 내장되어 있으니 원하는 도형은 찾아서 사용해본다!&lt;/p&gt;
&lt;pre id=&quot;code_1557798976928&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	var step = 0;
	animation();
	function animation() {           
		step += 0.01;
		icosahedron.position.y = 3 + ( 5 * Math.abs(Math.sin(step)));
		requestAnimationFrame(animation);
		renderer.render(scene, camera);
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step이라는 변수를 추가해준다 (속도조절을 위한)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step은 animation함수가 실행될 때마다 0.01씩 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위아래로 뛸 거니 position y값을 만지면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;&quot; data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-default-tab=&quot;result&quot; data-user=&quot;JaeCool&quot; data-slug-hash=&quot;YMypRm&quot; data-pen-title=&quot;YMypRm&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/JaeCool/pen/YMypRm/&quot;&gt; YMypRm&lt;/a&gt; by JaeCool (&lt;a href=&quot;https://codepen.io/JaeCool&quot;&gt;@JaeCool&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오호 20면체가 움직인다.&lt;/p&gt;
&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;위의 Animation을 응용하여!!!&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1557799003351&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
	animation();
	function animation() {           
		step += 0.01;
		sphere.position.x = 20 + ( 10 * (Math.cos(step)));
		sphere.position.y = 2 + ( 10 * Math.abs(Math.sin(step)));
		sphere.rotation.x += 0.02;
		sphere.rotation.y += 0.02;
		sphere.rotation.z += 0.02;
		requestAnimationFrame(animation);
		renderer.render(scene, camera);
	}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;position x축 cos, y축 sin 이동, rotation x축, y축, z축 뒹굴뒹굴~~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;&quot; data-height=&quot;265&quot; data-theme-id=&quot;0&quot; data-default-tab=&quot;result&quot; data-user=&quot;JaeCool&quot; data-slug-hash=&quot;BEgMOj&quot; data-pen-title=&quot;BEgMOj&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/JaeCool/pen/BEgMOj/&quot;&gt; BEgMOj&lt;/a&gt; by JaeCool (&lt;a href=&quot;https://codepen.io/JaeCool&quot;&gt;@JaeCool&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&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;script src=&quot;https://static.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;앞뒤로 위아래 뒹굴뒹굴 돌면서 완성!! 완성완성!! 완성!!&lt;/b&gt;&lt;/p&gt;</description>
      <category>Three.js</category>
      <category>animation</category>
      <category>requestAnimationFrame</category>
      <category>setInterval</category>
      <category>three.js</category>
      <category>WebGL</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/5</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Threejs-%EA%B0%84%EB%8B%A8%ED%95%9C-Animation%EB%A5%BC-%EB%84%A3%EC%96%B4%EB%B3%B4%EC%9E%90#entry5comment</comments>
      <pubDate>Wed, 3 Apr 2019 15:12:01 +0900</pubDate>
    </item>
    <item>
      <title>[Three.js ] Three.js를 시작해보자</title>
      <link>https://jj-k-ul.tistory.com/entry/Threejs%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%B4%EB%B3%B4%EC%9E%90</link>
      <description>&lt;!-- 티스토리수평형광고 --&gt;
&lt;h1 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Three.js를 시작해보자&lt;/b&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebGL를 그대로 사용하려고 하면 고급의 기술을 필요로 하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 JavaScript 라이브러리를 통해 WebGL를 쉽게 다룰 수 있도록&amp;nbsp;Three.js를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML 준비&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #333;&quot; 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 data-ke-size=&quot;size16&quot;&gt;다운로드한 파일(three.js-master) &amp;gt; build의 three.js를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;three.js를 쓰던 three.min.js를 쓰던 상관없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시작&lt;/b&gt;&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a8ff58;&quot;&gt;id&lt;/span&gt;=&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;WebGL-output&quot;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;script&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a8ff58;&quot;&gt;type&lt;/span&gt;=&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #a8ff58;&quot;&gt;src&lt;/span&gt;=&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;./js/three.js&quot;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: #f0f0f0;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4f; text-decoration: none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Scene를 추가한다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scene은 렌더링 할 모든 객체와, 광원을 저장하는 컨테이너이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;THREE.Scene이 없으면 렌더링 할 수 없다!!&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;scene&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.Scene();&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Camera를 추가한다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera는 어떻게 보일지 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Camera에는 PerspectiveCamera가 OrthographicCamera 있지만, 나는 PerspectiveCamera를 쓰겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PerspectiveCamera - 일상생활에서 우리가 보는 외관.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OrthographicCamera - 직교 카메라, 시점으로부터의 거리에 상관없이 모든 물체가 동일한 크기이다.&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0px; padding: 0px; border: none; background-color: #272727; border-radius: 4px; height: 133px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 133px;&quot;&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f; height: 133px; width: 9px;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0px; height: 133px; width: 804.4px;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;camera&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.PerspectiveCamera(&lt;span style=&quot;color: #c10aff;&quot;&gt;45&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;window&lt;/span&gt;.innerWidth&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;/&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;window&lt;/span&gt;.innerHeight,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0.&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1000&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;camera.position.x&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;-25&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;camera.position.y&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;30&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;camera.position.z&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;25&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;camera.lookAt(scene.position);&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4f; text-decoration: none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0px 2px 4px 0px; height: 133px; width: 10.4px;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;THREE.PerspectiveCamera(fov, aspect, near, far)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;45도의 화각(카메라에 비치는 광경 범위를 각도로 나타낸 것), 화면 비율(가로 대 세로의 비율),&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0.1(광경이 보이기 시작면까지의 거리), 1000(화면에서 가장 먼 반대편의 거리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;near, far&lt;/span&gt; - 오브젝트가 카메라에 얼마나 가까워지고 멀어져서 그려질 수 있는지를 정의한 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;position - x축 -25, y축 30, z축 25 위치에 있는 점을 Camera가 보고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lookAt - position의 점을 보기 위해 Camera가 위치 이동.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Renderer를 추가한다&lt;/b&gt;&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;renderer&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.WebGLRenderer({antialias:&lt;span style=&quot;color: #c10aff;&quot;&gt;true&lt;/span&gt;});&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;renderer.setClearColor(&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.Color(&lt;span style=&quot;color: #c10aff;&quot;&gt;0xeeeeee&lt;/span&gt;));&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;renderer.setSize(&lt;span style=&quot;color: #4be6fa;&quot;&gt;window&lt;/span&gt;.innerWidth,&amp;nbsp;&lt;span style=&quot;color: #4be6fa;&quot;&gt;window&lt;/span&gt;.innerHeight);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;renderer.shadowMapEnabled&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;true&lt;/span&gt;;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트의 가장자리를 매끄럽게 하기 위해 antialias를 true로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;antialias.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqPx4/btr8wSMMUDN/hXN9VtQiCfE0XK7XTlvNVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqPx4/btr8wSMMUDN/hXN9VtQiCfE0XK7XTlvNVK/img.png&quot; data-alt=&quot;왼쪽은 antialias를 false, 오른쪽은 true&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqPx4/btr8wSMMUDN/hXN9VtQiCfE0XK7XTlvNVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvqPx4%2Fbtr8wSMMUDN%2FhXN9VtQiCfE0XK7XTlvNVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;227&quot; data-filename=&quot;antialias.png&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왼쪽은 antialias를 false, 오른쪽은 true&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색상은 0x로 시작하고 HEX color로 적어준다. (0xeeeeee) 배경의 색이 #eee로 바뀌었다.&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;그림자를 만들기 위해서 shadowMapEnabled을 true로 준다. (그림자 효과화)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Plane (바닥)를 추가한다&lt;/b&gt;&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;9&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;10&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;planeGeometry&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.PlaneGeometry(&lt;span style=&quot;color: #c10aff;&quot;&gt;180&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;180&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;1&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;planeMaterial&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.MeshLambertMaterial({color:&lt;span style=&quot;color: #c10aff;&quot;&gt;0xffffff&lt;/span&gt;});&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;plane&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.Mesh(planeGeometry,&amp;nbsp;planeMaterial);&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;plane.receiveShadow&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;plane.rotation.x&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;0.&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;5&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;*&lt;/span&gt;&amp;nbsp;Math.PI;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;plane.position.x&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;15&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;plane.position.y&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;plane.position.z&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #303030; padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;scene.add(plane);&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4f; text-decoration: none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;planeGeometry - 가로 180, 세로 180, 가로세로 1씩의 세그먼트를 가진 Plane를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;planeMaterial - 색상과 재질을 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;THREE.Mesh - 형태, 재질을 합쳐주는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Plane 위에 생성되는 객체의 그림자를 받을 것이기 때문에 receiveShadow의 값을 true로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Plane은 기본값이 수직으로 서있기 때문에 rotation 시켜서 수평으로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AxisHelper (좌표계) 생성&lt;/b&gt;&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;axes&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.AxisHelper(&lt;span style=&quot;color: #c10aff;&quot;&gt;20&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;scene.add(axes);&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라가 바라보고 곳을 알려주기 위하여 xyz 좌표계를 만든다. (유용하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x축은 Red, y축은 Green, z축은 Blue로 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cube를 만들어보자!&lt;/b&gt;&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;7&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;8&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;cubeGeometry&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.BoxGeometry(&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;cubeMaterial&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.MeshLambertMaterial({color:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0x12db00&lt;/span&gt;,&amp;nbsp;wireframe:&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;false&lt;/span&gt;});&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;cube&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.Mesh(cubeGeometry,&amp;nbsp;cubeMaterial);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;cube.castShadow&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;cube.position.x&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;4&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;cube.position.y&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;cube.position.z&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;scene.add(cube);&amp;nbsp;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4f; text-decoration: none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BoxGeometry를 이용하여 x축, y축, z축의 길이가 4인 입방체를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeshBasicMaterial은 광원의 영향을 받지 않기 때문에 그림자를 만들지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeshLambertMaterial, MeshPhongMaterial의 Material를 사용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MeshLambertMaterial -&amp;nbsp;&lt;span style=&quot;color: #333333;&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;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;MeshPhongMaterial - 빛을 받아 반짝이는 객체를 만들 때 사용&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeshPhongMaterial &amp;gt; MeshLambertMaterial &amp;gt; MeshBasicMaterial이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Material.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EcJXa/btr8xPPObbe/gpCaDswzpAGQSJpO4zpDIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EcJXa/btr8xPPObbe/gpCaDswzpAGQSJpO4zpDIk/img.png&quot; data-alt=&quot;MeshPhongMaterial &amp;amp;gt; MeshLambertMaterial &amp;amp;gt; MeshBasicMaterial&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EcJXa/btr8xPPObbe/gpCaDswzpAGQSJpO4zpDIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEcJXa%2Fbtr8xPPObbe%2FgpCaDswzpAGQSJpO4zpDIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;194&quot; data-filename=&quot;Material.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MeshPhongMaterial &amp;gt; MeshLambertMaterial &amp;gt; MeshBasicMaterial&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색상과 wireframe를 어찌할지 설정을 해주고 Scene에 추가!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wireframe.PNG&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AHHjP/btqtSLhrCdD/Y7rkFfrgFot3wjurqlk9W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AHHjP/btqtSLhrCdD/Y7rkFfrgFot3wjurqlk9W1/img.png&quot; data-alt=&quot;wireframe : true&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AHHjP/btqtSLhrCdD/Y7rkFfrgFot3wjurqlk9W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAHHjP%2FbtqtSLhrCdD%2FY7rkFfrgFot3wjurqlk9W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;367&quot; height=&quot;283&quot; data-filename=&quot;wireframe.PNG&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;wireframe : true&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;SpotLight - 광원을 주어야 객체가 보인다!&lt;/b&gt;&lt;/p&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;3&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;4&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;5&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;6&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #ff3399;&quot;&gt;var&lt;/span&gt;&amp;nbsp;spotLight&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;new&lt;/span&gt;&amp;nbsp;THREE.SpotLight(&lt;span style=&quot;color: #c10aff;&quot;&gt;0xffffff&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;spotLight.position.set(&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;40&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;60&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #c10aff;&quot;&gt;10&lt;/span&gt;);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;spotLight.castShadow&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;spotLight.shadowMapHeight&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;spotLight.shadowMapWidth&amp;nbsp;&lt;span style=&quot;color: #ff3399;&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #c10aff;&quot;&gt;5000&lt;/span&gt;;&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;scene.add(spotLight);&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광원에는 여러 가지 종류가 있지만, 다음에 알아보기로 하고 일단은 그림자를 만들어주는 SpotLight를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;광원의 색과 position을 설정해주고, 그림자를 만들어야 하니 castShadow는 true로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;512_5000.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYiPYS/btr8neX0roX/splbL7sJSnlBFojVnPAqT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYiPYS/btr8neX0roX/splbL7sJSnlBFojVnPAqT1/img.png&quot; data-alt=&quot;왼쪽은 기본값 512, 오른쪽은 5000으로 늘림&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYiPYS/btr8neX0roX/splbL7sJSnlBFojVnPAqT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYiPYS%2Fbtr8neX0roX%2FsplbL7sJSnlBFojVnPAqT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;273&quot; data-filename=&quot;512_5000.png&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왼쪽은 기본값 512, 오른쪽은 5000으로 늘림&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림자의 shadowMapWidth, shadowMapHeight 기본값은 512로 설정되어 있어 그림자가 까슬까슬하게 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자연스러운 그림자를 주기 위해 shadowMapWidth, shadowMapHeight의 값을 5000으로 주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Scene에 추가!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Rendering 하기&lt;/b&gt;&lt;/h2&gt;
&lt;div class=&quot;colorscripter-code&quot; style=&quot;color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position: relative !important; overflow: auto;&quot;&gt;
&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin: 0; padding: 0; border: none; background-color: #272727; border-radius: 4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;padding: 6px; border-right: 2px solid #4f4f4f;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; word-break: normal; text-align: right; color: #aaa; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;1&lt;/div&gt;
&lt;div style=&quot;line-height: 130%;&quot;&gt;2&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;padding: 6px 0;&quot;&gt;
&lt;div style=&quot;margin: 0; padding: 0; color: #f0f0f0; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height: 130%;&quot;&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;&lt;span style=&quot;color: #4be6fa;&quot;&gt;document&lt;/span&gt;.&lt;span style=&quot;color: #4be6fa;&quot;&gt;getElementById&lt;/span&gt;(&lt;span style=&quot;color: #ffd500;&quot;&gt;&quot;WebGL-output&quot;&lt;/span&gt;).appendChild(renderer.domElement);&lt;/div&gt;
&lt;div style=&quot;padding: 0 6px; white-space: pre; line-height: 130%;&quot;&gt;renderer.render(scene,&amp;nbsp;camera);&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: right; margin-top: -13px; margin-right: 5px; font-size: 9px; font-style: italic;&quot;&gt;&lt;a style=&quot;color: #4f4f4f; text-decoration: none;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td style=&quot;vertical-align: bottom; padding: 0 2px 4px 0;&quot;&gt;&lt;a style=&quot;text-decoration: none; color: white;&quot; href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: #4f4f4f; color: white; border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만들어둔 div(WebGL-output) 안에 Rendering 한 것을 넣어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;render 함수의 인수 scene과 camera를 전달하여 &lt;span style=&quot;color: #333333;&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;&lt;br /&gt;&lt;b&gt;완성!! 완성완성!! 완성!!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;comp.PNG&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4530t/btr8w6K0iJD/ygCfckmqX6lU5ypqK2KUG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4530t/btr8w6K0iJD/ygCfckmqX6lU5ypqK2KUG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4530t/btr8w6K0iJD/ygCfckmqX6lU5ypqK2KUG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4530t%2Fbtr8w6K0iJD%2FygCfckmqX6lU5ypqK2KUG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1269&quot; height=&quot;894&quot; data-filename=&quot;comp.PNG&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Three.js</category>
      <category>three.js</category>
      <category>WebGL</category>
      <author>사용자가불꽃놀이좋아함</author>
      <guid isPermaLink="true">https://jj-k-ul.tistory.com/4</guid>
      <comments>https://jj-k-ul.tistory.com/entry/Threejs%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%B4%EB%B3%B4%EC%9E%90#entry4comment</comments>
      <pubDate>Wed, 27 Mar 2019 17:56:11 +0900</pubDate>
    </item>
  </channel>
</rss>