<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>공부중...</title>
    <link>https://cishome.tistory.com/</link>
    <description> java,  android, dart, flutter, node.js 공부 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 14:37:43 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>centoss</managingEditor>
    <image>
      <title>공부중...</title>
      <url>https://tistory1.daumcdn.net/tistory/2917880/attach/3acd4460d94941d794f7ce34c9e22df2</url>
      <link>https://cishome.tistory.com</link>
    </image>
    <item>
      <title>[database] 데이터베이스 종류</title>
      <link>https://cishome.tistory.com/311</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;데이터베이스 종류는 관계형과 noSQL 만 존재하는게 아니구나!?&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그동안 웹, 앱 개발을 진행하면서 사용해본 데이터베이스는 관계형과 noSQL 을 사용했었는데 최근에 회사 업무를 진행하며 처음으로 마주친 데이터베이스가 보였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;influxDB&lt;/b&gt;&lt;/span&gt; 라는건데 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시계열 데이터베이스&lt;/b&gt;&lt;/span&gt;의 대표라고 하더라구요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;너무 생소해서 이건 또 뭐에 사용하는건가 했는데 iot 센서 데이터나, 주식 시세, 서버 모니터링에 주로 사용하는 데이터베이스네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;엄청나게 많은 데이터를 시간순으로 저장시키는게 가능하다고합니다. 이런 데이터를 이용하는건 기존에 많이 사용한 관계형 데이터베이스보다 훨씬 좋은 성능을 나타낸다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;그래서 또 다른 데이터베이스는 뭐가 있나 찾아보니 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;그래프 데이터베이스&lt;/b&gt;&lt;/span&gt;라는것도 있네요. 이건 노드와 엣지로 관계 표현을 하고 cypher 라는 쿼리 언어를 사용한다고 합니다. 주로 SNS, 지식 그래프 등 뭔가 관계가 있는곳에 사용하는 그래프라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;그냥 관계형 데이터베이스를 사용해도 문제 없지 않나?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RDBMS(MySQL, PostgreSQL 등)&lt;/b&gt; 로도 SNS 데이터나 IoT 데이터를 저장하고 읽는 건 충분히 가능합니다. 실제로도 많은 기업이 한동안은 &lt;b&gt;RDB만으로 모든 걸 처리&lt;/b&gt;했어요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 각 서비스별로 특화된 데이터베이스를 사용하는게 유리한지 아래 내용을 참고해보시면 이해가 될겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot; data-start=&quot;89&quot; data-end=&quot;126&quot;&gt;&lt;b&gt;1️⃣ SNS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;275&quot;&gt;&lt;b&gt;RDB로 구현 가능&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;398&quot; data-start=&quot;297&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;360&quot; data-start=&quot;297&quot;&gt;User 테이블, Friend 관계 테이블로 저장 (예: user_id, friend_id)&lt;/li&gt;
