<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>모를 때 보는 개발로그</title>
    <link>https://limdoohee.tistory.com/</link>
    <description>글은 어렵지만, 그냥 써봅니다.</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 20:30:24 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>limdoohee</managingEditor>
    <item>
      <title>[React Three Fiber] TypeScript 적용 삽질기</title>
      <link>https://limdoohee.tistory.com/63</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 느끼는 거지만, 외부 라이브러리를 붙일 때 TypeScript 적용이 힘들다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 TypeScript 적용을 미뤄 JavaScript 로만 작성했는데, 어느날인가 문득 도전의식이 샘솟은 것이 아닌가.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, 삽질하는 과정 - 시이작.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&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;blockquote data-ke-style=&quot;style3&quot;&gt;Canvas 안에서 Bottles 라는 컴포넌트를 호출하고,&lt;br /&gt;Bottles는 Bottle이라는 컴포넌트에 렌더될 3D 모델의 node의 키 값을 Prop으로 전달한다.&lt;br /&gt;Bottle이 3D 모델에서 전달받은 glas와 cap이 사용된 node의 키를 geometry로 렌더한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= 이것은 하나의 3D 모델 안에 여러개의 node가 존재할 때, 동적 렌더링을 할 수 있는 완벽한 계획&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.js 파일을 .tsx 파일로 바꾸고 나니, 역시나 빨간줄의 공포가 시작되었다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;nodes[glas].&lt;span style=&quot;color: #ee2323;&quot;&gt;geometry&lt;/span&gt;&amp;nbsp;와 nodes[cap].&lt;span style=&quot;color: #ee2323;&quot;&gt;geometry&lt;/span&gt; 부분에서 빨간줄이 생기면서 합법적 괴롭힙이 시작됐다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1712128518648&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Canvas&amp;gt;
  &amp;lt;Bottles /&amp;gt;
&amp;lt;/Canvas&amp;gt;

function Bottles() {
  return (
    &amp;lt;group dispose={null} scale={[0.1, 0.1, 0.1]}&amp;gt;
      &amp;lt;Bottle position={[140, 0, 0]} glas=&quot;Untitled018&quot; cap=&quot;Untitled018_1&quot; /&amp;gt;
      &amp;lt;Bottle position={[80, 0, 0]} glas=&quot;Untitled078&quot; cap=&quot;Untitled078_1&quot; /&amp;gt;
      &amp;lt;Bottle position={[-2, 0, 0]} glas=&quot;Untitled064&quot; cap=&quot;Untitled064_1&quot; /&amp;gt;
      &amp;lt;Bottle position={[-90, 0, 0]} glas=&quot;Untitled052&quot; cap=&quot;Untitled052_1&quot; /&amp;gt;
      &amp;lt;Bottle position={[-140, 0, 0]} glas=&quot;Untitled072&quot; cap=&quot;Untitled072_1&quot; /&amp;gt;
      &amp;lt;Bottle position={[-180, 0, 0]} glas=&quot;Untitled007&quot; cap=&quot;Untitled007_1&quot; /&amp;gt;
    &amp;lt;/group&amp;gt;
  )
}


