<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>anna_12.log</title>
        <link>https://velog.io/</link>
        <description>끈기와 열정사이</description>
        <lastBuildDate>Thu, 05 May 2022 12:30:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>anna_12.log</title>
            <url>https://images.velog.io/images/anna_12/profile/598b2ef9-3dd6-4b97-8ac2-d631813ed076/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. anna_12.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/anna_12" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[딥링크(Deeplink) - 웹에서 앱 실행시키기]]></title>
            <link>https://velog.io/@anna_12/%EB%94%A5%EB%A7%81%ED%81%ACDeeplink-%EC%9B%B9%EC%97%90%EC%84%9C-%EC%95%B1-%EC%8B%A4%ED%96%89%EC%8B%9C%ED%82%A4%EA%B8%B0</link>
            <guid>https://velog.io/@anna_12/%EB%94%A5%EB%A7%81%ED%81%ACDeeplink-%EC%9B%B9%EC%97%90%EC%84%9C-%EC%95%B1-%EC%8B%A4%ED%96%89%EC%8B%9C%ED%82%A4%EA%B8%B0</guid>
            <pubDate>Thu, 05 May 2022 12:30:16 GMT</pubDate>
            <description><![CDATA[<p>웹에서 앱을 실행시키는 방법을 알아보다 딥링크라는 개념을 알게되어 정리해 봤습니다.</p>
<h3 id="딥링크란">딥링크란?</h3>
<p>http 혹은 https로 시작하는 인터넷 주소는 모두 특정페이지로 이동하는데 앱에서도 이와 유사한 기능을 제공하는데 이를 딥링크라고 합니다.
딥링크를 적용하기위해선 앱의 매니페스트파일상에 설정을 해주어야하고 웹에서 접근 시 앱에서 지정한 경로를 지정해줘야 합니다.</p>
<h4 id="제공방식은-3가지로-구분된다">제공방식은 3가지로 구분된다.</h4>
<ul>
<li>URI 스킴 방식 : 앱에 URI 스킴(scheme) 값을 등록하여 딥링크 사용</li>
<li>앱링크(App Link) : Android 제공 - 도메인 주소를 이용한 딥링크 사용</li>
<li>유니버셜 링크 (Universal Link) : iOS 제공  - 도메인 주소를 이용한 딥링크 사용</li>
</ul>
<h3 id="uri-scheme-방식의-딥링크">&#39;URI Scheme&#39; 방식의 딥링크</h3>
<p>URI 스킴 방식은 Scheme://Path라는 두개의 요소로 구성됩니다.
Scheme 는 앱의 이름, Path는 접근 경로 (host) 를 지정합니다.</p>
<p><strong>안드로이드 매니페스트 설정</strong></p>
<pre><code>&lt;activity​ android:name=&quot;.MainActivity&quot;​ android:screenOrientation=&quot;portrait&quot;&gt; 
    &lt;intent-filter&gt; 
        &lt;action android:name=&quot;android.intent.action.MAIN&quot; /&gt; 
        &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&gt; 
    &lt;/intent-filter&gt; 
    &lt;intent-filter&gt; 
        &lt;action android:name=&quot;android.intent.action.VIEW&quot; /&gt; 
        &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&gt; 
        &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; /&gt; 
        &lt;data​ android:host=&quot;main_web&quot;​ android:scheme=&quot;myappandroi&quot; /&gt; 
    &lt;/intent-filter&gt; 
&lt;/activity&gt;​</code></pre><p><strong>Javascript 이동 링크</strong></p>
<pre><code class="language-javascript">// 앱이 있으면 앱 실행, 없으면 마켓 이동
let pakageName = &#39;com.myappandroi.m&#39;
location.href =&#39;intent://main_web#Intent;scheme=myappandroi;package=com.myappandroi.m;end&#39;;</code></pre>
<p>안드로이드 공식 홈페이지 참고하면 더 자세한 내용들이 많습니다.</p>
<blockquote>
<p>참고자료
<a href="https://help.dfinery.io/hc/ko/articles/360039757433-%EB%94%A5%EB%A7%81%ED%81%AC-Deeplink-URI%EC%8A%A4%ED%82%B4-%EC%9C%A0%EB%8B%88%EB%B2%84%EC%85%9C-%EB%A7%81%ED%81%AC-%EC%95%B1%EB%A7%81%ED%81%AC-%EA%B5%AC%EB%B6%84%EA%B3%BC-%EC%9D%B4%ED%95%B4">딥링크의 이해</a>
<a href="https://androi.tistory.com/364">예제1 - 전체적인 참고</a>
<a href="https://jkroh.tistory.com/20">예제2 - 웹 사용 포멧 참고</a>
<a href="https://developer.android.com/training/app-links">안드로이드 공식 홈페이지 - 딥링크</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Amazon] AWS Builders 온라인 시리즈 (AWS 의 기업 가치)]]></title>
            <link>https://velog.io/@anna_12/Amazon-AWS-Builders-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%8B%9C%EB%A6%AC%EC%A6%88</link>
            <guid>https://velog.io/@anna_12/Amazon-AWS-Builders-%EC%98%A8%EB%9D%BC%EC%9D%B8-%EC%8B%9C%EB%A6%AC%EC%A6%88</guid>
            <pubDate>Thu, 14 Apr 2022 19:05:10 GMT</pubDate>
            <description><![CDATA[<h3 id="아마존의-핵심-미션-가장-고객중심적인-일을-하겠다">아마존의 핵심 미션! &quot;가장 고객중심적인 일을 하겠다.&quot;</h3>
<p>아마존은 Culture of Innovation 를 가지고 있는 기업입니다.</p>
<p><strong>Amazon Flywheel</strong></p>
<ul>
<li>Price</li>
<li>Selection</li>
<li>Convenience
<img src="https://images.velog.io/images/anna_12/post/e12e2226-a257-4e7a-8f40-5277ad31f062/image.png" alt=""></li>
</ul>
<h4 id="1-문화--leadership-16가지-혁신">1. 문화 =&gt; LeaderShip (16가지) 혁신</h4>
<p>전직원이 리더라는 인식을 갖게하는 스프링 LP (Leadership Principles) 를 통한 의사결정
<img src="https://images.velog.io/images/anna_12/post/8486738d-3564-42a6-aadc-09de576e77a4/image.png" alt="LP (Leadership Principles) 구조"></p>
<ul>
<li><p>Invent and Simplify
내 아이디에만 전착하지말고 다른 조직원의 아이디어에도 적용할 수 있어야 한다.
혁신할때는 미친사람취급을 받을 각오를하고 견뎌내라.</p>
</li>
<li><p>Working Backwards is a process
같은 인풋의 원하는 아웃풋을 내기위한 
기존 서비스는 경제성분석 후 서비스를 출시 후 고객의 피드백을 받는 방식이라면, 아마존은 이 과정을 역으로 진행합니다.</p>
</li>
</ul>
<p>고객 <strong>Press release</strong> 후 FAQ 를 진행 후 고객의 pain point 를 해결하기위한 솔루션 제시를 하게됩니다. (=&gt; 대상고객과 무엇을 이룰지 정함)
이후 솔루션을 제시 받은 고객의 경험에 대한 value propotion 이 해결되었는지 체크합니다. 
<strong>Customer FAQs / Stakeholder FAQs</strong> (왜 이서비스가 성공할거라고 믿는지, 고객이 이서비스로 움직이지 않는다면 어떤일을 할 수 있는지)
<strong>Visuals</strong> =&gt; 고객이 실제 어떤 경험을 얻을지 확인 </p>
<blockquote>
<p>해당 체크포인트를 기준으로 working backwards is a process 를 진행하게됨
<img src="https://images.velog.io/images/anna_12/post/ec071a8b-3140-41ca-bb35-c156feef29aa/image.png" alt="Press release"></p>
</blockquote>
<h3 id="aws-의-대표적인-nosql-database-서비스-알아보기">AWS 의 대표적인 NoSQL Database 서비스 알아보기</h3>
<p><img src="https://images.velog.io/images/anna_12/post/2e36fcfc-0252-4dfe-bea5-d2e8d55176c8/image.png" alt="관계형데이터베이스"></p>
<blockquote>
<p> 무료교육과정
<img src="https://images.velog.io/images/anna_12/post/19d7b2fc-036f-4768-890d-9fa8ed8bb0d8/image.png" alt=""></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Unity3D WebGL 빌드 (WebAssembly) 와 React 와 양방향 통신]]></title>
            <link>https://velog.io/@anna_12/Unity3D-WebGL-%EB%B9%8C%EB%93%9C-WebAssembly-%EC%99%80-React-%EC%99%80-%EC%96%91%EB%B0%A9%ED%96%A5-%ED%86%B5%EC%8B%A0</link>
            <guid>https://velog.io/@anna_12/Unity3D-WebGL-%EB%B9%8C%EB%93%9C-WebAssembly-%EC%99%80-React-%EC%99%80-%EC%96%91%EB%B0%A9%ED%96%A5-%ED%86%B5%EC%8B%A0</guid>
            <pubDate>Tue, 12 Apr 2022 16:17:36 GMT</pubDate>
            <description><![CDATA[<h2 id="1-unity-설치-및-세팅">1. unity 설치 및 세팅</h2>
<p>유니티 Unity Hub 를 다운로드하여 Unity 프로그램을 설치한다.
주의 할 점은 프로젝트 설치 경로안에 한글이 포함될 경우 오류가 발생할 가능성이 있으니 모두 영문폴더의 경로에 설치할 것
<a href="https://unity.com/kr/download">https://unity.com/kr/download</a></p>
<h2 id="2-unity-프로젝트-생성">2. unity 프로젝트 생성</h2>
<p>필자는 3D로 프로젝트를 진행 중이어서 3D로 프로젝트를 하나 생성했습니다. (프로젝트명에 공란 없이 | 프로젝트 생성 경로에 한글이 포함되지 않도록 주의)
<img src="https://velog.velcdn.com/images/anna_12/post/1b7f099c-5d28-4263-b88f-5cf05e5badb9/image.png" alt=""></p>
<h2 id="3-간단한-예제-및-c-스크립트-작성">3. 간단한 예제 및 C# 스크립트 작성</h2>
<p>1) 통신을 위해 간단한 Text 와 Button 을 생성해 주었습니다.
<img src="https://velog.velcdn.com/images/anna_12/post/92b34400-bcf4-489b-a27a-0df8210ac192/image.png" alt=""></p>
<p>2) C# 코드에 버튼을 클릭하면 Text 가 1씩 증가되는 코드를 작성 했습니다.
3) unity 상태창 우클릭으로 Create Empty 하여 C# 코드를 드래그로 추가해 주고, 기존에 만든 UI Text 도 드래그 하여 C# 에서 만든 UnityEngine.UI의 Text 객체와 연결해 주었습니다. 
4) Button 같은 경우 On Click 메서드에 C# 파일을 매칭시켜 버튼이 클릭 되었을때 호출을 원하는 메서드와 연결해 주었습니다.</p>
<h2 id="4-npx-create-react-app-으로-react-프로젝트를-설치해-주었습니다">4. npx create-react-app 으로 react 프로젝트를 설치해 주었습니다.</h2>
<p><img src="https://velog.velcdn.com/images/anna_12/post/8c5e6e8e-7f6b-4354-a981-09a6fccebf17/image.png" alt="">
리엑트 실행 시 Module not found: Can&#39;t resolve &#39;web-vitals&#39; 오류 해결
<a href="https://qodbtn.tistory.com/374">https://qodbtn.tistory.com/374</a></p>
<h2 id="5-리엑트에서-webgl-통신이-가능하도록-연결해주는-라이브러리를-설치-합니다">5. 리엑트에서 webgl 통신이 가능하도록 연결해주는 라이브러리를 설치 합니다.</h2>
<pre><code>// react-unity-webgl 설치
npm i react-unity-webgl</code></pre><p>아래 4단계는 npm 문서 확인하며 진행 했습니다.</p>
<ul>
<li>Getting Started</li>
<li>Understanding the Unity Context Object</li>
<li>Communication from React to Unity</li>
<li>Communication from Unity to React</li>
</ul>
<p><a href="https://www.npmjs.com/package/react-unity-webgl">참고 : react-unity-webgl</a></p>
<p>참고로, 유튜브에선 대략적인 흐름을 참고하고, 라이브러리 사용부턴 npm 문서를 위주로 참고하시는 게 좋습니다.</p>
<p><img src="https://velog.velcdn.com/images/anna_12/post/4d68b5f5-8226-4b2f-9ed3-0771c8508487/image.gif" alt=""></p>
<blockquote>
<ul>
<li>참고자료
<a href="https://www.youtube.com/watch?v=D1lEBY0MzvQ&amp;t=32s">뚜르TV</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Kurento] WebRTC 미디어 서버 설치 및 예제]]></title>
            <link>https://velog.io/@anna_12/Kurento-WebRTC-%EB%AF%B8%EB%94%94%EC%96%B4-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%98%88%EC%A0%9C</link>
            <guid>https://velog.io/@anna_12/Kurento-WebRTC-%EB%AF%B8%EB%94%94%EC%96%B4-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%98%88%EC%A0%9C</guid>
            <pubDate>Tue, 05 Apr 2022 18:59:20 GMT</pubDate>
            <description><![CDATA[<p>쿠렌토 미디어 서버 설치는 공식 홈페이지에 잘 기재되어 있으니 순서대로 잘 따라하기만 하면 된다.</p>
<h3 id="서버-환경">서버 환경</h3>
<pre><code>Ubuntu 18.04 bionic -&gt; 필자의 서버 환경
Ubuntu 16.04 xenial 
Ubuntu 14.04 trusty -&gt; kurento 에서 지원중단</code></pre><h2 id="1-쿠렌토-저장소-추가">1. 쿠렌토 저장소 추가</h2>
<pre><code>sudo apt-key adv --keyserver keyserver.ubuntu.com:80 --recv-keys 5AFA7A83</code></pre><p>터미널에 그대로 입력</p>
<pre><code>sudo tee &quot;/etc/apt/sources.list.d/kurento.list&quot; &gt;/dev/null &lt;&lt;EOF
# Kurento Media Server - Release packages
deb [arch=amd64] http://ubuntu.openvidu.io/6.9.0 bionic kms6
EOF</code></pre><p>한줄한줄 그대로 따라 작성
첫번째 줄은 &quot;/etc ~&quot; 에 파일생성 및 아래 입력하는 내용을 입력하겠다는 명령어 이고
두번째줄과 세번째 줄 입력 후 네번째 줄 (EOF) 입력할 시 입력이 완료됩니다.</p>
<h2 id="2-쿠렌토-설치하기">2. 쿠렌토 설치하기</h2>
<pre><code>sudo apt-get update
sudo apt-get install kurento-media-server</code></pre><p>패키지 업데이트 후, kurento-media-server을 설치한다.
아래는 공식홈페이지에서 안내하는 명령어</p>
<pre><code>sudo apt-get update &amp;&amp; sudo apt-get install --no-install-recommends --yes \
    kurento-media-server</code></pre><h2 id="3-쿠렌토-미디어-서버-시작--종료">3. 쿠렌토 미디어 서버 시작 &amp; 종료</h2>
<pre><code>sudo service kurento-media-server start
sudo service kurento-media-server stop</code></pre><h2 id="4-쿠렌토-설치-확인">4. 쿠렌토 설치 확인</h2>
<pre><code>$ ps -fC kurento-media-server
UID        PID  PPID  C STIME TTY          TIME CMD
kurento   7688     1  0 13:36 ?        00:00:00 /usr/bin/kurento-media-server

$ sudo netstat -tupln | grep -e kurento -e 8888
tcp6  0  0  :::8888  :::*  LISTEN  7688/kurento-media-</code></pre><h2 id="5-도메인-주소-변경-시">5. 도메인 주소 변경 시</h2>
<pre><code>curl \
  --include \
  --header &quot;Connection: Upgrade&quot; \
  --header &quot;Upgrade: websocket&quot; \
  --header &quot;Host: 127.0.0.1:8888&quot; \
  --header &quot;Origin: 127.0.0.1&quot; \
  http://127.0.0.1:8888/kurento</code></pre><p>/etc/kurento/kurento.conf.json 파일에서 변경이 가능합니다.</p>
<h2 id="6-쿠렌토-예제">6. 쿠렌토 예제</h2>
<pre><code># 예제를 복제합니다
git clone https://github.com/chapin666/kurento-group-call-node.git

# 복제한 폴더로 이동합니다.
cd kurento-group-call-node

# sfu 방식으로 브랜치 전환
git checkout sfu

# bower 을 다운받는다.
npm install bower -g

# node-module 을 install 함 (get 명령어에 npm install 명령어 기재되어 있음)
npm run get

# ./server/index.js 경로의 주소를 내 서버 주소로 변경해준다.

const argv = minimst(process.argv.slice(2), {
    default: {
        as_uri: &#39;https://localhost:3000&#39;,
        ws_uri: &#39;ws://127.0.0.1:8888/kurento&#39;   // your KMS uri
    }
})

# node 실행 명령어
node index.js</code></pre><p>내 경우 aws 인스턴스 내에 설치했기 때문에 kurento 서버에서 사용하고있는 포트넘버를 보안그룹에서 포트포워딩도 함께 진행했다.
그리고 클라이언트 코드를 http 에서 실행하게 될 경우 Navigator.getUserMedia() 에서 에러가 나는데 이는 http 상에서 유저의 미디어를 호출 할 수 없기때문에 https 설정을 해줘야 한다. </p>
<blockquote>
<ul>
<li>참고자료
<a href="https://doc-kurento.readthedocs.io/en/stable/user/installation.html">공식홈페이지 : 로컬 설치</a>
<a href="https://ilovephp.tistory.com/entry/%EC%BF%A0%EB%A0%8C%ED%86%A0Kurento%EB%AF%B8%EB%94%94%EC%96%B4-%EC%84%9C%EB%B2%84-%EC%84%A4%EC%B9%98-javascript-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%EC%97%B0%EB%8F%99-1">쿠렌토(Kurento)미디어 서버 설치</a>
<a href="https://github.com/chapin666/kurento-group-call-node">쿠렌토 예제 https://github.com/chapin666/kurento-group-call-node</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Ubuntu - "No space left on device" 오류 대처 방법]]></title>
            <link>https://velog.io/@anna_12/Ubuntu-No-space-left-on-device-%EC%98%A4%EB%A5%98-%EB%8C%80%EC%B2%98-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@anna_12/Ubuntu-No-space-left-on-device-%EC%98%A4%EB%A5%98-%EB%8C%80%EC%B2%98-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 04 Apr 2022 16:44:51 GMT</pubDate>
            <description><![CDATA[<p>ubuntu 서버를 사용중인데 mkdir 하려하니 &quot;No space left on device&quot; 오류를 마주했다.
결론적으론 device 상에 남은 용량이 없다는 것이다.</p>
<p>사용중인 디스크를 확인했다.</p>
<h3 id="1-디스크-확인">1. 디스크 확인</h3>
<pre><code>df -h
명령어를 입력해 확인해보니 디스크를 모두 사용하고 있는걸 확인할 수 있었다.
df -i
명령어는 inode 공간을 확인하는 명령어이다. (inode의 자세한 내용은 참고자료에 있다.)</code></pre><p><img src="https://media.vlpt.us/images/anna_12/post/3ce36c06-0f63-4010-8669-1b76bb1f4654/image.png" alt=""></p>
<p>가장 많은 공간을 사용하고 있는 폴더를 확인해 필요없는 파일들을 삭제한다.</p>
<h3 id="2-찾기">2. 찾기</h3>
<pre><code>du -sh *

## 해당 경로에서 바로 용량 확인하기
du -h --max-depth=1

## 폴더별 용량 sort해서 보기 
du -hs * | sort -rh | head -5

* 찾아보니, 로그 파일이 엄청 용량을 차지하고 있었음</code></pre><h3 id="3-로그파일-비우기">3. 로그파일 비우기</h3>
<pre><code>## kern.log 용량 0으로 바꾸기
cat /dev/null &gt; /var/log/kern.log 

## syslog 용량 0으로 바꾸기
cat /dev/null &gt; /var/log/syslog

## 나머지 삭제 등등
sudo rm -rf syslog.*</code></pre><h3 id="4-휴지통-비우기">4. 휴지통 비우기</h3>
<pre><code>## 마지막으론 휴지통의 내용들도 삭제했다.
rm -rf ~/.local/share/Trash/files/*</code></pre><blockquote>
<ul>
<li>참고자료
<a href="https://dknny.tistory.com/13">[RaspberryPi] 기본 관리(No space left on device)</a>
<a href="https://www.e2enetworks.com/help/knowledge-base/no-space-left-on-device-running-short-of-inodes/">“No space left on device”- Running short of Inodes.</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[WebRTC] WebRTC SFU 핵심 용어 정리]]></title>
            <link>https://velog.io/@anna_12/WebRTC</link>
            <guid>https://velog.io/@anna_12/WebRTC</guid>
            <pubDate>Wed, 30 Mar 2022 07:33:09 GMT</pubDate>
            <description><![CDATA[<p>webRTC 의 기초적인 설명은 간단하게 기술할 예정이며, webRTC SFU 방식의 포커싱하여 정리할 예정입니다.  </p>
<h2 id="webrtc-란">WebRTC 란?</h2>
<p><img src="https://images.velog.io/images/anna_12/post/dffd9f4d-e62f-4002-82a6-4353eece0be2/image.png" alt=""></p>
<blockquote>
<p>WebRTC(Web Real-Time Communication) 은 웹 애플리케이션과 사이트가 중간자 없이 브라우저 간에 오디오나 영상 미디어를 포착하고 마음대로 스트림 할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다.</p>
</blockquote>
<ul>
<li>MDN의 WebRTC 문서 인용</li>
</ul>
<p>MDN 에서 기술한 내용을 참고해 보면 웹 애플리케이션과 사이트가  통신을 하기위해 내 위치 (IP Adress) 를 어떻게 알 수 있는거지? 라는 의문이 발생하게 됩니다.</p>
<p>WebRTC 가 실시간으로 웹에서 데이터교환을 할 수 있는 이유는 시그널링이라고 일컬어지는 NAT 우회 과정을 거치기 때문입니다.</p>
<p>관련하여 어떤 과정들이 일어나게 되는지 아래 기술드리겠습니다.</p>
<h2 id="webrtc-프로토콜">WebRTC 프로토콜</h2>
<p>WebRTC는 TCP와 UDP 기반의 다양한 프로토콜로 이뤄진다.
<img src="https://images.velog.io/images/anna_12/post/e7e974ab-2a10-4d5b-9f2f-1e19796d5b96/webRTC_Protocol.png" alt=""></p>
<p>우선 대략적으로 WebRTC가 위에서 말했던 프로토콜들을 아래와 같이 사용한다.</p>
<ol>
<li>Signalling</li>
<li>Connecting</li>
<li>Securing</li>
<li>Communicating</li>
</ol>
<p><strong>조금 더 자세한 버전을 확인하고 싶다면 W3의 예시 문서를 참고 하길 권한다.</strong>
<a href="https://www.w3.org/TR/webrtc/images/ladder-2party-simple.svg">https://www.w3.org/TR/webrtc/images/ladder-2party-simple.svg</a>
<a href="https://www.w3.org/TR/webrtc/#simple-peer-to-peer-example">https://www.w3.org/TR/webrtc/#simple-peer-to-peer-example</a></p>
<p>각 단계별 프로토콜은 아래와 같다.</p>
<p><strong>Signalling</strong></p>
<p>XMLHttpRequest
long polling
WebSocket
MQTT Over WebSocket
SDP (Session Description Protocol)</p>
<p><strong>Connecting</strong></p>
<p>ICE (Interactive Connectivity Establishment)</p>
<p><strong>Securing</strong></p>
<p>DTLS (Datagram Transport Layer Security)
SRTP (Secure Real-time Transport Protocal)</p>
<p><strong>Communicating</strong></p>
<p>RTP (Real-time Transport Protocol)
SCTP (Stream Control Transmission Protocol)
RTCP (Real-time Transport Control Protocol)</p>
<h2 id="webrtc-주요-기술-살펴보기">WebRTC 주요 기술 살펴보기</h2>
<h3 id="sdp-session-description-protocol">SDP (Session Description Protocol)</h3>
<blockquote>
<p>세션 기술 프로토콜(Session Description Protocol, SDP)은 스트리밍 미디어의 초기화 인수를 기술하기 위한 포맷이다. 이 규격은 IETF의 RFC 4566로 규정되어 있다.
WEB RTC는 시그널링 서버의 구현은 별도의 제약이 없다. 따라서 Http Long polling, Web socket, MQTT, SIP등을 사용해서 자유롭게 구현이 가능하다.</p>
</blockquote>
<p><img src="https://images.velog.io/images/anna_12/post/a80ae20f-9cdb-428b-8931-4e3796584acb/image.png" alt=""></p>
<p>WebSocket 이나 SIP등을 통해 공유 신호 채널(시그널링)을 도입 후, WebRTC 연결을 하는데 필요한 첫 단계로 SDP는 매체를 운반하지 않는 대신, 운반할 매체의 종류, 네트워크 전송 수단, 사용 코덱과 그 설정, 대역폭 정보등 메타데이터와 같은 전반적인 커넥션의 특성을 나열한 세션프로필을 설명한다. 아래와 같이 스트링을 직접 전송도 가능하고, XMPP(XML) 로 매핑하기도 한다.</p>
<p><a href="https://ko.wikipedia.org/wiki/XMPP">https://ko.wikipedia.org/wiki/XMPP</a>
<a href="https://webrtc.github.io/samples/src/content/peerconnection/munge-sdp/">https://webrtc.github.io/samples/src/content/peerconnection/munge-sdp/</a> 
에서 단계별로 실험을 해볼 수 있다.</p>
<p>자세한 정보는 크롬의 내장 WebRTC 분석도구를 통해서 확인 가능하다.</p>
<ul>
<li>chrome://webrtc-internals</li>
</ul>
<h3 id="ice-stun-trun">ICE, STUN, TRUN</h3>
<p>클라이언트는 STUN을 통해 자신의 공인 IP를 확인을 한 뒤 상대 Peer에게 본인의 공인 IP를 알려준다. 상태 Peer 또한 본인의 공인 IP 정보를 제공한다.</p>
<p>다만 이 Stun으로 모든 것을 해이 어려운 경우가 있는데, Client와 상대 Peer이 같은 네트워크에 존재 할 때는 이것만으로 해결이 어렵다고 한다. 또한 Symeetric NAT의 경우에도 Application이 달라지면 NAT 매핑테이블이 바뀔 수 있어 연결이 어렵다고도 한다.[3]</p>
<p>이런경우 TRUN을 이용하여 수집을 한다. ICE(Interactive Connectivity Establishment, RFC 5245)라는 프레임워크가 수행한다. ICE는 두개의 단말이 P2P 연결이 되도록 최적의 경로를 찾아주는 프레임워크다.</p>
<p>ICE 프로토콜 (RFC 5245)를 사용하면 직접연결이 어려울때는 Stun을 사용하고 그래도 실패하면 turn을 사용한다.</p>
<p><img src="https://images.velog.io/images/anna_12/post/84fba7fa-bcbe-4d78-822d-83c93cbd8b24/image.png" alt=""></p>
<p>이렇게 클라이언트는 ICE에 사용할 Candidate(후보)를 수집한다. 각 후보는 미디어를 수신 할 수있는 잠재적 주소와 포트. 일반적으로 세 가지 유형의 후보자가 생성된다.[2]</p>
<ul>
<li><strong>Host Candidate</strong>: Private IP with Port</li>
<li><strong>Server Reflex Candidate</strong>: Public IP with Port by STUN, TRUN</li>
<li><strong>Relay Candidate</strong>: Turn server IP with Port by TURN</li>
</ul>
<p>더 친절한 도움은 아래 링크를 보자</p>
<ul>
<li><a href="https://wormwlrm.github.io/2021/01/24/Introducing-WebRTC.html?fbclid=IwAR3faUybD0GNfMq7uQQ6KWz9Ma-fjwAKx1gXlnZygGcUpkhY86X7aL_0WHI">Introducing-WebRTC</a></li>
</ul>
<h3 id="connection-동작-개요">Connection 동작 개요</h3>
<p><img src="https://images.velog.io/images/anna_12/post/00bb8957-f83a-4ff3-bf6b-4117f2429612/image.png" alt=""></p>
<p>각 Peer 간 연결 호 수립이 완료 되면 미디어 데이터를 주고 받는다.
이때 사용하는 프로토콜은 RTP와 RTCP가 있다.</p>
<h4 id="rtp-real-time-transport-protocol">RTP (Real-time Transport Protocol)</h4>
<p>실시간 데이터 전송을 위한 표준 패킷형식으로 오디오, 비디오 등 실시간 데이터를 멀티캐스트나 유니캐스트로 전송하기 적합한 기능 제공</p>
<h4 id="rtcp-real-time-transport-control-protocol">RTCP (Real-time Transport Control Protocol)</h4>
<p>RTP 와 함께 쓰이며, QoS, 모니터링, 수신자 정보수집, 전송율 계산등을 제공
실시간 전송 프로토콜(Real-time Transport Protocol, RTP)은 IP 네트워크 상에서 오디오와 비디오를 전달하기 위한 통신 프로토콜이다. RTP는 전화, 그리고 WebRTC, 텔레비전 서비스, 웹 기반 푸시 투 토크 기능을 포함한 화상 통화 분야 등의 스트리밍 미디어를 수반하는 통신, 엔터테인먼트 시스템에 사용된다. RTP는 일반적으로 사용자 데이터그램 프로토콜(UDP)로 동작한다. RTP는 RTCP(RTP Control Protocol)와 결합하여 사용된다. RTP가 오디오/비디오와 같은 미디어 스트림을 전달하는 반면, RTCP는 전송 통계와 QoS를 모니터링하고 다중 스트림의 동기화를 도와준다.</p>
<blockquote>
<ul>
<li>참고자료
<a href="https://www.html5rocks.com/en/tutorials/webrtc/basics/#toc-rtcpeerconnection">https://www.html5rocks.com/en/tutorials/webrtc/basics/#toc-rtcpeerconnection</a></li>
</ul>
</blockquote>
<blockquote>
<ul>
<li>별도 참고자료
<a href="https://choisee02.tistory.com/33">WebRTC SFU Load Testing</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 가상돔을 이해하는 과정]]></title>
            <link>https://velog.io/@anna_12/React-%EA%B0%80%EC%83%81%EB%8F%94%EC%9D%84-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95</link>
            <guid>https://velog.io/@anna_12/React-%EA%B0%80%EC%83%81%EB%8F%94%EC%9D%84-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95</guid>
            <pubDate>Sat, 12 Mar 2022 10:15:26 GMT</pubDate>
            <description><![CDATA[<h2 id="기초지식">기초지식</h2>
<p>브라우저 렌더링 엔직 동작 원리
<a href="https://all-young.tistory.com/22">https://all-young.tistory.com/22</a></p>
<p>브러우저 렌더링 과정 이해해기
<a href="https://tecoble.techcourse.co.kr/post/2021-10-24-browser-rendering/">https://tecoble.techcourse.co.kr/post/2021-10-24-browser-rendering/</a></p>
<h2 id="1-가상-돔-virtual-dom-이-나오게-된-이유">1) 가상 돔 (Virtual Dom) 이 나오게 된 이유</h2>
<p><a href="https://dev-cini.tistory.com/10">https://dev-cini.tistory.com/10</a></p>
<h2 id="2-가상-돔-virtual-dom-이란">2) 가상 돔 (Virtual Dom) 이란?</h2>
<p><a href="https://dev-cini.tistory.com/11">https://dev-cini.tistory.com/11</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] - 참과 거짓 (Truthy & Falsy)]]></title>
            <link>https://velog.io/@anna_12/JavaScript-%EC%B0%B8%EA%B3%BC-%EA%B1%B0%EC%A7%93-Truthy-Falsy</link>
            <guid>https://velog.io/@anna_12/JavaScript-%EC%B0%B8%EA%B3%BC-%EA%B1%B0%EC%A7%93-Truthy-Falsy</guid>
            <pubDate>Wed, 02 Mar 2022 05:46:11 GMT</pubDate>
            <description><![CDATA[<h2 id="참과-거짓truthy--falsy">참과 거짓(Truthy &amp; Falsy)</h2>
<h3 id="1-false인-값">1. False인 값</h3>
<ul>
<li>undefined</li>
<li>null</li>
<li>0</li>
<li>-0</li>
<li>NaN</li>
<li>false</li>
<li>&#39;&#39;</li>
<li>&quot;&quot;</li>
</ul>
<p><strong>위에 명시된 값들을 제외한 빈 문자열을 포함한 모든 값들은 true 이다.</strong></p>
<h3 id="2-true인-값">2. True인 값</h3>
<ul>
<li>&#39;0&#39; (0을 포함하는 문자열)</li>
<li>&#39;false&#39; (false를 포함하는 문자열)</li>
<li>[] (빈 배열)</li>
<li>{} (빈 객체)</li>
<li>function () {} (빈 함수)</li>
</ul>
<h4 id="21-사용예시">2.1 사용예시</h4>
<pre><code class="language-javascript">if (0) {
  console.log(&quot;Hello I am inside if statement&quot;);
}

if (&quot; &quot;) {     // 공백이 하나 있는 문자열
  console.log(&quot;Hello I am inside second if statement&quot;);
}

// 첫번째 if구문 : false
// 두번째 if구문 : true</code></pre>
<h3 id="3-비교연산자">3. 비교연산자</h3>
<p>JavaScript는 값을 비교하기 전에 각 값을 문자열 표현으로 변환하기 때문에 ==로 비교할 때는, 서로 다른 값이 true가 된다.</p>
<pre><code class="language-javascript">// all true
 1 == &#39;1&#39;;
 1 == [1];
&#39;1&#39; == [1];</code></pre>
<p>따라서 비교연산자를 사용할 경우 == 보단, 값의 유형까지 비교하는 할 수 있는 === 사용을 권장한다.</p>
<pre><code class="language-javascript">// all false
1 === &#39;1&#39;;
1 === [1];
&#39;1&#39; === [1];</code></pre>
<h3 id="유용한-응용-사용법">유용한 응용 사용법</h3>
<h4 id="nullish-coalescing-operator--란">Nullish coalescing operator ?? 란</h4>
<p>왼쪽 표현식이 null 또는 undefined 인 경우 오른쪽 표현식 결과를 반환한다.</p>
<pre><code class="language-javascript">
// leftExpr ?? rightExpr
const foo = null ?? &#39;default string&#39;;
console.log(foo);
// expected output: &quot;default string&quot;</code></pre>
<h4 id="logical-or-operator--란">Logical OR operator || 란</h4>
<p>하나 이상이 참인 경우에만 참이며, 지정된 피연산자 중 하나의 값을 반환
왼편이 참인경우 왼편의 값을 리턴하며 왼편이 falsy인 경우 오른쪽 값을 리턴</p>
<pre><code class="language-javascript">
// expr1 || expr2
const foo = null || &#39;default string&#39;;
console.log(foo);
// expected output: &quot;default string&quot;
</code></pre>
<p><img src="https://images.velog.io/images/anna_12/post/2bf22017-2616-45ac-9841-e26f5ce19dd4/image.png" alt=""></p>
<blockquote>
<ul>
<li>참고자료
<a href="https://www.sitepoint.com/javascript-truthy-falsy/">https://www.sitepoint.com/javascript-truthy-falsy/</a></li>
</ul>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[IA (Information Architecture)]]></title>
            <link>https://velog.io/@anna_12/IA-Information-Architecture</link>
            <guid>https://velog.io/@anna_12/IA-Information-Architecture</guid>
            <pubDate>Wed, 19 Jan 2022 11:25:20 GMT</pubDate>
            <description><![CDATA[<p>IA 란 UX 의 중요한 기법중의 하나로써, 서비스에서 제공하는 콘텐츠 (정보) 를 체계화하고 이용자가 가장 빠르고 정확히 원하는 콘텐츠 (정보)에 접근할 수 있는 구조를 만드는 기술</p>
<p>프로그램의 구조를 명확히 파악하기에도 좋으며, 의사결정과정에서 구조적으로 구분된 자료를 통해 빠른 의사결정을 하기에도 용이하다. </p>
<blockquote>
<h4 id="ia-의-구성요소">IA 의 구성요소</h4>
</blockquote>
<ul>
<li>정보구조 (Organization System) 의 정의</li>
<li>네이게이션 (Navigation System)</li>
<li>레이블링 (Labeling System)</li>
<li>검색 (Search System)</li>
<li>컨텐츠 디자인(Contents Design)</li>
</ul>
<h3 id="ia-의-구성요소-5단계">IA 의 구성요소 (5단계)</h3>
<h4 id="정보구조-organization-system-의-정의">정보구조 (Organization System) 의 정의</h4>
<p>시각차이, 언어의 모호성, 언어의 이질성, 내부정책 등에 따라 정보를 분류해낼 수 있다.
주제별로 분류해 낼 수도 있으며, 이용자별, 작업지향형, 기능별, 상징별, 은유형 등으로 데이터 및 정보를 분류해 낼 수 있다.</p>
<p>서비스의 목정에 따라 정보를 분류하되, 내부정책 및 전략에 근거하여 최종 정보분류 작업에 들어간다. 이는 사용자가 얼마나 이해하기 쉽게 접근하기 위한 가장 기초적인 작업니다.</p>
<h4 id="네이게이션-navigation-system">네이게이션 (Navigation System)</h4>
<p>서비스제공 공간에서 상호작용을 설계하는 것이며 따라서 사용자의 경험을 이용하여 사용자의 두뇌에 인식하도록 만드는 것이다.</p>
<p>목적 : 네비게이션은 목적 중심적이며 행동 지향적이다.</p>
<p>&lt;주요 요소들&gt;</p>
<ul>
<li>여기는 어디인가?</li>
<li>갈 수 있는 곳은 어디인가?</li>
<li>갈 수 있는 방법은 무엇인가?</li>
<li>예정에 갔던 곳을 어떻게 다시 갈 수 있는가?</li>
</ul>
<h4 id="레이블링-labeling-system">레이블링 (Labeling System)</h4>
<p>레이블링은 메뉴의 각 명명법, 컨텐츠에 사용되는 모든 사용법의 단어들 또는 지시하거나 도와주거나 설명하는 언어로 사용되는 텍스트를 의미한다.</p>
<p>이런 레이블은 고객 언어와 같은 언어를 사용해 만들어야하며 전문용어 대신 고객이 어떤언어를 사용하는지 주의깊게 관찰하는 습관이 필요하다.</p>
<p>&lt;중요 포인트!&gt;</p>
<ul>
<li>일관성 있는 레이블링을 만들어야 한다.
ex) 숫자 : 1,2,3 | one,two,three
ex) 버튼명 : 검색 | Search</li>
</ul>
<h4 id="검색-search-system">검색 (Search System)</h4>
<ul>
<li><p>Knowing-item Searching : 이미 무엇을 찾을 지 구체적으로 구상하고 나서 찾는 검색행위로 이니 유저가 무엇을 찾을 것 인지 구체적인 목적이 명확한 상태를 의미</p>
</li>
<li><p>Casual-Browsing : 우연에 기인한 검색. 유저가 무엇을 찾을 것인지 구체적인 목적은 없지만 어떤 주제, 어떤 분야 등의 대략적 개념을 가지고 사이트의를 탐색하는 검색행위</p>
</li>
<li><p>존재 가능성 검색 : 내가 찾는 정보가 있는 사이트인지 없는 사이트인지 &#39;존재 가능성&#39;에 대한 검색이 수초 안에 이루어지며 없다고 판단될 시에 바로 다른사이트로 이동하며 검색하는 행위.</p>
</li>
<li><p>포괄적이며 전반적인 검색 : 어떤 키워드에 대한 전반적인 정보를 찾는 유저의 경우 하나의 사이트이상에서 정보를 포괄적으로 수직하게되는 경우를 뜻함.</p>
</li>
</ul>
<h4 id="컨텐츠-디자인contents-design">컨텐츠 디자인(Contents Design)</h4>
<p>Contents Design, Disposition System
콘텐츠 설계 및 배치, &#39;스토리 보드 및 UI설계서&#39;로 만들어지는 컨텐츠를 배치하는 부분을 의미하며 하나의 화면에서 보여지게 될 정보를 어떻게 배치 해야 하는가에 대한 설계도 포함한다.</p>
<ul>
<li>전략적으로 좌상단, 중상단, 좌중단 순으로 주요정보를 배치한다.</li>
<li>이사이트의 목적이 무엇이며 무엇을 봐야 하는지 2~3개 컨텐츠를 집중한다.</li>
<li>사용성이 적은 컨텐츠는 과감히 삭제하며 메뉴로 브라우징 할 수 있도록 한다.</li>
<li>디자인적인 요소가, 컨텐츠 설계, 배치에 영향을 주지 않도록 한다.</li>
<li>최대 7개 이상의 메인메뉴를 배치하지 않는다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[UI & UX Process ]]></title>
            <link>https://velog.io/@anna_12/UI-UX-Process</link>
            <guid>https://velog.io/@anna_12/UI-UX-Process</guid>
            <pubDate>Wed, 29 Dec 2021 17:21:17 GMT</pubDate>
            <description><![CDATA[<p>프로젝트 진행과정은 크게 아래과 같은 단계를 거쳐 진행됩니다.
디테일하게는 더 많은 과정이 있지만 현 블로그는 UI &amp; UX 과정을 설명 예정으로 간단하게만 나열했습니다.</p>
<h3 id="프로젝트의-작업-진행과정">프로젝트의 작업 진행과정</h3>
<p>1) 프로젝트시작 및 프로덕트미팅
MVP (Minimum viable product) - 정말 기본적인 기능 먼저, 빠르게런칭 
PRD (Product Requirements Document) - 제품이 가진 문제/필요한 기능들을 문서화한것 
== Use Case 사용자가 원하는 것을 갖기 위해 취하는 액선을 스텝별로 정의해놓은 리스
2) 리서치(이해/분석/정의)
3) 아이디어 스케치&amp;선택 - user flow, 와이어프레임, user experience
4) 디테일한 UX/UI 작업
5) 테스트</p>
<h4 id="2--4-에-해당하는-부분을-좀-더-심층있는-조사를-진행하기-위한-방법으론-아래와-같은-과정을-추가할-수-있다">#2 ~ #4 에 해당하는 부분을 좀 더 심층있는 조사를 진행하기 위한 방법으론 아래와 같은 과정을 추가할 수 있다.</h4>
<p>[리서치 자료] 
리서치 자료 타입은 2가지가 존재합니다.
정량적자료(Quantitative Data), 질적자료(Qualitative Data)
정량적 자료로는 숫자로 이루어진 자료 질적자료는 설문조사등을 통한 문자로 이루어진 자료입니다.</p>
<ul>
<li><p>프로젝트요약 설명</p>
</li>
<li><p>조사와 발견 (리서치) - Target 정립</p>
</li>
<li><p>설문조사</p>
</li>
<li><p>설문조사 결과</p>
</li>
<li><p>유저프로필</p>
</li>
<li><p>문제설정 (Problem statement)</p>
</li>
<li><p>사용자 목표, 비즈니스 목표 (Goals - Users bUsiness) 유저들이 해당서비스를 통해서 뭘 얻고싶어할지</p>
</li>
<li><p>타겟플랫폼 정립</p>
</li>
<li><p>사용자 요구사항 (User needs)</p>
</li>
<li><p>팔요조건 (Requirements)</p>
</li>
<li><p>아이디어구상 - 브레인스토밍</p>
</li>
<li><p>경쟁사 조사 분석 (Competitors analysis) -  경쟁사 특징, 좋은점, 나쁜점</p>
</li>
<li><p>유저와 시스템간 상호작용 표현 (Scenarios &amp; Use case)</p>
</li>
<li><p>프로토타입 (와이어 프레임)</p>
</li>
<li><p>IA (Information Archtexture) - 유저가 이해하기 쉬운 속성들은 navigation 형태로 제공하여 유저가 이해하기 쉽게 유도하기 위함, 혹은 프로젝트의 전체 흐름을 파악하기위한 용도</p>
</li>
</ul>
<blockquote>
<p>참고문서</p>
</blockquote>
<ul>
<li><a href="https://usabilitygeek.com/how-to-use-the-system-usability-scale-sus-to-evaluate-the-usability-of-your-website/">SUS(시스템 사용성 척도) 를 평가하는 방법</a></li>
<li><a href="https://brunch.co.kr/@ebprux/621">UX 리서치 기법</a></li>
</ul>
<blockquote>
<p>같이 읽어보면 좋은 자료
<a href="https://www.designlog.org/2512836">UI 디자인 트렌드, 변화는?</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] null, undefined 빈값 처리]]></title>
            <link>https://velog.io/@anna_12/JavaScript-null-value-%EC%B2%98%EB%A6%AC</link>
            <guid>https://velog.io/@anna_12/JavaScript-null-value-%EC%B2%98%EB%A6%AC</guid>
            <pubDate>Mon, 13 Dec 2021 07:57:15 GMT</pubDate>
            <description><![CDATA[<pre><code>//자료형에 상관없이 빈값 유무 확인, true:있음, false:없음 ([], {} 도 빈값으로 처리)
function isExist(val) {
    if (val == &quot;&quot; || val == null || val == undefined || (val != null &amp;&amp; typeof val == &quot;object&quot; &amp;&amp; !Object.keys(val).length)) {
        return false;
    } else {
        return true;
    }
}

if(isExist) {
    //값이 존재할 경우에만 실행!!!
}</code></pre>]]></description>
        </item>
    </channel>
</rss>