&lt;li data-end=&quot;398&quot; data-start=&quot;363&quot;&gt;&quot;철수의 친구 &amp;rarr; 친구의 친구&quot; = JOIN 두 번 이상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;399&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;509&quot; data-start=&quot;414&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;477&quot; data-start=&quot;414&quot;&gt;깊은 관계 탐색 (친구의 친구의 친구의 친구 &amp;hellip;) &amp;rarr; JOIN이 기하급수적으로 늘어나면서 &lt;b&gt;성능 저하&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;509&quot; data-start=&quot;480&quot;&gt;수백만 유저가 얽히면 쿼리 성능 급격히 떨어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;650&quot; data-start=&quot;511&quot;&gt;&lt;b&gt;그래프 DB는?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;650&quot; data-start=&quot;530&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;574&quot; data-start=&quot;530&quot;&gt;관계(Edge)를 &lt;b&gt;1급 시민&lt;/b&gt;으로 저장 &amp;rarr; JOIN 없이 탐색 가능&lt;/li&gt;
&lt;li data-end=&quot;621&quot; data-start=&quot;577&quot;&gt;&quot;철수의 친구의 친구 찾기&quot; 같은 쿼리가 O(1)에 가까운 속도로 탐색됨&lt;/li&gt;
&lt;li data-end=&quot;650&quot; data-start=&quot;624&quot;&gt;추천 시스템, 네트워크 분석 등에 최적화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그래프 탐색이 많을수록 그래프 DB가 훨씬 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2️⃣ IoT&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;881&quot; data-start=&quot;761&quot;&gt;&lt;b&gt;RDB로 구현 가능&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;881&quot; data-start=&quot;783&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;834&quot; data-start=&quot;783&quot;&gt;device_data 테이블 (device_id, timestamp, value)&lt;/li&gt;
&lt;li data-end=&quot;881&quot; data-start=&quot;837&quot;&gt;SELECT + GROUP BY + ORDER BY 로 시간별 분석 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1018&quot; data-start=&quot;882&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1018&quot; data-start=&quot;897&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;927&quot; data-start=&quot;897&quot;&gt;IoT 센서는 초당 수천~수백만 건 데이터 발생&lt;/li&gt;
&lt;li data-end=&quot;994&quot; data-start=&quot;930&quot;&gt;RDB는 INSERT 부하와 대량 시계열 집계(rolling average, downsampling)에 취약&lt;/li&gt;
&lt;li data-end=&quot;1018&quot; data-start=&quot;997&quot;&gt;시간축 기반 인덱싱 최적화 부족&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1206&quot; data-start=&quot;1020&quot;&gt;&lt;b&gt;시계열 DB는?&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1206&quot; data-start=&quot;1039&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1076&quot; data-start=&quot;1039&quot;&gt;&lt;b&gt;쓰기(INSERT) 처리량 최적화&lt;/b&gt; (배치 압축 저장)&lt;/li&gt;
&lt;li data-end=&quot;1126&quot; data-start=&quot;1079&quot;&gt;시간 기반 쿼리(WHERE time &amp;gt; now() - 1h)에 특화 인덱싱&lt;/li&gt;
&lt;li data-end=&quot;1166&quot; data-start=&quot;1129&quot;&gt;다운샘플링(1분 단위 평균, 1시간 단위 최대값) 자동 지원&lt;/li&gt;
&lt;li data-end=&quot;1206&quot; data-start=&quot;1169&quot;&gt;시계열 함수(윈도우 함수, moving average) 내장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관계형 데이터베이스로도 서비스 구성은 가능하지만 최적화가 되어있지 않기 때문에 성능에 문제가 발생합니다. 때문에 특정한 서비스 조건에서는 최적화된 데이터베이스를 사용하는것이 훨씬 빠르고 효율적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 빅테크 기업중에 X(트위터)는 그래프DB(&lt;a href=&quot;https://steemit.com/krdev/@kormanocorp/db-flockdb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 블로그&lt;/a&gt;) 를 적용했고, 넷플릭스는 시계열DB(&lt;a href=&quot;https://digitalbourgeois.tistory.com/1661&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;참고 블로그&lt;/a&gt;) 를 적용해서 사용중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련된 내용은 아래에 좀 더 체계적으로 정리해놓고 표로도 정리해놨으니 천천히 한 번 살펴보시는것도 좋을 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;126&quot; data-start=&quot;89&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ 관계형 데이터베이스(RDB, Relational DB)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;313&quot; data-start=&quot;127&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;161&quot; data-start=&quot;127&quot;&gt;&lt;b&gt;구조&lt;/b&gt;: 테이블, 행(Row), 열(Column)&lt;/li&gt;
&lt;li data-end=&quot;194&quot; data-start=&quot;162&quot;&gt;&lt;b&gt;관계 표현&lt;/b&gt;: Foreign Key, JOIN&lt;/li&gt;
&lt;li data-end=&quot;227&quot; data-start=&quot;195&quot;&gt;&lt;b&gt;특징&lt;/b&gt;: ACID 트랜잭션 지원, SQL 사용&lt;/li&gt;
&lt;li data-end=&quot;260&quot; data-start=&quot;228&quot;&gt;&lt;b&gt;사용 예&lt;/b&gt;: 은행 계좌, 쇼핑몰 주문, ERP&lt;/li&gt;
&lt;li data-end=&quot;313&quot; data-start=&quot;261&quot;&gt;&lt;b&gt;대표 DB&lt;/b&gt;: MySQL, PostgreSQL, Oracle, SQL Server&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;318&quot; data-start=&quot;315&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;339&quot; data-start=&quot;320&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ NoSQL 데이터베이스&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;731&quot; data-start=&quot;340&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;370&quot; data-start=&quot;340&quot;&gt;&lt;b&gt;구조&lt;/b&gt;: 테이블 대신 자유로운 형태로 저장&lt;/li&gt;
&lt;li data-end=&quot;433&quot; data-start=&quot;371&quot;&gt;&lt;b&gt;특징&lt;/b&gt;: 스키마 유연, 수평 확장 용이, 일부는 ACID 대신 eventual consistency&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;434&quot;&gt;&lt;b&gt;하위 유형&lt;/b&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;731&quot; data-start=&quot;449&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;449&quot;&gt;&lt;b&gt;문서형(Document)&lt;/b&gt;: JSON/BSON 형태 저장
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;519&quot; data-start=&quot;494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;494&quot;&gt;예: MongoDB, Couchbase&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;522&quot;&gt;&lt;b&gt;키-값(Key-Value)&lt;/b&gt;: 단순 조회에 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;585&quot; data-start=&quot;563&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;563&quot;&gt;예: Redis, DynamoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;660&quot; data-start=&quot;588&quot;&gt;&lt;b&gt;컬럼형(Column-Family)&lt;/b&gt;: 대용량 데이터 분석에 적합
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;660&quot; data-start=&quot;637&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;660&quot; data-start=&quot;637&quot;&gt;예: Cassandra, HBase&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;663&quot;&gt;&lt;b&gt;그래프(Graph)&lt;/b&gt;: 노드-엣지 구조로 관계 탐색 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;731&quot; data-start=&quot;709&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;731&quot; data-start=&quot;709&quot;&gt;예: Neo4j, ArangoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;736&quot; data-start=&quot;733&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;765&quot; data-start=&quot;738&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ 그래프 데이터베이스(Graph DB)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;930&quot; data-start=&quot;766&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;803&quot; data-start=&quot;766&quot;&gt;&lt;b&gt;구조&lt;/b&gt;: 노드(Node)와 엣지(Edge)로 관계 표현&lt;/li&gt;
&lt;li data-end=&quot;845&quot; data-start=&quot;804&quot;&gt;&lt;b&gt;특징&lt;/b&gt;: 관계 탐색에 최적화, Cypher 등 쿼리 언어 사용&lt;/li&gt;
&lt;li data-end=&quot;883&quot; data-start=&quot;846&quot;&gt;&lt;b&gt;사용 예&lt;/b&gt;: 소셜 네트워크, 추천 시스템, 지식 그래프&lt;/li&gt;
&lt;li data-end=&quot;930&quot; data-start=&quot;884&quot;&gt;&lt;b&gt;대표 DB&lt;/b&gt;: Neo4j, Amazon Neptune, ArangoDB&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;935&quot; data-start=&quot;932&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;970&quot; data-start=&quot;937&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 시계열 데이터베이스(Time-Series DB)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1137&quot; data-start=&quot;971&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;998&quot; data-start=&quot;971&quot;&gt;&lt;b&gt;구조&lt;/b&gt;: 시간 순으로 저장되는 데이터&lt;/li&gt;
&lt;li data-end=&quot;1049&quot; data-start=&quot;999&quot;&gt;&lt;b&gt;특징&lt;/b&gt;: 시계열 데이터 삽입/조회/집계 최적화, 다운샘플링, 윈도우 연산 지원&lt;/li&gt;
&lt;li data-end=&quot;1090&quot; data-start=&quot;1050&quot;&gt;&lt;b&gt;사용 예&lt;/b&gt;: IoT 센서 데이터, 주식 시세, 서버 모니터링&lt;/li&gt;
&lt;li data-end=&quot;1137&quot; data-start=&quot;1091&quot;&gt;&lt;b&gt;대표 DB&lt;/b&gt;: InfluxDB, TimescaleDB, OpenTSDB&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1142&quot; data-start=&quot;1139&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1162&quot; data-start=&quot;1144&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ 기타 특수 목적 DB&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1377&quot; data-start=&quot;1163&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1224&quot; data-start=&quot;1163&quot;&gt;&lt;b&gt;객체 DB(Object DB)&lt;/b&gt;: 객체 지향 언어 객체 그대로 저장 (db4o, ObjectDB)&lt;/li&gt;
&lt;li data-end=&quot;1315&quot; data-start=&quot;1225&quot;&gt;&lt;b&gt;멀티모델 DB(Multi-Model DB)&lt;/b&gt;: 여러 모델 지원 (문서+그래프 등)
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1315&quot; data-start=&quot;1280&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1315&quot; data-start=&quot;1280&quot;&gt;예: ArangoDB, OrientDB, CosmosDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1377&quot; data-start=&quot;1316&quot;&gt;&lt;b&gt;검색 엔진/인덱스 DB&lt;/b&gt;: 텍스트 검색 최적화
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1377&quot; data-start=&quot;1351&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1377&quot; data-start=&quot;1351&quot;&gt;예: Elasticsearch, Solr&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;❖ 분류구조/특징사용 예대표 DB&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1872&quot; data-start=&quot;1403&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1872&quot; data-start=&quot;1474&quot;&gt;
&lt;tr data-end=&quot;1543&quot; data-start=&quot;1474&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1484&quot; data-start=&quot;1474&quot;&gt;관계형 RDB&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1504&quot; data-start=&quot;1484&quot;&gt;테이블 기반, SQL, ACID&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1514&quot; data-start=&quot;1504&quot;&gt;은행, ERP&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1543&quot; data-start=&quot;1514&quot;&gt;MySQL, PostgreSQL, Oracle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1610&quot; data-start=&quot;1544&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1556&quot; data-start=&quot;1544&quot;&gt;문서형 NoSQL&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1576&quot; data-start=&quot;1556&quot;&gt;JSON/BSON, 스키마 유연&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1588&quot; data-start=&quot;1576&quot;&gt;로그, 앱 데이터&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1610&quot; data-start=&quot;1588&quot;&gt;MongoDB, Couchbase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1669&quot; data-start=&quot;1611&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1623&quot; data-start=&quot;1611&quot;&gt;키-값 NoSQL&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1641&quot; data-start=&quot;1623&quot;&gt;단순 KV 저장, 빠른 조회&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1650&quot; data-start=&quot;1641&quot;&gt;캐시, 세션&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1669&quot; data-start=&quot;1650&quot;&gt;Redis, DynamoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1729&quot; data-start=&quot;1670&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1682&quot; data-start=&quot;1670&quot;&gt;컬럼형 NoSQL&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1699&quot; data-start=&quot;1682&quot;&gt;컬럼 패밀리, 분석 최적화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1709&quot; data-start=&quot;1699&quot;&gt;빅데이터 분석&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1729&quot; data-start=&quot;1709&quot;&gt;Cassandra, HBase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1801&quot; data-start=&quot;1730&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1739&quot; data-start=&quot;1730&quot;&gt;그래프 DB&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1758&quot; data-start=&quot;1739&quot;&gt;노드/엣지, 관계 탐색 최적화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1776&quot; data-start=&quot;1758&quot;&gt;SNS, 추천, 지식 그래프&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1801&quot; data-start=&quot;1776&quot;&gt;Neo4j, Amazon Neptune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1872&quot; data-start=&quot;1802&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1811&quot; data-start=&quot;1802&quot;&gt;시계열 DB&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1831&quot; data-start=&quot;1811&quot;&gt;시간 기반, 시계열 연산 최적화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1847&quot; data-start=&quot;1831&quot;&gt;IoT, 모니터링, 주식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1872&quot; data-start=&quot;1847&quot;&gt;InfluxDB, TimescaleDB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>기타 등등</category>
      <category>Graph DB</category>
      <category>influxdb</category>
      <category>Neo4j</category>
      <category>Time-Series DB</category>
      <category>그래프 데이터베이스</category>
      <category>데이터베이스 종류</category>
      <category>시계열 데이터베이스</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/311</guid>
      <comments>https://cishome.tistory.com/311#entry311comment</comments>
      <pubDate>Sun, 31 Aug 2025 16:34:32 +0900</pubDate>
    </item>
    <item>
      <title>[javascript] javascript 는 인터프리터 언어?</title>
      <link>https://cishome.tistory.com/310</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;javascript는 많은 개발자들이 아직도 인터프리터 언어로 인식 하고 있습니다. 저도 그렇게 생각했었고요. 하지만 리액트 및 javascript 를 학습하다보니 javascript 는 인터프리터만 사용하는게 아니고 JIT(Just-In-Time) 컴파일러를 사용한다고 하네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 초기 역사에서는 인터프리터 언어로서, 소스 코드를 한 줄씩 읽고 실행하는 방식으로 동작했지만, 최신 자바스크립트 엔진(예: V8, SpiderMonkey 등)은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;성능 최적화를 위해 JIT 컴파일 기술을 도입&lt;/b&gt;&lt;/span&gt;했습니다. 이로 인해 자바스크립트는 다음과 같은 방식으로 처리됩니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;초기 해석 (Parsing)&lt;/b&gt;: 먼저 자바스크립트 코드를 읽어서 구문 트리(Syntax Tree)를 생성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;바이트코드로 변환&lt;/b&gt;: 이 구문 트리를 바탕으로 자바스크립트 엔진은 코드를 바이트코드(Bytecode)로 변환합니다. 이 바이트코드는 인터프리터에 의해 실행됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;JIT 컴파일&lt;/b&gt;: &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;실행 중에 자주 사용되는 코드(핫 코드, hot code)는 자바스크립트 엔진이 감지&lt;/b&gt;&lt;/span&gt;합니다. JIT 컴파일러는 이 핫 코드를 네이티브 머신 코드로 컴파일하여 성능을 크게 향상시킵니다. 즉, 처음에는 인터프리터 방식으로 코드를 실행하지만, 성능이 중요한 부분은 JIT 컴파일러가 실행 중간에 네이티브 코드로 변환해 최적화를 적용합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식 덕분에 자바스크립트는 동적인 언어임에도 불구하고 성능을 크게 향상시킬 수 있습니다. 특히 &lt;b&gt;Google의 V8 엔진&lt;/b&gt;(Chrome 및 Node.js에서 사용)은 매우 발전된 JIT 컴파일러를 사용하여 성능 최적화를 극대화합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;b&gt;자바스크립트는 단순한 인터프리터 언어가 아닌, 인터프리터와 JIT 컴파일 방식을 결합한 하이브리드 방식으로 동작&lt;/b&gt;합니다.&lt;/p&gt;</description>
      <category>web 프로그래밍/javascript</category>
      <category>Interpreter</category>
      <category>javascript jit</category>
      <category>javascript 인터프리터</category>
      <category>jit</category>
      <category>인터프리터</category>
      <category>자바스크립트 인터프리터 언어</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/310</guid>
      <comments>https://cishome.tistory.com/310#entry310comment</comments>
      <pubDate>Sat, 19 Oct 2024 15:04:11 +0900</pubDate>
    </item>
    <item>
      <title>[javascript] isNaN() 과 Number.isNaN() 의 차이점</title>
      <link>https://cishome.tistory.com/309</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서 숫자 타입인지 확인할 때 isNaN 을 사용했는데 ES6 에서 추가된 Number.isNaN 과 무엇이 다른지 잘 모른상태로 사용하다가 이번에 자바스크립트 기본부터 다시 학습하며 어떤점이 다른지 확인해보았습니다.&lt;/p&gt;
&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;isNaN&lt;/b&gt;과 &lt;b&gt;Number.isNaN&lt;/b&gt;은&amp;nbsp;둘 다 숫자가 NaN(Not-a-Number)인지 여부를 확인하는 함수이지만, &lt;b&gt;동작 방식&lt;/b&gt;과 &lt;b&gt;검사 범위&lt;/b&gt;에서 차이가 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. isNaN()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전역 함수&lt;/b&gt;로, 입력값이 숫자가 아닌 경우에도 내부적으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;암묵적 형 변환&lt;/b&gt;을 거쳐 NaN인지 여부를 판단&lt;/span&gt;합니다.&lt;/li&gt;
&lt;li&gt;즉, &lt;span style=&quot;color: #ee2323;&quot;&gt;숫자로 변환 가능한지 여부를 먼저 검사하고&lt;/span&gt;, 그 &lt;span style=&quot;color: #ee2323;&quot;&gt;결과가 NaN이면 true를 반환&lt;/span&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작 방식:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력값을 &lt;b&gt;먼저 숫자로 변환&lt;/b&gt;하고, 변환된 값이 NaN이면 true, 그렇지 않으면 false를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1726992494901&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(isNaN(NaN));           // true
console.log(isNaN(&quot;hello&quot;));       // true (문자열 &quot;hello&quot;는 숫자로 변환할 수 없으므로 NaN)
console.log(isNaN(123));           // false (123은 숫자)
console.log(isNaN(&quot;123&quot;));         // false (문자열 &quot;123&quot;은 숫자 123으로 변환 가능)
console.log(isNaN(true));          // false (true는 숫자 1로 변환 가능)
console.log(isNaN(undefined));     // true (undefined는 NaN으로 변환됨)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Number.isNaN()&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ES6(ECMAScript 2015)에 추가된 &lt;b&gt;숫자 전용 메서드&lt;/b&gt;로, 입력값이 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;정확히 NaN인지&lt;/b&gt;를 검사&lt;/span&gt;합니다.&lt;/li&gt;
&lt;li&gt;입력값을 숫자로 변환하지 않고, &lt;b&gt;그 값이 실제로 NaN인지&lt;/b&gt; 여부만을 엄격하게 검사합니다. 즉, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;형 변환을 하지 않고&lt;/b&gt; 값 자체가 NaN일 때만 true를 반환&lt;/span&gt;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작 방식:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력값이 바로 NaN인지 여부만 검사하고, 그 외에는 false를 반환합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1726992513664&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(Number.isNaN(NaN));           // true (NaN 자체)
console.log(Number.isNaN(&quot;hello&quot;));       // false (&quot;hello&quot;는 NaN이 아님)
console.log(Number.isNaN(123));           // false (숫자 123은 NaN이 아님)
console.log(Number.isNaN(&quot;123&quot;));         // false (문자열 &quot;123&quot;은 NaN이 아님)
console.log(Number.isNaN(true));          // false (true는 NaN이 아님)
console.log(Number.isNaN(undefined));     // false (undefined는 NaN이 아님)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;차이점 정리 :&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징isNaN()Number.isNaN()&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;암묵적 형 변환&lt;/b&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;b&gt;정확성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;변환된 값이 NaN이면 true&lt;/td&gt;
&lt;td&gt;값이 정확히 NaN일 때만 true&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;검사 대상&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;숫자가 아닌 값도 NaN으로 간주될 수 있음&lt;/td&gt;
&lt;td&gt;오직 숫자 값에만 적용, 정확한 NaN 판별&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;isNaN()은 입력값을 숫자로 변환한 뒤에 NaN인지 확인하기 때문에, 숫자가 아닌 값에 대해서도 NaN이라고 판단할 수 있습니다. 따라서, 더 &lt;b&gt;포괄적인 검사&lt;/b&gt;를 수행합니다.&lt;/li&gt;
&lt;li&gt;Number.isNaN()은 값 자체가 정확하게 NaN인지 확인하기 때문에 &lt;b&gt;엄격한 검사&lt;/b&gt;를 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 Number.isNaN()을 사용하는 것이 더 명확하고 의도한 대로 동작하므로, 일반적인 상황에서는 Number.isNaN()을 사용하는 것이 권장됩니다.&lt;/p&gt;</description>
      <category>web 프로그래밍/javascript</category>
      <category>isNaN</category>
      <category>javascript isnan</category>
      <category>javascript number.isnan</category>
      <category>number.isnan</category>
      <category>자바스크립트 isnan</category>
      <category>자바스크립트 number.isnan</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/309</guid>
      <comments>https://cishome.tistory.com/309#entry309comment</comments>
      <pubDate>Sun, 22 Sep 2024 17:13:13 +0900</pubDate>
    </item>
    <item>
      <title>[Next.js] Module parse failed: Unexpected character '�' (1:0)</title>
      <link>https://cishome.tistory.com/308</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;⨯&amp;nbsp;./node_modules/fsevents/fsevents.node&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Module&amp;nbsp;parse&amp;nbsp;failed:&amp;nbsp;Unexpected&amp;nbsp;character&amp;nbsp;'�'&amp;nbsp;(1:0)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;You&amp;nbsp;may&amp;nbsp;need&amp;nbsp;an&amp;nbsp;appropriate&amp;nbsp;loader&amp;nbsp;to&amp;nbsp;handle&amp;nbsp;this&amp;nbsp;file&amp;nbsp;type,&amp;nbsp;currently&amp;nbsp;no&amp;nbsp;loaders&amp;nbsp;are&amp;nbsp;configured&amp;nbsp;to&amp;nbsp;process&amp;nbsp;this&amp;nbsp;file.&amp;nbsp;See&amp;nbsp;&lt;a style=&quot;color: #ee2323;&quot; href=&quot;https://webpack.js.org/concepts#loaders&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://webpack.js.org/concepts#loaders&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;(Source&amp;nbsp;code&amp;nbsp;omitted&amp;nbsp;for&amp;nbsp;this&amp;nbsp;binary&amp;nbsp;file)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경 :&amp;nbsp;Next.js 14.2 버전&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;MacOS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 환경에서 &lt;b&gt;opc ua 통신&lt;/b&gt;을 하기 위해 node-opcua-client 를 설치 후 opc ua 에 요청하니 위와 같은 에러가 나타났습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글을 검색해보니 엑셀 파일, 이미지 파일 입출력 다룰때 나타나는 등 여러 상황에서 나타나는것 같은데 근본적인 원인은 webpack 번들링 문제인것 같았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제를 Next.js 에서 어떻게 해결할 수있을까 관련 정보를 더 찾아보니 next.config.mjs 에 webpack 설정을 추가해주면 해결이 가능한듯 보입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1724992147673&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config, { isServer }) =&amp;gt; {
    if (!isServer) {
      config.resolve.fallback = {
        ...config.resolve.fallback,
        fs: false,
        net: false,
        tls: false,
      };
    }
    config.externals.push({
      fsevents: &quot;require('fsevents')&quot;,
    });
    return config;
  },
  };