function Bottle({ position, glas, cap }) {
  const { nodes } = useGLTF(&quot;/models/bottles.glb&quot;);
  return (
    &amp;lt;group dispose={null}&amp;gt;
      &amp;lt;group
        rotation={[Math.PI / 2, 0, 3]}
        position={position}
      &amp;gt;
        &amp;lt;mesh
          castShadow
          receiveShadow
          geometry={nodes[glas].geometry}
          material={bottleMaterial}
        /&amp;gt;
        &amp;lt;mesh
          castShadow
          receiveShadow
          geometry={nodes[cap].geometry}
          material={capMaterial}
        /&amp;gt;
      &amp;lt;/group&amp;gt;
    &amp;lt;/group&amp;gt;
  )
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같은 에러문이 발생했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fff0f0; color: #da2f35; text-align: start;&quot;&gt;Type error: Property 'geometry' does not exist on type 'Object3D&amp;lt;Object3DEventMap&amp;gt;'.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&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;React Three Fiber에서 3D 모델을 렌더링 할 때, useGLTF 라는 drei 에서 제공하는 예쁜 Hook의 도움을 받아 코드를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;useGLTF 안을 들여다보면, 첫 번째 라인에 three-stdlib 에서 정의된 타입을 사용하는 것을 확인할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1593&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUO4eg/btsGjj6Jywh/usF9LrGNyEkzbFEiWL5qkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUO4eg/btsGjj6Jywh/usF9LrGNyEkzbFEiWL5qkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUO4eg/btsGjj6Jywh/usF9LrGNyEkzbFEiWL5qkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUO4eg%2FbtsGjj6Jywh%2FusF9LrGNyEkzbFEiWL5qkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1593&quot; height=&quot;291&quot; data-origin-width=&quot;1593&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 확인 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSZVTu/btsGlURVfLs/iqDk0uCspeRmvkNBrSQOOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSZVTu/btsGlURVfLs/iqDk0uCspeRmvkNBrSQOOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSZVTu/btsGlURVfLs/iqDk0uCspeRmvkNBrSQOOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSZVTu%2FbtsGlURVfLs%2FiqDk0uCspeRmvkNBrSQOOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;206&quot; height=&quot;226&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GLTF라는 인터페이스안에는 useGLTF hook 문법에서 자주 쓰는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;const { nodes, materials } = useGLTF(modelpath);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에서의 nodes 와 materials 가 보이지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 추측으로는 &lt;u&gt;&lt;b&gt;3D 모델에서 nodes 가 어떤 타입이며, materials 가 어떤 정보를 담고있을지 추측할 수 없기 때문&lt;/b&gt;&lt;/u&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔️ 그래서 어떻게 했냐면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 &lt;u&gt;&lt;b&gt;three-stdlib 에서 지원하는 GLTF 타입과 새로운 타입을 인터섹션 타입으로 정의&lt;/b&gt;&lt;/u&gt;해서 useGLTF 타입으로 임명해줬습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 키 포인트는, 우리는 GLTFResult에서 nodes 안에 Index Signature에 대한 타입을 선언해야 에러가 없다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Untitled018 : THREE.Mesh 이렇게 작성하면, 아래와 같은 무시무시한 에러를 영접할 수 있다.&lt;br /&gt;&lt;span style=&quot;background-color: #fff0f0; color: #da2f35; text-align: start;&quot;&gt;Element implicitly has an 'any' type because expression of type 'string' can't be used to index type&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드로 표현하자면 이런식으로 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1712130018017&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { GLTF } from &quot;three-stdlib&quot;;

type GLTFResult = GLTF &amp;amp; {
  nodes: {
	[key : string] : THREE.Mesh;
  };
  materials: {
    [&quot;default&quot;]: THREE.MeshStandardMaterial;
  };
};

const Bottle = ({ position, glas, cap }) =&amp;gt; {
  const { nodes } = useGLTF(&quot;/models/bottles.glb&quot;) as GLTFResult;
  return (
    &amp;lt;group dispose={null}&amp;gt;
      &amp;lt;group
        rotation={[Math.PI / 2, 0, 3]}
        position={position}
      &amp;gt;
        &amp;lt;mesh
          castShadow
          receiveShadow
          geometry={nodes[glas].geometry}
          material={bottleMaterial}
        /&amp;gt;
        &amp;lt;mesh
          castShadow
          receiveShadow
          geometry={nodes[cap].geometry}
          material={capMaterial}
        /&amp;gt;
      &amp;lt;/group&amp;gt;
    &amp;lt;/group&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;타입스크립트 너어~~ 정말 만만치 않구나? ^^&lt;/span&gt;&lt;/s&gt;&lt;/p&gt;</description>
      <category>3D</category>
      <category>R3F</category>
      <category>react</category>
      <category>React 3D</category>
      <category>React Three Fiber</category>
      <category>React-Three-Fiber</category>
      <category>TypeScript</category>
      <category>useGLTF</category>
      <category>타입스크립트</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/63</guid>
      <comments>https://limdoohee.tistory.com/63#entry63comment</comments>
      <pubDate>Thu, 4 Apr 2024 09:42:35 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] 장점과 단점</title>
      <link>https://limdoohee.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;TypeScript는 발표된지 10년동안 꾸준한 사랑을 받고 있으며, JavaScript 개발 환경에서는 빠지면 안되는 보조 도구가 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 모든 언어가 그렇듯 장점만 존재하지도 단점만 존재하지도 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 정적 타입&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TS 사용의 가장 큰 이유이며, 런타임 에러를 예방한다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1712042672194&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;// JS
const user = {
  name: &quot;Daniel&quot;,
  age: 26,
};
user.location; // returns undefined&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_1712042793940&quot; class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// TS
const user = {
  name: &quot;Daniel&quot;,
  age: 26,
};
 
user.location;
!Property 'location' does not exist on type '{ name: string; age: number; }'.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.프로퍼티, 변수 검사&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;type-cheker를 통한 변수 및 기타 속성의 접근 검사를 통해, 코드 작성의 실수를 방지한다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1527&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbhJmI/btsGhDKXEjw/U0xk3mopc6iqvQ20cRKg1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbhJmI/btsGhDKXEjw/U0xk3mopc6iqvQ20cRKg1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbhJmI/btsGhDKXEjw/U0xk3mopc6iqvQ20cRKg1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbhJmI%2FbtsGhDKXEjw%2FU0xk3mopc6iqvQ20cRKg1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1527&quot; height=&quot;506&quot; data-origin-width=&quot;1527&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;3. 객체지향 프로그래밍&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;클래스, 인터페이스, 상속, 모듈 등 객체 지향 프로그래밍 패턴을 제공함으로써 클래스 기반 객체지향 언어가 익숙한 프로그래머에게 자바스크립트의 러닝커브를 낮춰준다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 컴파일 단계 증가&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;자바스크립트는 인터프리터 언어로 컴파일이 필요없지만, 타입스크립트를 도입 시 컴파일의 과정을 거쳐야 하는 비용적 측면이 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 외부 라이브러리의 TS 지원 유무&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;간혹 TS를 지원하지 않거나 친절한 타입 설명이 되어있지 않은 경우, JS로 수정해야 하는 번거로움이 발생한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 학습 곡선&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;새로운 언어를 배우는 시간과 비용이 발생하며, 초기 학습 중에는 적용에 어려움을 겪을 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고, 왜 타입스크립트를 도입해야 하는냐&lt;br /&gt;프로그래머는 함께 일하기 때문이다.&lt;br /&gt;소통에서 단계가 줄어들고, 일하는 과정에서 오류가 줄기 때문에&lt;br /&gt;현재의 단점이 있더라도 미래의 장점을 위해 도입하는 것으로 생각된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>TS</category>
      <category>TypeScript</category>
      <category>타입스크립트</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/62</guid>
      <comments>https://limdoohee.tistory.com/62#entry62comment</comments>
      <pubDate>Wed, 3 Apr 2024 09:50:07 +0900</pubDate>
    </item>
    <item>
      <title>[TypeScript] 개념과 원리</title>
      <link>https://limdoohee.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) 개념&lt;/b&gt;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;TypeScript(이하 TS)는 C#의 창시자인 엔지니어가 개발을 주도하여 2012년 Micrsoft에서 발표한 오픈소스이다.&lt;br /&gt;자바스크립트 대체 언어의 하나로써 자바스크립트(ES5)의 SuperSet으로 자바스크립트 문법을 그대로 사용할 수 있다.&lt;br /&gt;자바스크립트에 존재하지 않는 정적 타입을 지원한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 코드를 TS로 작성할 경우, 브라우저 혹은 엔진에서 TS 파일 자체를 읽는 것일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 안에서는 어떤 동작이 이루어지고 있을까, 원리를 알아보자.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) 원리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. TS 컴파일러(TSC) 에서 하는 일 (컴파일)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;TS 코드 -&amp;gt; AST 코드 -&amp;gt; 타입 체크 -&amp;gt; JS 코드&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. JS 엔진에서 하는 일 (런타임)&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;JS 코드 -&amp;gt; AST 코드 -&amp;gt; 바이트 코드&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트만 사용할 때는 1번이 생략된다. 자바스크립트 인터프리터 언어이기 때문에 컴파일 과정이 필요하지 않기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과정이 늘어나는 비용이 발생함에도 불구하고 왜 TS를 도입하는것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로&lt;b&gt; &quot;오류 단계&quot;&lt;/b&gt; 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예정되어 있는 오류가 컴파일에서 발생한다면 런타임에서 발생하는 것보다 예방적이고, 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TS를 도입함으로써 사전 오류 검증의 단계가 추가되기 때문에, 작은 비용을 감수하고라도 더 큰 비용 지출을 방지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기본기가 부족하다면/TypeScript</category>
      <category>TS</category>
      <category>TypeScript</category>
      <category>타입스크립트</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/61</guid>
      <comments>https://limdoohee.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 2 Apr 2024 15:52:34 +0900</pubDate>
    </item>
    <item>
      <title>OpenGL? WebGL?? WebGPU???</title>
      <link>https://limdoohee.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;3D를 공부하기 시작하면서, WebGL과 OpenGL은 빠지지 않고 한 번쯤은 들어보는 단어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 대체 이것들이 무엇이고, 3D가 컴퓨터에서 돌아가기 위해서 어떻게 동작하는지는 기본으로 알아야한다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;OpenGL&lt;/span&gt;&lt;/b&gt; : Open Graphics Library의 줄임말로 무려 1992년 크로노스 그룹에 의해 발표된 2D, 3D API(규격서)이다. 라이브러리와는 기대와는 달리 구현없이 규격에 대한 정의만 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenGL은 로우레벨 API라 거의 모든 것을 수동으로 설정해야하고, 그마저도 수학적인 지식이 갖춰져야 편하다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Microsoft에서 개발한 DirectX와 Apple도 한때 애용했지만, 자체적인 Metal 을 만들면서 OpenGL은 점유율을 점점 잃었고, Vulkan을 개발하기에 이른다는 슬픈 역사도 있다.&lt;span style=&quot;color: #dddddd;&quot;&gt; (DirectX와 Metal도 함께 알아보도록 하자)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신버전은 2017년에 발표한 4.6버전이 마지막이고, Vulkan보다는 예전 기술이지만 오히려 OpenGL이 더 높은 사용량을 자랑한다.&lt;span style=&quot;color: #dddddd;&quot;&gt;(응?)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenGL의 역사가 여간 길다보니 드라이버가 베베 꼬일대로 꼬여버려 복잡도가 어마어마 하다고, 그래서 Vulkan을 개발할 때는 스펙을 최소화하고 개발자에게 대부분의 일을 위임했더니 사용이 엄청 어려워졌다는 후문이 있다. 그래서 결국 최신에 개발된 Vulkan을 놔두고 OpenGL이 높은 사용량을 자랑하게 된 것이다.&lt;span style=&quot;color: #dddddd;&quot;&gt;(ㅎ..)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 웹에서 3D를 사용할 때, 빈번하게 접하는 &lt;span style=&quot;color: #000000;&quot;&gt;WebGL&lt;/span&gt;은 무엇일까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;WebGL&lt;/span&gt;&lt;/b&gt; : 브라우저 &lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;환경에서  OpenGL&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;을 플러그인 도움 없이 공식적으로 사용할 수 있도록 크로노스 그룹&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;에서 제정한 웹 그래픽스 API!!!!!&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;(세상에, 별도 플러그인 없이 바로 OpenGL이 사용가능하다니 너무 좋은 세상이에요)&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: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;지원중인 브라우저는 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;크롬, 엣지, 사파리, 파이어폭스, 오페라 가 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt; 게다가, 디버깅 가능한 WebGL API를 통해 WebGL 콘텐츠를 최적화하거나 GPU 문제를 수집 할 수 있다. &lt;span style=&quot;color: #666666;&quot;&gt;(&lt;a style=&quot;color: #666666;&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_debug_renderer_info&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/API/WEBGL_debug_renderer_info&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebGL은 뛰어넘는 다음 세대의 기술이 있다던데, 그것은 바로 WebGPU.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebGPU : WebGL을 단점을 보완하고자, W3C &lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;GPU for the Web Community Group이&lt;span&gt; 애플, 모질라, MS, 구글&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;등의 엔지니어들과 함께 개발한 API이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;2024년 3월 기준으로 크롬, 엣지, 오페라는 지원 중이며, 다른 브라우저는 아직인 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;결국, 브라우저가 지원해줘야 web에서 작업을 할 수 있을 것 같긴 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122; text-align: start;&quot;&gt;아직은, 멀고 먼 webGPU의 이야기지만, 미리 공부하고 비교해서 머리속에 꽉꽉 채워놔야겠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>하고싶은거 하thㅔ요/3D</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/60</guid>
      <comments>https://limdoohee.tistory.com/60#entry60comment</comments>
      <pubDate>Tue, 26 Mar 2024 21:37:42 +0900</pubDate>
    </item>
    <item>
      <title>[React three drei] Scroll 파헤치기</title>
      <link>https://limdoohee.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;drei 에는 ScrollControls 라는 기능이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;Dom에서 스크롤 이벤트를 통해 Canvas를 조작할 수 있는 기능.&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;재밌는 것을 위해 사부작대던 중, 버그가 있는 것을 발견하고 이 부분을 심층적으로 파볼까 싶어 글을 작성하게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot; data-ke-style=&quot;style3&quot;&gt;Scroll&amp;nbsp;controls&amp;nbsp;create&amp;nbsp;a&amp;nbsp;HTML&amp;nbsp;scroll&amp;nbsp;container&amp;nbsp;in&amp;nbsp;front&amp;nbsp;of&amp;nbsp;the&amp;nbsp;canvas.&amp;nbsp;Everything&amp;nbsp;you&amp;nbsp;drop&amp;nbsp;into&amp;nbsp;the&amp;nbsp;&amp;lt;Scroll&amp;gt;&amp;nbsp;component&amp;nbsp;will&amp;nbsp;be&amp;nbsp;affected.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스크롤 컨트롤은 캔버스 앞에 HTML 스크롤 컨테이너를 만듭니다. &amp;lt;스크롤&amp;gt; 컴포넌트에 놓는 모든 것이 영향을 받습니다. 라고 deepL씨의 도움을 받아 이해하게 됐다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Dom Node을 비교해보면 확연하다. 왼쪽은 ScrollControls가 코드에 있는 상태, 오른쪽은 없는 상태이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ScrollControls 컴포넌트를 삽입한 쪽은 Dom 에 뭔가 Scroll 할 수 있는 Node가 생긴 것을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이것때문에 스크롤을 할 수 있게 된 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;왼쪽 하늘색 상자 바로 밑의 라인을 보면 height:500%; 인 것을 알 수 있는데, 이것은 ScrollControls의 pages속성의 값으로 스크롤 영역의 길이를 정의한다.&amp;nbsp;&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/bq7zUJ/btsF1KwQIut/2vySjImqXZygeUdisR5FIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq7zUJ/btsF1KwQIut/2vySjImqXZygeUdisR5FIk/img.png&quot; style=&quot;width: 43.7038%; margin-right: 10px;&quot; width=&quot;440&quot; height=&quot;249&quot; data-widthpercent=&quot;44.22&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;595&quot; data-origin-width=&quot;1050&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq7zUJ/btsF1KwQIut/2vySjImqXZygeUdisR5FIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq7zUJ%2FbtsF1KwQIut%2F2vySjImqXZygeUdisR5FIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dV6KKr/btsF5s87anT/CFpki5zifqBwSYm43c4Ym1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dV6KKr/btsF5s87anT/CFpki5zifqBwSYm43c4Ym1/img.png&quot; style=&quot;width: 55.1334%;&quot; width=&quot;352&quot; height=&quot;158&quot; data-widthpercent=&quot;55.78&quot; data-is-animation=&quot;false&quot; data-origin-height=&quot;473&quot; data-origin-width=&quot;1053&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dV6KKr/btsF5s87anT/CFpki5zifqBwSYm43c4Ym1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdV6KKr%2FbtsF5s87anT%2FCFpki5zifqBwSYm43c4Ym1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 내가 발견한 버그는 ScrollControls 밖에 있는 컴포넌트 또한 Scroll 이벤트가 발생한다는 것!&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 ScrollControls 밖에 Html을 작성했을 때, 고정되면 좋겠지만, 결과는 Scroll 이벤트가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqgKe/btsF2wdXWKE/AwYbEzO7kJ612Le6BBjyw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqgKe/btsF2wdXWKE/AwYbEzO7kJ612Le6BBjyw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqgKe/btsF2wdXWKE/AwYbEzO7kJ612Le6BBjyw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoqgKe%2FbtsF2wdXWKE%2FAwYbEzO7kJ612Le6BBjyw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;217&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Dom Node도 역시, 슬프게도 스크롤 영역 안으로 슉 들어가버린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2AMeq/btsF1RvZZ6W/clyI5BrCdkcU7JGk0oMtYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2AMeq/btsF1RvZZ6W/clyI5BrCdkcU7JGk0oMtYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2AMeq/btsF1RvZZ6W/clyI5BrCdkcU7JGk0oMtYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2AMeq%2FbtsF1RvZZ6W%2FclyI5BrCdkcU7JGk0oMtYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;543&quot; height=&quot;533&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Q. 고정시키고 싶은 무언가가 있고, 스크롤하고 싶은 무언가가 같은 화면에 공존해야한다면?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;고정하고 싶은 것인 문자일 경우, Canvas 밖으로 빼고 별도 Html로 작성한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스크롤에 따른 애니메이션 처리를 별도로 해야 하는 번거로움이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Q. ScrollControls의 속성인 enabled로 값을 조정한다면?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이미 Dom에는 컴포넌트가 스크롤 영역안에 렌더링된 상태기 때문에 속성을 조정한다고 해도 스크롤 영역의 값이 달라지거나 하지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;enabled는 webGL의 영역의 속성으로 보인다. 이미 html 태그로 렌더링 된 node 에는 적용되지 않는다.&lt;/p&gt;</description>
      <category>하고싶은거 하thㅔ요/3D</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/59</guid>
      <comments>https://limdoohee.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 25 Mar 2024 13:26:59 +0900</pubDate>
    </item>
    <item>
      <title>[React Three Fiber] Texture 조절하기</title>
      <link>https://limdoohee.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 개발자가 3D 라이브러리 React Three Fiber 및 Three.js를 다루던 중 문제를 해결하는 과정을 보실 수 있습니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(이하 삽질)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 하던 중, 아래와 같이 바닥에 texture를 넣었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 이미지를 사용했지만, 바닥에 렌더링 된 것은 뭔가 형태가 변한 모습이었다.  예쁘지 않은 모습으로 변했달까..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적인 모습을 위해 삽질을 시작하려 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2495&quot; data-origin-height=&quot;1633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pcBXW/btsFW4AKDUs/LiOi3AxcAvT5PAXg6PhU50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pcBXW/btsFW4AKDUs/LiOi3AxcAvT5PAXg6PhU50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pcBXW/btsFW4AKDUs/LiOi3AxcAvT5PAXg6PhU50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpcBXW%2FbtsFW4AKDUs%2FLiOi3AxcAvT5PAXg6PhU50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;563&quot; data-origin-width=&quot;2495&quot; data-origin-height=&quot;1633&quot;/&gt;&lt;/span&gt;&lt;/figure&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;floor_1.webp&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfZVbR/btsFWrJYsjY/PL4a5KUukAXUp2vjN6re8k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfZVbR/btsFWrJYsjY/PL4a5KUukAXUp2vjN6re8k/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfZVbR/btsFWrJYsjY/PL4a5KUukAXUp2vjN6re8k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfZVbR%2FbtsFWrJYsjY%2FPL4a5KUukAXUp2vjN6re8k%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;491&quot; data-filename=&quot;floor_1.webp&quot; data-origin-width=&quot;2560&quot; data-origin-height=&quot;1463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. drei를 이용해 useTexture를 사용하는 중인데, 프로퍼티가 친절하지 않으니 Three.js 로 방문한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;a href=&quot;https://threejs.org/docs/index.html?q=texture#api/en/textures/Texture&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://threejs.org/docs/index.html?q=texture#api/en/textures/Texture&lt;/a&gt; 에서 사용할 수 있는 프로퍼티를 살펴보며 인사이트를 얻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 'repeat 이라는 프로퍼티를 사용해 텍스처를 반복시킬 수 있지 않을까?' 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. examples 에서 내가 활용할 수 있을법한 예제를 찾는다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(못찾으면 폭풍 구글링,,)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2961&quot; data-origin-height=&quot;2200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OHsNd/btsFXbGGYT7/kVe72swDy4l7lhVdWdiYLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OHsNd/btsFXbGGYT7/kVe72swDy4l7lhVdWdiYLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OHsNd/btsFXbGGYT7/kVe72swDy4l7lhVdWdiYLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOHsNd%2FbtsFXbGGYT7%2FkVe72swDy4l7lhVdWdiYLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2961&quot; height=&quot;2200&quot; data-origin-width=&quot;2961&quot; data-origin-height=&quot;2200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 예제 코드를 참고해 코드를 요리조리 수정해보며 테스트한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SB5CL/btsFX0xUBmO/cA4EyRHO7ZIRLUJUvW1WE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SB5CL/btsFX0xUBmO/cA4EyRHO7ZIRLUJUvW1WE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SB5CL/btsFX0xUBmO/cA4EyRHO7ZIRLUJUvW1WE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSB5CL%2FbtsFX0xUBmO%2FcA4EyRHO7ZIRLUJUvW1WE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;136&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;230&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;2103&quot; data-origin-height=&quot;1549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8PtTl/btsFX41mdH1/KvmkWVpT4MK5mmcUIJ0i2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8PtTl/btsFX41mdH1/KvmkWVpT4MK5mmcUIJ0i2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8PtTl/btsFX41mdH1/KvmkWVpT4MK5mmcUIJ0i2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8PtTl%2FbtsFX41mdH1%2FKvmkWVpT4MK5mmcUIJ0i2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2103&quot; height=&quot;1549&quot; data-origin-width=&quot;2103&quot; data-origin-height=&quot;1549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 크기에 따라 자동조절할지, 사용자가 수동조절하게 할지 등 아름다운 연장선상의 고민을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론 :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제해결까지는 6단계밖에 거치지 않은 것처럼 보이지만, 모든 예제가 이렇게 해결되는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아주 간단한 문제인 것 같은 것도 몇 시간, 며칠을 고민하고 찾아보는데 시간을 할애하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여태까지 개발이 그래왔듯이, 3D는 아직 나에게 미지의 영역이라 공부하는 재미가 쏠쏠하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 언젠간 '아, 이거 전에 했었는데', '이렇게 하는거였지', '여기 예제 활용하면 되겠는데' 등 금방 해결할 수 있는 능력이 쌓여가기를 바라면서 오늘도 화이팅!&lt;/p&gt;</description>
      <category>하고싶은거 하thㅔ요/3D</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/58</guid>
      <comments>https://limdoohee.tistory.com/58#entry58comment</comments>
      <pubDate>Wed, 20 Mar 2024 14:34:29 +0900</pubDate>
    </item>
    <item>
      <title>[3D 라이브러리 비교] Three.js VS React Three Fiber</title>
      <link>https://limdoohee.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;바닐라 자바스크립트를 이용한 Three.js냐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 개발을 이용한 React Three Fiber(이하 r3f)냐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 React를 쓴다면 r3f를 , 순수 javascript로 개발을 한다면 Three.js 를 사용하는 것이 더 효율적일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. React 환경에서 코드량을 줄이고 싶다면 당연히 r3f!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 url에서 비교로 알 수 있듯이 r3f는 Three.js를 컴포넌트화시켜 react 에서 컴포넌트 개발로 연결시키면서 3d를 렌더링 할 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 react 환경에서도 순수 js 파일을 만들고 Three.js로 개발할 수 있다. 하지만 코드 비교로 알 수 있듯, 코드 양에서도 차이가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히, 이벤트처리가 추가된다면 코드양에서 어마어마한 차이를 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. r3f Example 안에서 해결된다면 r3f!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Three.js와 r3f 모두 많은 예를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 구현하려는 거의 모든 기능이 제공될 것이라 생각한다. 없더라도 예제별로 조합하여 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제의 다양성과 종류는 Three.js가 많지만, r3f 예제 안에서 해결되는 구현 정도라면 r3f를 사용하는 게 시간적인 측면에서 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 더 많은 커스텀이 필요하다면 Three.js!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Three.js는 r3f 보다 예제가 다양하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3d 파일 로드 기능이 다양하며, 각 material에 대한 간단한 예로 바로 이해할 수 있도록 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, r3f보다 커뮤니티가 활성화 되어있어 활용할 수 있는 예제 및 문제 해결 결과가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4.  각 기능별 자세한 설명이 필요하다면 Three.js!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r3f는 제공하는 메서드 및 프로퍼티 설명이 충분하지 않다. Three.js의 교육으로 전가하는 느낌이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;심지어 프로퍼티가 Three.js와 동일하지 않은 메서드도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Three.js에서 제공하는 순수 기능들도 r3f 에서는 drei를 통해 사용할 수 있고, 별도 설치 및 학습이 필요하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 React 환경에서 동일한 화면을 r3f와 Three.js로 구현한 것을 비교한 것이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 간단한 예제에서도 약 2배의 코드량의 차이를 보인다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;각 상황에 맞게 3D 라이브러리를 사용하게 된다면 현명한 사용자 경험 및 개발 용이성을 가져갈 수 있을 것이라 생각한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lims-web.vercel.app/3d/compare&quot;&gt;https://lims-web.vercel.app/3d/compare&lt;/a&gt;&lt;/p&gt;</description>
      <category>하고싶은거 하thㅔ요/3D</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/57</guid>
      <comments>https://limdoohee.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 11 Mar 2024 19:18:50 +0900</pubDate>
    </item>
    <item>
      <title>[React Three Fiber] 페이지 이동하기 aka 라우팅 (Feat.우여곡절)</title>
      <link>https://limdoohee.tistory.com/56</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3911&quot; data-origin-height=&quot;2549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI95DP/btsFJsVYLY3/qwD5m4RNr7W9oTGH3kK1AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI95DP/btsFJsVYLY3/qwD5m4RNr7W9oTGH3kK1AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI95DP/btsFJsVYLY3/qwD5m4RNr7W9oTGH3kK1AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI95DP%2FbtsFJsVYLY3%2FqwD5m4RNr7W9oTGH3kK1AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3911&quot; height=&quot;2549&quot; data-origin-width=&quot;3911&quot; data-origin-height=&quot;2549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Three Fiber를 이용해 위와 같은 화면을 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 스텝은 각 이미지를 클릭하면 각 링크로(Router) 이동하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. wouter - &lt;span style=&quot;color: #ef5369;&quot;&gt;실패&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 예제에 나오는 wouter 라이브러리를 통해 (react-router-dom과 크게 달라보이지 않지만) 링크를 이동시키는 것을 구현했다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&quot;&gt;https://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1710149066266&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://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&quot; data-og-description=&quot;&quot; data-og-host=&quot;codesandbox.io&quot; data-og-source-url=&quot;https://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&quot; data-og-url=&quot;https://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&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://codesandbox.io/p/sandbox/router-transitions-4j2q2?file=%2Fsrc%2FApp.js%3A19%2C12-19%2C16&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;codesandbox.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인 : 네 개 중, 두 개는 3D지만, 나머지 두 개는 3D가 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3D인 화면으로 router가 이동해도 위의 화면에 사용된 Canvas 내에 다시 Canvas를 렌더링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 온전하게 Link 이동하지 않고, 상하 구조로 두개의 Canvas 가 동작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 3D가 아닌 페이지도 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제에서는 Canvas 는 하나고 Canvas를 제외한 Mesh 컴포넌트만 렌더링하기에 가능한 것으로 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 컴포넌트를 나눈다고 해도, 3D가 아닌 페이지는 해결되지 않기 때문에 예제와 같이 하는 것은 실패로 결론지었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. next/navigation - &lt;span style=&quot;color: #006dd7;&quot;&gt;성공&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 이미지는 Image 라는 react-three/drei 내 컴포넌트를 사용중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onClick 이벤트에 next/navigation 내장훅인 useRouter를 사용해서 링크를 이동하도록 했더니 성공!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각보다 next가 많은 일을 해주는구나ㅠ&lt;/p&gt;
&lt;pre id=&quot;code_1710150155323&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Image
      ref={ref}
      url={src}
      transparent
      side={THREE.DoubleSide}
      onPointerOver={pointerOver}
      onPointerOut={pointerOut}
      onClick={() =&amp;gt; router.push(url)}
      {...props}
    &amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>하고싶은거 하thㅔ요/3D</category>
      <category>R3F</category>
      <category>React 3D</category>
      <category>React Three Fiber</category>
      <category>threejs</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/56</guid>
      <comments>https://limdoohee.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 11 Mar 2024 18:26:30 +0900</pubDate>
    </item>
    <item>
      <title>[UI 자동 생성 프로그램] Uizard 첫 경험</title>
      <link>https://limdoohee.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아무 오랫동안 미뤘던 포트폴리오 사이트를 구축중이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 UI 레퍼런스를 찾아 퍼블리싱 작업을 하기가 너무 소모적인 것을 느꼈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI도 여러가지 서비스로 나와있기도 하고... 이참에 한 번 써볼까? 싶은 마음에 Uizard 를 선택해 ui 를 자동생성한다!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Uizard 사이트 접속해서 회원가입한다. : &lt;a href=&quot;https://uizard.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://uizard.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KhZgQ/btsFoE4fYau/6BKPOx6dNWfNgok2OUZCxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KhZgQ/btsFoE4fYau/6BKPOx6dNWfNgok2OUZCxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KhZgQ/btsFoE4fYau/6BKPOx6dNWfNgok2OUZCxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKhZgQ%2FbtsFoE4fYau%2F6BKPOx6dNWfNgok2OUZCxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5120&quot; height=&quot;2588&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 회원가입 후, Template을 선택할 수 있는 화면이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(몇 개를 제외하고, 모두 Pro 라고 붙어있는거 아마도 유료...)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tTBl7/btsFp9bD5yq/PkMdOmKbJlLzHg463fhOJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tTBl7/btsFp9bD5yq/PkMdOmKbJlLzHg463fhOJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tTBl7/btsFp9bD5yq/PkMdOmKbJlLzHg463fhOJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtTBl7%2FbtsFp9bD5yq%2FPkMdOmKbJlLzHg463fhOJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5120&quot; height=&quot;2588&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 뻔한 템플릿 쓰기 싫으니까 Generate it with Autodesigner 눌러줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바이스 선택하고 작성하라는 거 잘 작성하고 보라색 버튼 클릭하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emZdfj/btsFsmImlAN/RVGU2j2n4gQzeK7BLDc8Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emZdfj/btsFsmImlAN/RVGU2j2n4gQzeK7BLDc8Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emZdfj/btsFsmImlAN/RVGU2j2n4gQzeK7BLDc8Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemZdfj%2FbtsFsmImlAN%2FRVGU2j2n4gQzeK7BLDc8Tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5120&quot; height=&quot;2588&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 진행바가 흘러가고 완성된 화면이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하단의 메시지박스를 통해서 다른 ui를 생성할 수도, 다시 생성할 수도 있네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMyCQM/btsFqKv9dnf/7dV6LjWs4ohZhveRtKfHP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMyCQM/btsFqKv9dnf/7dV6LjWs4ohZhveRtKfHP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMyCQM/btsFqKv9dnf/7dV6LjWs4ohZhveRtKfHP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMyCQM%2FbtsFqKv9dnf%2F7dV6LjWs4ohZhveRtKfHP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;5120&quot; height=&quot;2588&quot; data-origin-width=&quot;5120&quot; data-origin-height=&quot;2588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 디자인 컴포넌트를 클릭하고 오른쪽 상단쯤에 있는 Design을 누르면 대강의 스타일값이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;끝,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피그마랑 비슷해보여서 매우 유용할 것 같으나 CSS 확인하려고 했더니 유료였습니다... &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;요즘 피그마도 그렇고 UI 툴중에 CSS 값은 모두 유료로 전환하는 게 유행인가봅니다.&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;</description>
      <category>프로젝트 준비/포트폴리오</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/55</guid>
      <comments>https://limdoohee.tistory.com/55#entry55comment</comments>
      <pubDate>Fri, 1 Mar 2024 14:01:27 +0900</pubDate>
    </item>
    <item>
      <title>나는 어떤 개발자인가</title>
      <link>https://limdoohee.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;공적인 나와 사적인 나는 크게 다르지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞으로 개발자로써 부족한 점과 나아갈 방향을 위해 자아탐구 사회ver. 을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 비교를 좋아한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 써드파티와 프레임워크를 비교하고, 사용법,용량,프레임 등을 꼼꼼하게 비교해야 후회하지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;- 시간을 들여 집요하게 여러가지를 훑어야 직성이 풀리 고, 가격,품질,디자인 등 꼼꼼하게 비교해야 후회않는 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 아끼는 것을 좋아한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 되도록 적은 비용으로 개발 구현하는 일을 좋아한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;- 시장과 마트 오만군데를 돌아다니며 싸게 사서 건강하게 먹으며 시간에 투자하는 일을 좋아한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 디저트를 좋아한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 예쁘지 않아도 되는 화면은 없다. 이왕이면 다홍치마. 예쁜 화면과 인터랙션에 관심이 많다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;- 일주일에 한 번, 아주 비싸지 않은 디저트로 달달한 시간을 보내는 것이 유일한 낙이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 나누는 것을 좋아한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 내 일이 끝난 후에 동료가 어려워하는 부분을 별도 개발에 비교하고 더 나은 방향으로 추천하는 일을 즐긴다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;- 요리를 많이해서 나누고, 사용이 편한 생활용품을 나누고, 선물을 해서 마음을 전달하는 일을 즐긴다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 돌보는 것을 좋아한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 회사에서 일적으로 심적으로 힘든 동료들을 위로하여 나아지는 모습을 보는 것에 보람을 느낀다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;- 식물, 고양이, 사람을 가리지 않고, 내 주변에 있는 생물체를 보다 나은 삶으로 이끌어 건강하게 생명을 유지하는 것을 보는 것에 보람을 느낀다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나는 대화하는 것을 좋아한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 개발주제로 서로의 의견을 듣거나 보편적인 대화 주제를 통해 동료들과 조금씩 가까워 지는 것에 재미를 느낀다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;- 다양한 사람들의 의견을 듣고, 내 가치관을 관찰하고 의견을 변경되는 것에 재미를 느낀다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>주저리</category>
      <author>limdoohee</author>
      <guid isPermaLink="true">https://limdoohee.tistory.com/54</guid>
      <comments>https://limdoohee.tistory.com/54#entry54comment</comments>
      <pubDate>Thu, 22 Feb 2024 15:52:08 +0900</pubDate>
    </item>
  </channel>
</rss>