export default nextConfig;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;next.config.mjs 파일&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 내용을 추가한 후 다시 서버에 연결 요청을 해보니 이상 없이 잘 접속이 되네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Module parse failed 에러가 나타나는 분들은 위 코드를 적용해보시면 될 것 같습니다.&lt;/p&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>Next.js/Next.js 에러</category>
      <category>./node_modules/fsevents/fsevents.node</category>
      <category>module parse failed</category>
      <category>module parse failed: unexpected character '�' (1:0)</category>
      <category>next.js module parse failed</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/308</guid>
      <comments>https://cishome.tistory.com/308#entry308comment</comments>
      <pubDate>Fri, 30 Aug 2024 13:32:57 +0900</pubDate>
    </item>
    <item>
      <title>[unity] 버텍스(vertex)와 폴리곤(poygon)의 차이</title>
      <link>https://cishome.tistory.com/307</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;버텍스(Vertex)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의&lt;/b&gt;: 버텍스(또는 버텍스)는 3D 공간에서의 점을 의미합니다. 좌표로 정의되며, 3D 모델의 기본 단위입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: 버텍스는 3D 공간에서 특정 위치를 나타내며, 여러 버텍스가 모여서 폴리곤을 형성합니다. 버텍스는 위치 정보 외에도 색상, 법선 벡터, 텍스처 좌표 등의 추가 데이터를 가질 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: 예를 들어, 삼각형 폴리곤은 세 개의 버텍스로 구성됩니다. 이 세 점이 연결되어 면을 이루게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;폴리곤(Polygon)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;정의&lt;/b&gt;: 폴리곤은 버텍스들이 연결되어 형성된 면을 의미합니다. 보통 삼각형(triangle)이나 사각형(quad)으로 구성됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;역할&lt;/b&gt;: 폴리곤은 3D 모델의 표면을 구성합니다. 실제 렌더링되는 객체의 모양을 결정하며, 다각형의 각 변은 두 버텍스를 연결하여 이루어집니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시&lt;/b&gt;: 삼각형 폴리곤은 세 개의 버텍스를 연결한 면이며, 사각형 폴리곤은 네 개의 버텍스로 이루어진 면입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 폴리곤의 개수와 버텍스의 개수는 성능에 영향을 미치는 중요한 요소입니다. 폴리곤과 버텍스의 수가 많을수록 더 높은 해상도와 디테일을 얻을 수 있지만, 성능에는 부하가 걸릴 수 있습니다.&lt;/p&gt;</description>
      <category>unity/unity 공부</category>
      <category>polygon</category>
      <category>vertex</category>
      <category>버텍스</category>
      <category>폴리곤</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/307</guid>
      <comments>https://cishome.tistory.com/307#entry307comment</comments>
      <pubDate>Thu, 8 Aug 2024 15:43:14 +0900</pubDate>
    </item>
    <item>
      <title>[unity] DefaultExecutionOrder 란?</title>
      <link>https://cishome.tistory.com/306</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DefaultExecutionOrder&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 &lt;b&gt;[DefaultExecutionOrder()]&lt;/b&gt; 어트리뷰트는 특정 스크립트의 실행 순서를 제어하기 위해 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 주로 MonoBehaviour 클래스에 적용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 여러 개의 MonoBehaviour 스크립트가 있을 때, 각 스크립트의 Awake, OnEnable, Start 등의 메서드가 실행되는 순서는 기본적으로 예측할 수 없습니다. [DefaultExecutionOrder()] 어트리뷰트를 사용하면 이러한 메서드의 실행 순서를 지정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[DefaultExecutionOrder()] 어트리뷰트를 적용한 스크립트는 유니티의 모든 오브젝트들 중에서 해당 스크립트가 부착된 오브젝트의 실행 순서를 제어합니다. 지정된 값에 따라 Awake, OnEnable, Start 등의 메서드가 실행되는 우선순위가 결정됩니다.&lt;/p&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Awake&lt;/b&gt;: 씬이 로드될 때, [DefaultExecutionOrder] 어트리뷰트에 지정된 값에 따라 Awake 메서드의 실행 순서가 결정됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;OnEnable&lt;/b&gt;: 오브젝트가 활성화될 때, [DefaultExecutionOrder] 어트리뷰트에 따라 OnEnable 메서드의 실행 순서가 결정됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Start&lt;/b&gt;: Awake와 OnEnable이 모두 호출된 후, [DefaultExecutionOrder] 어트리뷰트에 지정된 값에 따라 Start 메서드의 실행 순서가 결정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[예시 코드]&lt;/p&gt;
&lt;pre id=&quot;code_1721874453093&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[DefaultExecutionOrder(-100)]
public class ScriptA : MonoBehaviour
{
    void Awake()
    {
        Debug.Log(&quot;ScriptA Awake&quot;);
    }

    void Start()
    {
        Debug.Log(&quot;ScriptA Start&quot;);
    }
}

[DefaultExecutionOrder(0)]
public class ScriptB : MonoBehaviour
{
    void Awake()
    {
        Debug.Log(&quot;ScriptB Awake&quot;);
    }

    void Start()
    {
        Debug.Log(&quot;ScriptB Start&quot;);
    }
}

[DefaultExecutionOrder(100)]
public class ScriptC : MonoBehaviour
{
    void Awake()
    {
        Debug.Log(&quot;ScriptC Awake&quot;);
    }

    void Start()
    {
        Debug.Log(&quot;ScriptC Start&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세 가지 스크립트를 각기 다른 게임 오브젝트에 부착하고 씬을 로드하면, 다음과 같은 순서로 메서드가 호출됩니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ScriptA의 Awake (우선순위 -100)&lt;/li&gt;
&lt;li&gt;ScriptB의 Awake (우선순위 0)&lt;/li&gt;
&lt;li&gt;ScriptC의 Awake (우선순위 100)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Awake가 모두 실행된 후:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;ScriptA의 Start (우선순위 -100)&lt;/li&gt;
&lt;li&gt;ScriptB의 Start (우선순위 0)&lt;/li&gt;
&lt;li&gt;ScriptC의 Start (우선순위 100)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 지정된 순서에 따라 각 스크립트의 메서드들이 실행됩니다. &lt;b&gt;[DefaultExecutionOrder] 어트리뷰트를 사용하면 스크립트 간의 실행 순서를 명확하게 제어할 수 있어, &lt;span style=&quot;color: #ee2323;&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;※ 참고로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[DefaultExecutionOrder()]&lt;span&gt; 를 지정하지 않으면 기본값인 0으로 간주됩니다. 우선순위 값이 0인 스크립트와 동일한 순서로 처리됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[DefaultExecutionOrder] 어트리뷰트의 값 범위는 -100에서 100으로 제한되지 않습니다. int 타입의 범위 내에서 아무 값이나 사용할 수 있습니다. 따라서 &lt;b&gt;우선순위 값은 &lt;span style=&quot;color: #ee2323;&quot;&gt;-2147483648&lt;/span&gt;에서 &lt;span style=&quot;color: #ee2323;&quot;&gt;2147483647&lt;/span&gt;까지 지정&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>unity/unity 공부</category>
      <category>defaultexecutionorder</category>
      <category>unity [defaultexecutionorder()]</category>
      <category>[defaultexecutionorder()]</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/306</guid>
      <comments>https://cishome.tistory.com/306#entry306comment</comments>
      <pubDate>Thu, 25 Jul 2024 11:34:00 +0900</pubDate>
    </item>
    <item>
      <title>[unity] Scripting Backend란?</title>
      <link>https://cishome.tistory.com/305</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Scripting Backend?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Scripting Backend&quot;라는 용어는 유니티에서 스크립트를 컴파일하고 실행하는 엔진의 내부적인 메커니즘을 가리키는 용어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 단순히 빌드 방식만을 의미하는 것이 아니라, C# 스크립트가 어떻게 변환되고 실행되는지를 포함한 전반적인 프로세스를 나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립팅 백엔드는 C# 코드를 어떻게 처리할 것인지, 즉 어떻게 컴파일하고 실행할 것인지를 정의합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Mono&lt;/b&gt;는 C# 코드를 중간 언어(Intermediate Language, IL)로 컴파일한 후, JIT(Just-In-Time) 컴파일러를 사용해 실행 시에 네이티브 코드로 변환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IL2CPP&lt;/b&gt;는 C# 코드를 중간 언어로 컴파일한 후, 이를 다시 C++ 코드로 변환하고, 최종적으로 네이티브 코드로 컴파일하여 실행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 개발 및 런타임 특성&lt;/h2&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;b&gt;개발 시간&lt;/b&gt;: Mono는 빠른 컴파일 시간을 제공하여 개발 중 자주 스크립트를 수정하고 테스트할 때 유리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;런타임 성능&lt;/b&gt;: IL2CPP는 최적화된 네이티브 코드를 생성하여 일반적으로 더 나은 실행 성능을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 보안 및 배포&lt;/h2&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;b&gt;보안&lt;/b&gt;: IL2CPP로 빌드된 코드는 네이티브 C++ 코드로 변환되기 때문에 디컴파일이 어려워 보안성이 높습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;플랫폼 요구사항&lt;/b&gt;: 특정 플랫폼에서는 특정 스크립팅 백엔드를 요구할 수 있습니다. 예를 들어, iOS는 IL2CPP를 필수로 요구합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;※ Android 에서 IL2CPP 선택시 나타나는 경고문구 해결하는 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;무제111.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPQiCA/btsIMwgVZJr/0hzpKaBh9aUIPdS7dH1iB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPQiCA/btsIMwgVZJr/0hzpKaBh9aUIPdS7dH1iB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPQiCA/btsIMwgVZJr/0hzpKaBh9aUIPdS7dH1iB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPQiCA%2FbtsIMwgVZJr%2F0hzpKaBh9aUIPdS7dH1iB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;56&quot; data-filename=&quot;무제111.png&quot; data-origin-width=&quot;587&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 Android IL2CPP 빌드 설정이 64비트 지원을 포함하지 않습니다.&lt;/li&gt;
&lt;li&gt;많은 Android 장치가 64비트를 지원하므로, 이를 활성화하는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;64비트 지원을 활성화하려면 Player Settings에서 ARM64를 설정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;64비트 아키텍처 지원을 활성화하는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Unity Editor에서 File &amp;gt; Build Settings를 클릭합니다.&lt;/li&gt;
&lt;li&gt;Player Settings 버튼을 클릭합니다.&lt;/li&gt;
&lt;li&gt;왼쪽 메뉴에서 Other Settings를 선택합니다.&lt;/li&gt;
&lt;li&gt;Target Architectures 섹션으로 이동합니다.&lt;/li&gt;
&lt;li&gt;ARM64 옵션을 체크하여 활성화합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 위에서 보인 경고 문구가 사라질겁니다.&lt;/p&gt;</description>
      <category>unity/unity 공부</category>
      <category>il2cpp</category>
      <category>MONO</category>
      <category>scripting backend</category>
      <category>unity scripting backend</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/305</guid>
      <comments>https://cishome.tistory.com/305#entry305comment</comments>
      <pubDate>Wed, 24 Jul 2024 17:38:36 +0900</pubDate>
    </item>
    <item>
      <title>[unity] 유니티 설치시 editor application validating 대기 현상</title>
      <link>https://cishome.tistory.com/304</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 윈도우pc에서 유니티를 설치 하는데 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;editor application validating... 상태에서 1시간이 넘게 진행되지 않는 현상&lt;/b&gt;&lt;/span&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: #ee2323;&quot;&gt;&lt;b&gt;보안 프로그램&lt;/b&gt;&lt;/span&gt;이 문제였네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안랩이나 기타 등등의 보안 프로그램들이 설치되어있는 경우 종종 설치가 더이상 진행되지 않고 &lt;b&gt;editor application validating...&lt;/b&gt; 에서 멈춰있는 경우가 있다네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 프로그램을 제어판에서 다 지우고 유니티 허브를 다시 실행해서 인스톨 시작하니까 이상없이 잘 진행 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 진행에 문제가 생긴경우 보안 프로그램을 삭제 후 다시 해보시면 될거에요.&lt;/p&gt;</description>
      <category>unity/unity 에러</category>
      <category>unity editor application validating...</category>
      <category>unity hub editor application validating...</category>
      <category>유니티 editor application validating... 오래 걸림</category>
      <category>유니티 설치 안넘어감</category>
      <category>유니티 설치 안됨</category>
      <category>유니티 허브 설치 진행 안됨</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/304</guid>
      <comments>https://cishome.tistory.com/304#entry304comment</comments>
      <pubDate>Mon, 4 Dec 2023 20:10:51 +0900</pubDate>
    </item>
    <item>
      <title>[unity] unity webgl 빌드해서 웹에서 실행할 때 input 폼 입력 안되는 현상</title>
      <link>https://cishome.tistory.com/303</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;unity&amp;nbsp;webgl&amp;nbsp;빌드해서&amp;nbsp;웹에서&amp;nbsp;실행할&amp;nbsp;때&amp;nbsp;input&amp;nbsp;폼&amp;nbsp;입력&amp;nbsp;안되는&amp;nbsp;현상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그동안 webgl 파일을 빌드해서 웹에서 사용했었지만 사이트 내에서 키보드 입력을 할 일이 없어서 모르고 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webgl 로 만든 내용이 로딩 되면 그 이후부터는 웹 내에 어떤 곳에서도 키보드 입력이 안된다는걸...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input 태그, textarea 등등 키보드 입력 하는 모든곳의 내용이 안먹히네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 내용도 찾아보고 GPT 에게도 물어봤지만 원하는 답변이 나오지 않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 여러군데의 정보를 찾다가 유니티 매뉴얼 페이지를 보니 여기에 답이 있었네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 뱅글 뱅글 돌아온 느낌... 주소는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/kr/2021.3/Manual/webgl-input.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.unity3d.com/kr/2021.3/Manual/webgl-input.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698128499699&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;WebGL에서 입력 - Unity 매뉴얼&quot; data-og-description=&quot;Unity WebGL은 HTML5 게임패드 API를 지원하는 브라우저에서 게임패드 및 조이스틱에 대한 Input 및 InputSystem을 지원합니다.&quot; data-og-host=&quot;docs.unity3d.com&quot; data-og-source-url=&quot;https://docs.unity3d.com/kr/2021.3/Manual/webgl-input.html&quot; data-og-url=&quot;https://docs.unity3d.com/kr/2021.3/Manual/webgl-input.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cZT7Iw/hyUj7phyrw/ux57A90xF9tqCznzYqXA1k/img.jpg?width=240&amp;amp;height=128&amp;amp;face=0_0_240_128&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/kr/2021.3/Manual/webgl-input.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unity3d.com/kr/2021.3/Manual/webgl-input.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cZT7Iw/hyUj7phyrw/ux57A90xF9tqCznzYqXA1k/img.jpg?width=240&amp;amp;height=128&amp;amp;face=0_0_240_128');&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;WebGL에서 입력 - Unity 매뉴얼&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Unity WebGL은 HTML5 게임패드 API를 지원하는 브라우저에서 게임패드 및 조이스틱에 대한 Input 및 InputSystem을 지원합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.unity3d.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매뉴얼 중간쯤에 보면&lt;/p&gt;
&lt;h2 style=&quot;background-color: #2b2c2f; color: #ffffff; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;키보드 입력 및 포커스 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;라고 되어 있는데 이 부분을 참고하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;중요&lt;/b&gt;&lt;span style=&quot;background-color: #2b2c2f; color: #ffffff; text-align: start;&quot;&gt;: 페이지에 키보드 입력을 수신해야 하는 다른 HTML 요소(예: 텍스트 필드)가 있는 경우 문제가 발생할 수 있습니다. Unity는 페이지의 나머지 부분이 수신하기 전에 입력 이벤트를 소비합니다. HTML 요소가 키보드 입력을 수신하도록 만들려면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a style=&quot;background-color: #2b2c2f; color: #000000; text-align: start;&quot; href=&quot;https://docs.unity3d.com/kr/2021.3/ScriptReference/WebGLInput-captureAllKeyboardInput.html&quot;&gt;WebGLInput.captureAllKeyboardInput&lt;/a&gt;&lt;span style=&quot;background-color: #2b2c2f; color: #ffffff; text-align: start;&quot;&gt;을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;false&lt;span style=&quot;background-color: #2b2c2f; color: #ffffff; text-align: start;&quot;&gt;로 설정하십시오. 이렇게 하면 WebGL 캔버스에 포커스가 있는 경우에만 애플리케이션이 입력을 수신합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebGLInput.captureAllKeyboardInput 부분을 누르면 아래와 같은 코드를 보실 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1698128576415&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        WebGLInput.captureAllKeyboardInput = false;
    }
}&lt;/code&gt;&lt;/pre&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;</description>
      <category>unity/unity 에러</category>
      <category>unity webgl</category>
      <category>unity webgl keyboard input capture</category>
      <category>webgl keyboard input</category>
      <category>webgl 키보드 입력 안됨</category>
      <category>webgl 키보드 키 입력 안됨</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/303</guid>
      <comments>https://cishome.tistory.com/303#entry303comment</comments>
      <pubDate>Tue, 24 Oct 2023 15:23:51 +0900</pubDate>
    </item>
    <item>
      <title>[unity] InvalidOperationException: Insecure connection not allowed</title>
      <link>https://cishome.tistory.com/302</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;InvalidOperationException:&amp;nbsp;Insecure&amp;nbsp;connection&amp;nbsp;not&amp;nbsp;allowed&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니티에서 서버에 데이터&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;요청을 하기 위해 코드를 작성하고&lt;span&gt;&amp;nbsp;실행했습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1696397508397&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string url = &quot;http://192.168.0.92:93/api/getData&quot;;

UnityWebRequest request = UnityWebRequest.Get(url);
    
yield return request.SendWebRequest();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부에 테스트하기 위해 구동중인 서버 인데 데이터 요청하면 위와 같은 에러가 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 관련된 에러인거 보니&amp;nbsp; https 가 아니라서 나타나는듯 싶습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setting 허용이 필요할거같으니 &lt;b&gt;project settings&lt;/b&gt; 에 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽 메뉴들 중에 &lt;b&gt;player&lt;/b&gt; 를 선택해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;b&gt;Configureation&lt;/b&gt; 부분에서 &lt;b&gt;Allow downloads over HTTP 부분이 Not allowed&lt;/b&gt; 로 되어있는데 이걸 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Allowed in development builds&lt;/b&gt;&lt;/span&gt; 또는 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Always allowed&lt;/b&gt;&lt;/span&gt; 로 변경해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(주의할 점 : 유니티 실행 상태일 때 변경하면 적용 안됩니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;실행 상태가 아닐 때 설정해주세요.&lt;/b&gt;&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhGpq8/btswPWrFWCO/oAVBKk6ZpmkIu6H9nc9O61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhGpq8/btswPWrFWCO/oAVBKk6ZpmkIu6H9nc9O61/img.png&quot; data-alt=&quot;유니티 에디터 상단에 실행중 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhGpq8/btswPWrFWCO/oAVBKk6ZpmkIu6H9nc9O61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhGpq8%2FbtswPWrFWCO%2FoAVBKk6ZpmkIu6H9nc9O61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;114&quot; height=&quot;33&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유니티 에디터 상단에 실행중 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccvxnu/btswP1sYpkw/UNLREOrKgZaF56LLyE3wH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccvxnu/btswP1sYpkw/UNLREOrKgZaF56LLyE3wH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccvxnu/btswP1sYpkw/UNLREOrKgZaF56LLyE3wH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccvxnu%2FbtswP1sYpkw%2FUNLREOrKgZaF56LLyE3wH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;290&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/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-origin-width=&quot;831&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clnlsZ/btswPV0DdCe/fNlOSYb6najCZsKwN19qi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clnlsZ/btswPV0DdCe/fNlOSYb6najCZsKwN19qi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clnlsZ/btswPV0DdCe/fNlOSYb6najCZsKwN19qi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclnlsZ%2FbtswPV0DdCe%2FfNlOSYb6najCZsKwN19qi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;228&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 테스트 서버가 http 이기 때문에 awalys allowed 로 했습니다. 실제 배포시에 https 에 요청하는 경우에는 이렇게 안하고 Not allowed 로 해도 문제 없을겁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정 변경 후 다시 요청하면 이상없이 데이터를 수신할 수 있게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deYWkd/btsw0iOBGLr/BBcMD6Qx6FUdcqqU828abK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deYWkd/btsw0iOBGLr/BBcMD6Qx6FUdcqqU828abK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deYWkd/btsw0iOBGLr/BBcMD6Qx6FUdcqqU828abK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeYWkd%2Fbtsw0iOBGLr%2FBBcMD6Qx6FUdcqqU828abK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;36&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 데이터 수신을 잘 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InvalidOperationException 에러 나타나신 분들은 설정 변경 후 다시 시도해보세요.&lt;/p&gt;</description>
      <category>unity/unity 에러</category>
      <category>InvalidOperationException: Insecure connection not allowed</category>
      <category>unity http 요청</category>
      <category>unity InvalidOperationException</category>
      <author>centoss</author>
      <guid isPermaLink="true">https://cishome.tistory.com/302</guid>
      <comments>https://cishome.tistory.com/302#entry302comment</comments>
      <pubDate>Wed, 4 Oct 2023 14:43:46 +0900</pubDate>
    </item>
  </channel>
</rss>