<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>qkrtjrwls_.log</title>
        <link>https://velog.io/</link>
        <description>내 서비스 만들기</description>
        <lastBuildDate>Tue, 27 Feb 2024 07:42:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>qkrtjrwls_.log</title>
            <url>https://velog.velcdn.com/images/qkrtjrwls_/profile/fc84b28b-cc9f-480d-ba39-9cd0462e2f45/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. qkrtjrwls_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/qkrtjrwls_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[React-native-reanimated란?]]></title>
            <link>https://velog.io/@qkrtjrwls_/React-native-reanimated%EB%9E%80</link>
            <guid>https://velog.io/@qkrtjrwls_/React-native-reanimated%EB%9E%80</guid>
            <pubDate>Tue, 27 Feb 2024 07:42:20 GMT</pubDate>
            <description><![CDATA[<h2 id="📌react-native--reanimated란">📌React-native -reanimated란</h2>
<blockquote>
<p>React-native에서 Animation을 Frame drop 없이 사용가능 하도록 만든 패키지</p>
</blockquote>
<ul>
<li>React-native animated가 가지고 있는 단점을 해결<h3 id="📌react-native-animated의-단점">📌react-native animated의 단점</h3>
<ul>
<li>main thread 와 js thread의 통신
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/49f5d8ba-7c1f-4f3f-82a7-fe4008af5e89/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="📌react-native-reanimated">📌react-native-reanimated</h3>
<blockquote>
<p>animation 관련된 작업을 모두 main thread에서 실행 worklet을 이용하여 js thread로 전달</p>
</blockquote>
<h4 id="worklet">worklet</h4>
<blockquote>
<p>작은 조각의 javascript 조각, 뷰 속성을 업데이트 하거나, 이벤트에 반응할 때 ui thread에서 바로 실행 시킬 수 있는 js 조각</p>
</blockquote>
<ul>
<li>생성 방법 : 함수 상단에 worklet이라는 string을 추가</li>
<li>함수 외부에 있는 값을 사용하더라도 함께 가져감<pre><code>const funa = () =&gt; {
&#39;worklet&#39;
/* ...etc logic */
}</code></pre></li>
</ul>
<h4 id="shared-values">shared values</h4>
<blockquote>
<p>JS Thread 와 Main Thread 모두에서 읽기 또는 수정이 가능 한 값
Main thread에서는 값이 변경됨을 바로 감지 할 수 있어 읽기에 특화됨</p>
</blockquote>
<pre><code>const animval = use sharedvalue(0)
{...etc}
return (
 &lt;Button onPress={() =&gt; {animval.value = math.random()}}
)</code></pre><h4 id="설치">설치</h4>
<ul>
<li>npx install --save react-native-reanimated</li>
<li>babel.config.js<pre><code>plugins: [&#39;react-native-reanimated/plugin&#39;],</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Native Module 이 뭔가요?]]></title>
            <link>https://velog.io/@qkrtjrwls_/Native-Module-%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94</link>
            <guid>https://velog.io/@qkrtjrwls_/Native-Module-%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94</guid>
            <pubDate>Sun, 25 Feb 2024 17:40:48 GMT</pubDate>
            <description><![CDATA[<h2 id="📌react-native가-동작하는-원리">📌React Native가 동작하는 원리</h2>
<h3 id="thread란-">Thread란 ?</h3>
<ul>
<li>실행되는 프로세스 내에서 실제로 작업을 실행하는 주체</li>
<li>명령어를 실행하여 처리 하는 주체(like 음식점에서 음식을 만드는 행위와 비슷)<h4 id="main-thread-or-ui-thread">Main Thread or UI Thread</h4>
</li>
<li>Native 영역에 레이아웃을 그려주는 역할<h4 id="javascript-thread">JavaScript Thread</h4>
</li>
<li>작성한 Javascript 실행 되는곳<h4 id="native-module-thread">Native Module Thread</h4>
</li>
<li>Native Module을 다룰때 사용하게 되는 Thread</li>
<li>특정 리소스등을 요청하고자 할때 사용<h4 id="shadow-thread">Shadow Thread</h4>
</li>
<li>virtual DOM으로부터 새로운 Layout으로 변환하도록 계산해주는 역할
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/0ae8ce7d-5b95-4323-a9a4-5a21a6d43a89/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/63c266ad-1549-4942-9ec3-a44695a941cb/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/edb0f2c7-87ae-4ba3-9d5a-9518f159b80d/image.png" alt=""></li>
</ul>
<h2 id="📌native-module-이란-0">📌Native Module 이란-0</h2>
<h3 id="native-module-이란-native-api를-사용-하기-위한것">Native Module 이란 Native API를 사용 하기 위한것.</h3>
<blockquote>
<p>주로 현재 위치, wifi 상태 등 native 영역에서만 알고 있는 정보에 접근하는것 또는 image processing 처럼 연산이 native의 높은 performance가 필요할때 사용</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/a8b39e1c-b167-4d4b-a122-a7cb601c6ed4/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/e29a84b9-44dc-4b91-8ac5-f6ecbb3935a2/image.png" alt=""></p>
<h2 id="📌new-architeture">📌New Architeture</h2>
<h3 id="why-new-architecture">Why New Architecture?</h3>
<blockquote>
<p>Bridge가 가지고 있는 본질적인 문제를 해결 하기 위함</p>
</blockquote>
<h4 id="bridge-가-가진-제한점1">Bridge 가 가진 제한점#1</h4>
<ul>
<li>비동기 처리<h4 id="bridge-가-가진-제한점2">Bridge 가 가진 제한점#2</h4>
</li>
<li>싱글 스레드</li>
<li>Javascript가 싱글 스레드에서 동작하기 때문에 Bridge도 싱글 스레드로 동작 함 <h4 id="bridge-가-가진-제한점3">Bridge 가 가진 제한점#3</h4>
</li>
<li>변환시 드는 과도한 비용</li>
<li>Bridge로 이동 하게 될때 JSON Object 변환하는 비용이 큼<h3 id="new-architecture--jsi">New Architecture ( JSI)</h3>
<blockquote>
<p>기존에 있는 Bridge를 버리고, JSI가 해당 역할을 대신 하도록 수정</p>
</blockquote>
<h4 id="jsi-javasript-interface-c-객체에-대한-참조를-할수-있게-해주는-역할">JSI: Javasript interface, C++ 객체에 대한 참조를 할수 있게 해주는 역할</h4>
<blockquote>
</blockquote>
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/e8bb4d51-151a-4f8b-9038-2c5b2adaca7c/image.png" alt=""></li>
</ul>
<h4 id="new-architecture를-적용-하며-얻은것1">New Architecture를 적용 하며 얻은것#1</h4>
<ul>
<li>동기 실행이 가능하게 됨</li>
<li>C++ 모듈로 직접 접근을 할 수 있다보니 비동기 통신이 어니어도 됨<h4 id="new-architecture를-적용-하며-얻은것2">New Architecture를 적용 하며 얻은것#2</h4>
</li>
<li>동시성</li>
<li>javascript에서 다른 스레드에 있는 함수를 호출 할 수 있음<h4 id="new-architecture를-적용-하며-얻은것3">New Architecture를 적용 하며 얻은것#3</h4>
</li>
<li>Overhead가 줄어듬</li>
<li>JSON Object로 변환 하지 않고 C++ 언어로 통신하게 되었기 때문<h4 id="new-architecture를-적용-하며-얻은것4">New Architecture를 적용 하며 얻은것#4</h4>
</li>
<li>ios, Android간 내부 네이티브 모듈 코드 공유 가능</li>
<li>C++이 추가됨으로 인하여 플랫폼이 다르더라도 한개의 코드로 관리 가능<h4 id="new-architecture를-적용-하며-얻은것5">New Architecture를 적용 하며 얻은것#5</h4>
</li>
<li>타입의 안정성</li>
<li>자동으로 생성 되는 코드 레이어에 의해서 자동으로 타입을 생성 하도록 되어있음</li>
</ul>
<h3 id="fabric이란">Fabric이란?</h3>
<blockquote>
</blockquote>
<ul>
<li>New Architecture의 새로운 rendering system.</li>
<li>이전 Architecture에서는 UI Manager가 담당하던 부분</li>
</ul>
<h4 id="fabric-개선점">Fabric 개선점</h4>
<blockquote>
<p> Shadow Thread에서 새로운 Shadow Tree를 계산하던 로직을 자바스크립트에서 C++ 로직으로 변환 가능하도록 수정 
 OnLayout, onMeasure등 View의 위치, 사이즈등을 계산하던 로직을 비동기에서 동기 함수로 변환 했기 때문에 많은 퍼포먼스 이득</p>
</blockquote>
<h3 id="turbo-nativemodule">Turbo NativeModule</h3>
<blockquote>
<p>기존 Architecture에서는 NativeModule로 사용되던 것, Bridge가 사라지게 되면서 추가됨</p>
</blockquote>
<h4 id="turbo-nativemodules-장점">Turbo NativeModules 장점</h4>
<ul>
<li><ol>
<li>Platform 전반적으로 Typecheck가 잘됨</li>
</ol>
</li>
<li><ol start="2">
<li>플랫폼 별 코드 공유가 쉬움( C++ 로 작성된 코드를 공유)</li>
</ol>
</li>
<li><ol start="3">
<li>Native Module Lazy Loading이 적용됨<ul>
<li>Lazy Loading: 최초에 모든 리소스를 로드 하는것이 아닌, 필요 할때 로드하는 방식.(최초 로드시 부하를 줄이기 위함)</li>
</ul>
</li>
</ol>
</li>
<li><ol start="4">
<li>JSI 사용으로 인하여 Native 와 Javascript코드간 통신이 효율적</li>
</ol>
<ul>
<li>JSON Object로 변환 없이 C++ 코드만으로 통신 가능<h3 id="codegen">CodeGen</h3>
<blockquote>
<p>3rd-party library에서 제공되는 코드를 인터페이스에 맞게 작성하면 JSI 관련 코드들을 만들어 주는것, 프로젝트를 빌드 할때 자동으로 실행(빌드 시간에 영향)</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h2 id="📌hermes">📌Hermes</h2>
<blockquote>
<p>Facebook에서 만든 javascript Engine, Bytecode 형태로 미리 컴파일 하여 저장 해둔 뒤 사용
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/dbdad4e6-ab5e-41e4-914c-9f0027d8e940/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/2f44ba8d-1f9c-4bda-b101-bc65d03acf3c/image.png" alt=""></p>
</blockquote>
<h3 id="또다른-장점">또다른 장점</h3>
<ul>
<li>사용하는 Memory의 감소(기존 185mb -&gt; 136mb)</li>
<li>AAB / ARK 크기 감소(기존 41mb -&gt; 22mb)<h3 id="적용-되어있는지-확인">적용 되어있는지 확인</h3>
<pre><code>const isHermes = () =&gt; global.Hermesinternal !== null;</code></pre></li>
<li>Hermes의 장점을 온전히 보기 위해서는 release build Type으로 확인</li>
</ul>
<h2 id="📌new-architecture-프로젝트-만들어-보기">📌New Architecture 프로젝트 만들어 보기</h2>
<ul>
<li>bundle install &amp;&amp; RCT_NEW_ARCH_ENABLED=1 bundle exec pod install</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[iOS / Android 에서 반드시 알아야 할 개념]]></title>
            <link>https://velog.io/@qkrtjrwls_/iOS-Android-%EC%97%90%EC%84%9C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@qkrtjrwls_/iOS-Android-%EC%97%90%EC%84%9C-%EB%B0%98%EB%93%9C%EC%8B%9C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Sun, 25 Feb 2024 14:44:34 GMT</pubDate>
            <description><![CDATA[<h2 id="📌application">📌Application</h2>
<h3 id="안드로이드-application에서-전체-앱-상태를-관리하는-class">안드로이드 Application에서 전체 앱 상태를 관리하는 class</h3>
<blockquote>
<h3 id="event를-전달하기-위한-함수를-제공">Event를 전달하기 위한 함수를 제공</h3>
</blockquote>
<h4 id="oncreate--어플리케이션이-실행될때-최초에-호출">onCreate : 어플리케이션이 실행될때 최초에 호출</h4>
<h4 id="onterminate-어플리케이션이-종료될때-호출">onTerminate: 어플리케이션이 종료될때 호출</h4>
<h2 id="📌manifest">📌Manifest</h2>
<h3 id="android-앱의-메타-정보를-요약해서-선언-해-둔것">Android 앱의 메타 정보를 요약해서 선언 해 둔것</h3>
<blockquote>
<h4 id="권한-이름-패키지명-등-앱의-전반적인-내용들을-담고-있음">권한, 이름 패키지명 등 앱의 전반적인 내용들을 담고 있음</h4>
</blockquote>
<h4 id="위치-androidappsrcmainandroidmanifestxml">위치: android/app/src/main/AndroidManifest/xml</h4>
<h2 id="📌activity">📌Activity</h2>
<h3 id="안드로이드에서-화면을-구성-하는-요소">안드로이드에서 화면을 구성 하는 요소</h3>
<blockquote>
<h4 id="유저가-직접-보고-누르는-등의-액션이-발생됨">유저가 직접 보고, 누르는 등의 액션이 발생됨</h4>
</blockquote>
<h4 id="안드로이드의-4구성-요소activity-service-receiver-content-provider">안드로이드의 4구성 요소(activity, service, receiver, content provider)</h4>
<h4 id="intent란-">intent란 ?</h4>
<ul>
<li>어떤 Activity를 호출할때 사용하는것 매개변수와 함께 보내는것 navigation을 이동했던것과 비슷한 형태<h4 id="activity-life-cycle">Activity Life-cycle</h4>
</li>
<li>onCreate -&gt; onResume -&gt; onPause -&gt; onDestroy<h4 id="intent-filter-">intent-Filter ?</h4>
</li>
<li>Intent를 실행 시킬때 어떤 종류의 activity인지를 빠르게 찾기 위한 수단</li>
<li>Intent-Filter 구조
Action: activity가 어떤 행동에 유효한 것인지 나타내는 값(ex SEND등)
Category: 어떤 종류의 액티비티 인지를 나타내는 값<pre><code>&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;</code></pre><ul>
<li>종류:</li>
<li>ACTION_MAIN: 앱의 시작점. 홈화면에 아이콘이 만들어짐</li>
<li>ACTION_SEND: 공유하기 액션등이 필요할때 사용됨</li>
<li>ACTION_DIAL: 전화번호 폰 패드와 같은 화면이 필요할때 사용됨</li>
</ul>
</li>
</ul>
<h2 id="📌ios-appdelegate">📌ios-AppDelegate</h2>
<blockquote>
<p>Android에서 activity처럼 화면을 구성 하는 단위, 각각 앱의 상태에 따라 불려지게 되는 함수가 있음</p>
</blockquote>
<h4 id="didfinishlaunchingwithoptions">didFinishLaunchingWithOptions</h4>
<ul>
<li>앱이 최초 실행될때 호출되는 함수(like android application onCreate)<h4 id="infoplist">info.plist</h4>
</li>
<li>권한, 앱의 이름, 실행시 주로 필요한 값들을 관리해주는 파일 SDK API Key값, 권한 요청시 텍스트 등 값을 관리<h4 id="bulid-phase">Bulid Phase</h4>
</li>
<li>앱을 실행 시킴에 있어 필요한 값들을 자동으로 설정하도록 Command로 모두 선언해둔것</li>
</ul>
<h2 id="📌android-ios-permissions">📌Android, ios Permissions</h2>
<h3 id="permissions">Permissions</h3>
<blockquote>
<p>특정 리소스를 필요로 할 떄 사용자에게 허용 할것인지 물어보는것</p>
</blockquote>
<p> <img src="https://velog.velcdn.com/images/qkrtjrwls_/post/a6ef99ac-7562-49a3-b50c-73afe94600ea/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/0074c9ad-1878-443f-a686-9cc2af225b3e/image.png" alt=""></p>
<h3 id="추가로-더-필요한것">추가로 더 필요한것</h3>
<ul>
<li>ios - info.plist 권한 요청문</li>
</ul>
<h3 id="자주-사용하는-권한">자주 사용하는 권한</h3>
<blockquote>
<h3 id="자주-사용하는-권한1">자주 사용하는 권한#1</h3>
</blockquote>
<h4 id="사진-관련">사진 관련</h4>
<ul>
<li>ios - NSPhotoLibrayUsageDescription</li>
<li>Android - READ_EXTERNAL_STORAGE<h3 id="자주-사용하는-권한2">자주 사용하는 권한#2</h3>
<h4 id="카메라-관련">카메라 관련</h4>
</li>
<li>ios - NSPhotoLibrayUsageDescription</li>
<li>Android - WRITE_EXTERNAL_STORAGE<h3 id="자주-사용하는-권한3">자주 사용하는 권한#3</h3>
<h4 id="위치-관련">위치 관련</h4>
</li>
<li>ios - NSLocationAlWaysAndWhenInUseUsageDescription</li>
<li>Android<ul>
<li>ACCESS_FINE_LOCATION</li>
<li>ACCESS_COARSE_LOCATION</li>
<li>ANDROID_BACKGROUND_LOCATION<h3 id="자주-사용하는-권한4">자주 사용하는 권한#4</h3>
</li>
</ul>
</li>
<li>AppTrackingTransparency</li>
<li>IDFA를 읽어오는 권한</li>
<li>IOS 앱 심사시 필수로 보고 있는 정보</li>
</ul>
<h2 id="📌ios--android에서-알아야-하는것">📌ios / Android에서 알아야 하는것</h2>
<h3 id="scheme">Scheme</h3>
<ul>
<li>외부에서 우리 앱을 호출하거나, 우리 앱이 외부앱을 호출 하는 수단<pre><code>(scheme)test://path/to/screen </code></pre><h3 id="scheme-테스트-하는법">Scheme 테스트 하는법</h3>
<h4 id="uri-scheme-package-를-통하여-테스트">uri-scheme package 를 통하여 테스트</h4>
</li>
<li>npx uri-scheme open &quot;scheme://path&quot; -- ios</li>
<li>npx uri-scheme open &quot;scheme://path&quot; -- android</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[What is Firebase🔥 ? ]]></title>
            <link>https://velog.io/@qkrtjrwls_/What-is-Firebase</link>
            <guid>https://velog.io/@qkrtjrwls_/What-is-Firebase</guid>
            <pubDate>Sun, 18 Feb 2024 16:45:07 GMT</pubDate>
            <description><![CDATA[<h2 id="🔥firebase">🔥Firebase</h2>
<blockquote>
<p>구글에서 만들어진  BAAS(Backend As A Service) 모바일에서 필요한 거의 모든 기능을 제공, 저장장치, 테스팅 푸시 등 필요한 거의 모든 기능을 제공</p>
</blockquote>
<h3 id="🔥realtime-database">🔥RealTime DataBase</h3>
<blockquote>
<p>실시간으로 접근 할 수 있는 database NoSQL의 형태로 구성되어있음, 실질적으로 저장되는 값은 key와 value값으로 구성된 JSON Object</p>
</blockquote>
<h4 id="🔥제한사항">🔥제한사항</h4>
<blockquote>
<p>동시 연결에 대한 제한이 있음(무료 plan 100, 유료 plan 20만) 한번에 Write은 1MB 내외</p>
</blockquote>
<h4 id="🔥storage">🔥Storage</h4>
<blockquote>
<p>파일 저장을 위해서 사용, 프로필사진, 임시 저장하는 파일 저장 가능.</p>
</blockquote>
<h3 id="🔥cloud-firestore">🔥Cloud Firestore</h3>
<blockquote>
<p>데이터를 저장 하기 위한 제품, 실시간성, NoSQL을 지원한다는 점을 Realtime database와 비슷</p>
</blockquote>
<ul>
<li>저장하는 값: JSON 형태가 아닌 Collections를 저장</li>
<li>Document: Data가 집합해있는 단위</li>
<li>Collections: Document가 집합해있는 단위</li>
</ul>
<h3 id="🔥realtime-database-vs-coludfirestore-차이">🔥RealTime Database vs ColudFirestore 차이</h3>
<p> <img src="https://velog.velcdn.com/images/qkrtjrwls_/post/b36759e3-7e8a-49be-9830-1804744e2a43/image.png" alt=""></p>
<blockquote>
<p>종합 : 큰 단위 데이터 요청시에는 Cloud Firestore
데이터가 작고 CRUD가 자주 발생하면 Realtime database</p>
</blockquote>
<h3 id="🔥firebase에-익숙해지기">🔥Firebase에 익숙해지기</h3>
<blockquote>
<p>crashlytics / remote config / abtest</p>
</blockquote>
<h4 id="crashlytics">Crashlytics</h4>
<ul>
<li><p>앱이 강제종료 되었음을 알려주는 Tool, 로직을 잘 작성하더라도 라이브러리 등에서 크래시가 날 수 도 있다.</p>
<h4 id="remote-config">Remote Config</h4>
</li>
<li><p>원격에 있는 상수값을 업데이트 해줄 수 있는 Tool, 특정 기능에 대한 ON/OFF 또는 특정화면의 텍스트를 바꾸는것으로 활용</p>
<blockquote>
<p>주의점: Remote Config값을 조회 실패했을때 대비하여 기본값을 설정, 실패 등 여러가지 이유로 인하여 최신값을 항상 보여주지는 않음</p>
</blockquote>
<h4 id="ab-test">AB Test</h4>
</li>
<li><p>A그룹과 B그룹을 두고 어떤 그룹이 더 많은 전환율을 보이는지 체크, 기존 버전과 신규로 변경된 버전에서의 분기, 개선된 버전에서의 유저 피드백을 받는다는 이점</p>
</li>
<li><p>사전작업</p>
<ul>
<li>Remote Config: config 설정된 값들에 대하여 가능</li>
<li>Analytics: 분석을 위해 필요<h3 id="🔥react-native-firebase">🔥React-Native-Firebase</h3>
<blockquote>
<p>Firebase를 사용 가능 하도록 만들어둔 Package
<a href="https://rnfirebase.io/">https://rnfirebase.io/</a></p>
</blockquote>
</li>
</ul>
</li>
<li><p>npx expo install expo-dev-client</p>
</li>
<li><p>npx expo install @react-native-firebase/app</p>
</li>
<li><p>npx expo install expo-build-properties
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/e851440b-bd1c-44a6-8cb5-265d775cb01f/image.png" alt=""></p>
<ul>
<li>googleServicesFile 파일을 넣어준다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/b87a8360-63a9-4d7a-b7b4-f63594872b04/image.png" alt=""></li>
<li>이 과정이 모두 완료되면 npx expo prebuild --clean 커맨드를 해주게 되면 native 코드들이 추가된다.</li>
</ul>
</li>
</ul>
<h3 id="🔥-oauth-20">🔥 OAuth 2.0</h3>
<blockquote>
<p>인증을 위한 개방형 표준 프로토콜
 Thrid party 프로그램에게 리소스 소유자를 대신하여 서버에서 데이터 제공</p>
</blockquote>
<h4 id="authentication-인증-하는-단계">Authentication: 인증 하는 단계</h4>
<h4 id="authorization-인증이-끝난-뒤-access-token이-부여되는것">Authorization: 인증이 끝난 뒤 Access Token이 부여되는것</h4>
<h4 id="access-token-유저에게-권한-받았음을-인증하는-token">Access Token: 유저에게 권한 받았음을 인증하는 Token</h4>
<h4 id="refresh-token-access-token을-refresh-하기-위한-token">Refresh Token: Access Token을 Refresh 하기 위한 Token</h4>
<p><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/f78fcdb2-8dcb-43f5-bbea-4daa794cc1f7/image.png" alt=""></p>
<ul>
<li>npm install @react-native-firebase/auth</li>
<li>npx expo prebuild</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Fetch API 란?]]></title>
            <link>https://velog.io/@qkrtjrwls_/Fetch-API-%EB%9E%80</link>
            <guid>https://velog.io/@qkrtjrwls_/Fetch-API-%EB%9E%80</guid>
            <pubDate>Wed, 14 Feb 2024 07:52:17 GMT</pubDate>
            <description><![CDATA[<h2 id="📌fetch-api">📌Fetch API</h2>
<blockquote>
<h4 id="remoteurl-에-있는-리소스를-가져올때-사용">RemoteURL 에 있는 리소스를 가져올때 사용</h4>
</blockquote>
<h4 id="react-native에서-새로-정의-한것이-아닌-mdn에-이미-만들어진것">React-Native에서 새로 정의 한것이 아닌, MDN에 이미 만들어진것</h4>
<h3 id="📌http">📌HTTP</h3>
<blockquote>
<p>Hyper Text Transfer Protocol의 약자
Server에 데이터 저장, 업데이트 등을 요청하고 결과를 되받는것</p>
</blockquote>
<h3 id="📌request-method">📌Request Method</h3>
<blockquote>
<p>어떤 동작을 위한 요청인지를 미리 나타내는 것</p>
</blockquote>
<ul>
<li>종류: GET, POST, PUT, PATCH, DELETE</li>
</ul>
<h4 id="📌get">📌GET</h4>
<blockquote>
<p>특정 리소스를 가져와야 할 때 사용 </p>
</blockquote>
<ul>
<li>ex) 특정 회원의 데이터 조회, 특정 성별을 가진 회원들을 조회 등</li>
</ul>
<h4 id="📌post">📌POST</h4>
<blockquote>
<p>어떤 데이터의 저장해야 할때 사용</p>
</blockquote>
<ul>
<li>ex) 회원가입, 로그인 등</li>
</ul>
<h4 id="📌pust">📌PUST</h4>
<blockquote>
<p>특정 소스를 업데이트 할때 사용</p>
</blockquote>
<ul>
<li>ex) 회원의 주소 데이터, 결제 데이터 등</li>
</ul>
<h4 id="📌patch">📌PATCH</h4>
<blockquote>
<p>특정 리소스 중 특정 정보만 변경할때 사용</p>
</blockquote>
<ul>
<li>ex) 회원의 나이, 전화번호 등</li>
</ul>
<h4 id="📌delete-리소스를-아에-삭제">📌DELETE: 리소스를 아에 삭제</h4>
<blockquote>
<p>ex) 회원 탈퇴 등</p>
</blockquote>
<h3 id="📌request-데이터-전달">📌Request 데이터 전달</h3>
<blockquote>
<p>데이터를 서버로 전달하는 방법
Path parameter, Queryparameter, Request Body 등</p>
</blockquote>
<h4 id="📌-path-parameter">📌 Path parameter</h4>
<ul>
<li>URL Path 내부에 값을 함께 넘기는것<pre><code>/person/${:useId}/</code></pre><h4 id="📌-queryparameter">📌 Queryparameter</h4>
</li>
<li>URL 뒷부분에 ?를 붙이고 그 뒤에 key 값과 value 값을 넘겨주는 것<pre><code>/person?birthday={:date}&amp;sort={:regeditDate}</code></pre><h4 id="📌-request-body">📌 Request Body</h4>
</li>
<li>URL에 데이터가 보이지 않고, Body에 작성해서 넘기게 됨 
데이터가 긴 경우 Request Body 사용이 적합 (URL 길이제한)<h4 id="📌항목별-사용처">📌항목별 사용처</h4>
<blockquote>
<h4 id="path-parameter-특정-유저-id를-통해-정보를-가져올-때">Path Parameter: 특정 유저 ID를 통해 정보를 가져올 때</h4>
</blockquote>
<h4 id="query-parameter-이름-성별로-검색해서-가져올때">Query Parameter: 이름, 성별로 검색해서 가져올때</h4>
<h4 id="request-body-회원가입-게시글-등록-할때">Request Body: 회원가입, 게시글 등록 할때</h4>
</li>
</ul>
<h3 id="📌response-status-code">📌Response status code</h3>
<blockquote>
<p>결과 처리에 대해서 숫자 형태로 서버로부터 전달받음 자주 사용하는 코드 [200, 400, 403, 404, 500]</p>
</blockquote>
<h4 id="📌response-status-code-200--500-">📌Response status code( 200 &amp; 500 )</h4>
<blockquote>
<p>200: 정상적으로 처리 됨
  500: 서버에서 처리 중 에러가 발생함
  400: Client에서 값을 잘못 전달함
  403: 유저정보는 식별되나, 해당 URL로의 접근이 거부됨
  404: URL이 존재 하지 않음</p>
</blockquote>
<h3 id="📌fetch-api-사용방법">📌Fetch API 사용방법</h3>
<pre><code>fetch(REQUEST_URL,{method:POST&#39;, body:{}}).then((result) =&gt; result.json())</code></pre><ul>
<li>옵션에서 세부사항들을 적게 된다. method, body</li>
<li>결과를 받고 난 뒤에 json이라는 함수, text라는 함수를 통해서 해당 response를 파싱</li>
<li>전달받은 Promise에는 Text or json 등이 있어서 해당 값 들을 잘 사용해 주면 된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[AsyncStorage 가 뭐야??]]></title>
            <link>https://velog.io/@qkrtjrwls_/AsyncStorage-%EA%B0%80-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@qkrtjrwls_/AsyncStorage-%EA%B0%80-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Wed, 14 Feb 2024 07:16:09 GMT</pubDate>
            <description><![CDATA[<h2 id="📌asyncstroage-란">📌AsyncStroage 란?</h2>
<blockquote>
<h4 id="key-값으로-string을-저장">key 값으로 String을 저장</h4>
</blockquote>
<ul>
<li>유저에 대한 정보(accessToken, refreshToken) 기능을 보여줄지 말지, 마지막 접속 시간 등 임시정보 저장 등</li>
<li>Cookie 와 비슷한 사용 용도</li>
<li>Android: SQLite 에 저장</li>
<li>iOS : 네이티브 코드로 저장로직이 작성되어 있음</li>
</ul>
<h3 id="📌asyncstoragesetitem">📌AsyncStorage.setItem</h3>
<blockquote>
<p>key값과 value 값을 넘겨 값을 저장 하는것 저장하는 value는 string으로만 저장</p>
</blockquote>
<pre><code> AsyncStorage.setItem(KEY,VALUE)
 const values = {key: &#39;value&#39;}
 AsyncStorage.setItem(&#39;TEST_KEY&#39;, JSON.string(values));</code></pre><h3 id="📌asyncstoragegetitem">📌AsyncStorage.getItem</h3>
<blockquote>
<p>값을 가져 오는것, string 또는 null을 리턴</p>
</blockquote>
<pre><code> const result = await AsyncStorage.getItem(KEY,VALUE)
 const result = AsyncStorage.getItem(&#39;TEST_KEY&#39;);
 console.log(JSON.parse(result));</code></pre><h3 id="📌asyncstorageremoveitem">📌AsyncStorage.removeItem</h3>
<blockquote>
<p>key값에 해당하는 value를 삭제하는 것</p>
</blockquote>
<pre><code>AsyncStorage.removeItem(&#39;TEST_KEY&#39;);
const result = await AsyncStorage.getItem(&#39;TEST_KET&#39;);
console.log(result); // null</code></pre><h3 id="📌asyncstorageclear">📌AsyncStorage.clear</h3>
<blockquote>
<p>AsyncStorage의 모든 값을 삭제</p>
</blockquote>
<pre><code>AsyncStorage.clear();</code></pre><h3 id="📌asyncstoragemergeitem">📌AsyncStorage.mergeItem</h3>
<blockquote>
<p>Object안에서 같은 Key값이 있는 경우 한가지로 합쳐주는 것 , 자주 사용하지는 않음</p>
</blockquote>
<h3 id="📌그-외etc">📌그 외(etc)</h3>
<blockquote>
<p>multiGet, multiSet, multiMerge, multiRemove 각각 key값을 여러개 넘겨 한번에 받아오는 것</p>
</blockquote>
<h3 id="📌사용시-주의점1">📌사용시 주의점(1)</h3>
<blockquote>
<p>Key값 중복으로 인한 value 덮어써짐 혹은 삭제된 사례</p>
</blockquote>
<ul>
<li>Unique한 문자열을 만들기 위해서 여러 노력들을 해봄 UUID 문자열 만들어 사용 ex) 43833a60-cad**** 등</li>
<li>화면 또는 동작을 String으로 조합함 @/화면명/액션명</li>
</ul>
<h3 id="📌사용시-주의점2">📌사용시 주의점(2)</h3>
<blockquote>
<p>AsyncStorage의 모든 함수는 Promise로 제공됨</p>
</blockquote>
<pre><code> const result = AsyncStorage.getItem(&#39;KEY&#39;) // result is Promise
 const result = await AsyncStorage.getItem(&#39;KEY&#39;) // result is value</code></pre><h3 id="📌사용시-주의점3">📌사용시 주의점(3)</h3>
<pre><code>Android에서 최대 저장 사이즈는 6MB
Android에서 한번에 가져 올 수 있는 사이즈는 2MB</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 27~30일차 React-간단한 일기장 프로젝트]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-2728%EC%9D%BC%EC%B0%A8-React-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%9D%BC%EA%B8%B0%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-2728%EC%9D%BC%EC%B0%A8-React-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%9D%BC%EA%B8%B0%EC%9E%A5-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Thu, 08 Feb 2024 12:22:27 GMT</pubDate>
            <description><![CDATA[<h3 id="📌react에서-dom-조작하기">📌React에서 dom 조작하기</h3>
<h4 id="📌세부목표">📌세부목표</h4>
<blockquote>
<ul>
<li>일기 저장 버튼을 클릭했을 때 작성자와 일기가 정상적으로 입력되었는지 확인하고 아니라면 focus 하기</li>
</ul>
</blockquote>
<pre><code>const authorInput = useRef();
 // useRef 함수를 호출해서 반환값을 상수에 담아준다.
          &lt;input
            ref={authorInput} // authorInput이라는 레퍼런스 객체를 통해서 input 태그에 접근 가능해진다.
            name=&quot;author&quot;
            value={state.author}
            onChange={handleChangeState}
          /&gt;

   const handleSubmit = () =&gt; {
    if (state.author.length &lt; 1) {
      authorInput.current.focus();

      return;
    }

</code></pre><ul>
<li>상수에는 React.MutableRefObject 라는게 저장이된다.<h3 id="📌react에서-리스트-렌더링-하기">📌React에서 리스트 렌더링 하기</h3>
<h4 id="📌세부목표-1">📌세부목표</h4>
<blockquote>
<p>배열을 이용하여 React 에서 List 렌더링 해보고 개별적인 컴포넌트 만들어보기</p>
</blockquote>
<pre><code>&lt;DiaryList diaryList={dummyList} /&gt;
const DiaryList = ({ diaryList }) =&gt; {
return (
 &lt;div className=&quot;DiaryList&quot;&gt;
   &lt;h2&gt;일기 리스트&lt;/h2&gt;
   &lt;h4&gt;{diaryList.length} 개의 일기가 있습니다.&lt;/h4&gt;
   &lt;div&gt;
     {diaryList.map((it) =&gt; (
       &lt;DiaryItem key={it.id} {...it} /&gt;
     ))}
   &lt;/div&gt;
 &lt;/div&gt;
);
};
</code></pre></li>
</ul>
<pre><code></code></pre><h3 id="📌리스트-데이터-추가하기">📌리스트 데이터 추가하기</h3>
<blockquote>
<p>React는 단방향으로만 데이터가 흐른다</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/f570a23e-1019-4e1a-b4ad-970f903dcf24/image.png" alt=""></p>
<ul>
<li><p>App component 최상단에서 state를 관리  각각의 컴포넌트에 props 으로 넘겨준다.</p>
<h3 id="📌리스트-데이터-삭제하기">📌리스트 데이터 삭제하기</h3>
<pre><code>// App.js component

const onDelete = (targetId) =&gt; {
 console.log(`${targetId}가 삭제되었습니다`);
 const newDiaryList = data.filter((it) =&gt; it.id !== targetId);
 setData(newDiaryList);
};


</code></pre></li>
</ul>
<p>  // DiaryItem.js component
      &lt;button
        onClick={() =&gt; {
          if (window.confirm(<code>${id} 번째 일기를 정말 삭제하시겠습니까?</code>)) {
            onDelete(id);
          }
        }}
      &gt;
        삭제하기
      </button></p>
<pre><code>
### 📌데이터 수정하기
&gt; 배열을 이용한 React List에 아이템을 동적으로 수정 해보기 With 조건부 렌더링
</code></pre><p>//App.js
  const onEdit = (targetId, newContent) =&gt; {
    setData(
      data.map((it) =&gt; it.id === targetId ? {...it, content: newContent} : it) 
    )
  }</p>
<p>  //Diary Item 
   const handleEdit = () =&gt; {</p>
<pre><code>if(localContent.length &lt; 5) {
  localContentInput.current.focus();
  return;
}

if(window.confirm(`${id}번 째 일기를 수정하시겠습니까?`)) {
  onEdit(id,localContent);
  toggleIsEdit();
}</code></pre><p>  };
     <button onClick={handleEdit}>수정 완료</button></p>
<pre><code>
### 📌React Lifecycle 제어하기 - useEffect
 &gt; React 컴포넌트의 생에 주기(생명 주기)
 탄생 -&gt; 변화 -&gt; 죽음
  - 탄생 : 화면에 나타나는 것 Mount ex) 초기화 작업
  - 변화 : 업데이트(리렌더) Update ex) 예외 처리 작업
  - 죽음 : 화면에서 사라짐 UnMount ex) 메모리 정리 작업
</code></pre><p> useEffect(() =&gt; {
   // todo ... (callback) 함수</p>
<p> },[]); &lt;- Dependency Array (의존성 배열) 이 배열 내에 들어 있는 값이 변화하면 콜백 함수가 수행된다.</p>
<pre><code></code></pre><p>  useEffect(() =&gt; {
    console.log(&quot;Mount!&quot;);</p>
<pre><code>return () =&gt; {
   // Unmount 시점에 실행되게 됨
 console.log(&#39;Unmount!&#39;);
};</code></pre><p>  }, []);</p>
<pre><code>
### 📌React API 호출하기
&gt; 세부 목표
 - useEffect 이용하여 컴포넌트 Mount 시점에 API를 호출하고 해당 API의 결과값을 일기 데이터의 초기값으로 이용하기

</code></pre><p> const getData = async() =&gt; {
    const res = await fetch(&#39;<a href="https://jsonplaceholder.typicode.com/comments&#39;).then((res)">https://jsonplaceholder.typicode.com/comments&#39;).then((res)</a> =&gt; res.json());</p>
<pre><code>const initData = res.slice(0, 20).map((it) =&gt; {
  return {
    author: it.email,
    content: it.body,
    emotion: Math.floor(Math.random() * 5) + 1,
    created_date: new Date().getTime(),
    id: dataId.current++,
  };
});

setData(initData);</code></pre><p>  };</p>
<p>  useEffect(() =&gt; {
    getData();<br>  },[]) </p>
<pre><code>### 📌최적화
 &gt; 최적화 1 - 연산 결과 재사용

#### 📌연산 결과값을 재사용 하는 방법
&gt; 현재 일기 데이터를 분석하는 함수를 제작하고 해당 함수가 일기 데이터의 길이가 변화하지 않을 때 값을 다시 계산하지 않도록 하기
 + Memoization 이해하기

#### 📌Memoization
 - 이미 계산 해 본 연산 결과를 기억 해 두었다가 동일한 계산을 시키면, 다시 연산하지 않고 기억 해 두었던 데이터를 반환 시키게 하는 방법

&gt; 마치 시험을 볼 때, 이미 풀어본 문제를 다시 풀어보지 않아도 답을 알고 있는 것 과 유사
 - 답을 기억해 둔다 -&gt; 기억해 두었던 답을 다시 적는다(Memoization 을 이용한 연산 과정 최적화)


#### 📌사용법</code></pre><p> const getDiaryAnalysis = useMemo(() =&gt; {
    console.log(&quot;일기 분석 시작&quot;);</p>
<pre><code>const goodCount = data.filter((it) =&gt; it.emotion &gt;= 3).length;
const badCount = data.length - goodCount;
const goodRatio = (goodCount / data.length) * 100;
return { goodCount, badCount, goodRatio };</code></pre><p>  }, [data.length]);</p>
<p>  const { goodCount, badCount, goodRatio } = getDiaryAnalysis;</p>
<pre><code>- useMemo로 어떤 함수를 감싸고 2번째로 디펜더시 array를 전달해서 함수를 최적화 하면 더이상 함수가 아니다. 
- useMemo 라는 기능은 어떤 함수를 전달을 받아서 콜백함수가 return 하는 값을 그냥 return 한다.
- 그렇기 때문에 값으로 사용하여야 한다.
&gt; 정리하자면 어떤 함수가 있고 그 함수가 어떤 값을 return 하고 있는데 그 return까지의 연산을 최적화하고 싶다면 useMemo를 사용해서 디펜더시 array에 어떤 값이 변화할 때만 다시 수행할 것인지 명시해 주게 되면 함수를 값처럼 사용해서 연산 최적화를 할 수 있다.

#### 📌React.memo
- 사용법 1</code></pre><p>const TextView = React.Memo(({ text }) =&gt; {
  useEffect(() =&gt; {</p>
<p>  })</p>
<p>  return <div>{text}</div>;
});</p>
<p>const CountView = React.memo(({ count }) =&gt; {
    useEffect(() =&gt; {</p>
<pre><code>})</code></pre><p>  return <div>{count}</div>;
});</p>
<p>const OptimizeTest = () =&gt; {
  const [count, setCount] = useState(1);
  const [text, setText] = useState(&quot;&quot;);</p>
<p>  return (
    &lt;div style={{ padding: 50 }}&gt;
      <div>
        <h2>count</h2>
        <CountView count={count} />
        &lt;button onClick={() =&gt; setCount(count + 1)}&gt;</button>
      </div>
      <div>
        <h2>text</h2>
        <TextView text={text} />
        &lt;input value={text} onChange={(e) =&gt; setText(e.target.value)} /&gt;
      </div>
    </div>
  );
};</p>
<pre><code>- 사용법 2</code></pre><p>const CounterA = React.memo(({ count }) =&gt; {
  return <div>{count}</div>;
});</p>
<p>const CounterB = React.memo(({ obj }) =&gt; {
  return <div>{obj.count}</div>;
});</p>
<p>const OptimizeTest = () =&gt; {
  const [count, setCount] = useState(1);
  const [obj, setObj] = useState({
    count: 1,
  });</p>
<pre><code>&gt; CounterB는 업데이트가 되었다고 출력이 된다.
 렌더링이 일어난 이유는, Props인 obj 가 객체이기 때문이다.
- 자바스크립트에서는 기본적으로 얕은 비교를 하게 되어서 문제가 발생하는 것
- 객체의 주소의 의한 비교(얕은 비교)
- 얕은 비교: 객체의 값을 비교하는 게 아니라 두개의 객체가 같은 주소에 있느냐를 비교한다.

</code></pre><p>const areEqual = (prevProps, nextProps) =&gt; {
if(prevProps.obj.count === nextProps.obj.count) {
  return true;
}
 return false;
}</p>
<p>const MemoziedCounterB = React.memo(CounterB, areEqual);</p>
<MemoziedCounterB obj={obj} />

<p>```</p>
<blockquote>
</blockquote>
<h4 id="이렇게-해주면-counterb-버튼을-눌러도-memoziedcounterb-component-가-다시-렌더링이-일어나지-않는다">이렇게 해주면 CounterB 버튼을 눌러도 MemoziedCounterB component 가 다시 렌더링이 일어나지 않는다.</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[RN - 번역앱 프로젝트]]></title>
            <link>https://velog.io/@qkrtjrwls_/RN-%EB%B2%88%EC%97%AD%EC%95%B1-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@qkrtjrwls_/RN-%EB%B2%88%EC%97%AD%EC%95%B1-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Sun, 04 Feb 2024 16:11:44 GMT</pubDate>
            <description><![CDATA[<h2 id="📌번역앱-프로젝트">📌번역앱 프로젝트</h2>
<h3 id="📌i18n-js-을-이용한-localiztion-세팅-custom-hook---usetranslation-ui-개발">📌i18n-js 을 이용한 Localiztion 세팅, custom hook - useTranslation, UI 개발</h3>
<ul>
<li>npx expo install expo-localization</li>
<li>npx expo install i18n-js</li>
</ul>
<h3 id="📌asyncstorage를-이용해-선택한-언어-저장하고-불러오기">📌AsyncStorage를 이용해 선택한 언어 저장하고 불러오기</h3>
<ul>
<li>npx expo install @react-native-async-storage/async-storage<h3 id="📌splashscreen-피그마로-splashscreen-만들고-앱에-적용하기">📌SplashScreen 피그마로 SplashScreen 만들고 앱에 적용하기</h3>
</li>
<li>npx expo install expo-splash-screen<pre><code>SplashScreen.preventAutoHideAsync(); // splashscreen 실행시키는 함수


</code></pre></li>
</ul>
<p>   useEffect(() =&gt; {
    setTimeout(() =&gt; {
      SplashScreen.hideAsync();  // 제거하는 함수
    }, 2000);<br>  }, []);</p>
<pre><code>### 📌SplashScreen 번역이 세팅된 후 SplashScreen 숨기기</code></pre><p>  const [isLoaded, setIsLoaded] = useState(false);</p>
<p>  useEffect(() =&gt; {
    if (locale !== null &amp;&amp; cookieKey !== &quot;&quot;) {
      setIsLoaded(true);
    }
  }, []);</p>
<p>  useEffect(() =&gt; {
    if (isLoaded) {
      SplashScreen.hideAsync();
    }
  }, [isLoaded]);</p>
<pre><code>### 📌Lottie 적용(1) SplashScreen이 사라진 이후 Lottie를 이용한 로딩화면 추가로 띄우기, conditinal rendering
 - npx expo install lottie-react-native

 import { View } from &quot;react-native&quot;;
import LottieView from &quot;lottie-react-native&quot;;</code></pre><p>const LoadingView = () =&gt; {
  return (
    &lt;View style={{ flex: 1, backgroundColor: &quot;lightblue&quot; }}&gt;
      &lt;LottieView
        // ref={ref}
        autoPlay
        style={{ width: 150 }}
        source={require(&quot;../assets/loading.json&quot;)} // <a href="https://lottiefiles.com/97111-loading-spinner-dots">https://lottiefiles.com/97111-loading-spinner-dots</a>
      /&gt;
    </View>
  );
};</p>
<p>export default LoadingView;</p>
<pre><code> - 첫번째는 SplashScreen 을 보여줘서 앱에서 필수적으로 세팅되기 전까지는 SplashScreen을 보여주다가 쿠키 데이터를 가져오는 2초동안 로딩을 보여주게 구현
### 📌react-string-format 을 이용해 변수에 따라 달라지는 언어별 문자열 대응하기 
  - npm install react-string-format
  import { format } from &quot;react-string-format&quot;;</code></pre><pre><code>const y = new Date().getFullYear();</code></pre><p>  const m = new Date().getMonth() + 1;
  const d = new Date().getDate();
  const todayText = format(t(&quot;today_is&quot;), y, m, d);</p>
<pre><code>### 📌Lottie 적용(2) 배경화면에 Lottie 적용하기, zIndex
 - import LottieView from &quot;lottie-react-native&quot;;
 - https://lottiefiles.com/animations/background-full-screen-train-JaazABl2MA</code></pre><p>  &lt;LottieView
        autoPlay={true}
        source={require(&quot;./assets/background.json&quot;)}
        resizeMode=&quot;cover&quot;
        style={{
          width: 850,
          height: 850,
          position: &quot;absolute&quot;,
          zIndex: -1,
        }}
      /&gt;</p>
<pre><code>### 📌커스텀 폰트 적용
 - npx expo install expo-font</code></pre><p> import { useFonts } from &quot;expo-font&quot;;
 const [fontsLoaded] = useFonts({
    RIDIBatang: require(&quot;./assets/fonts/RIDIBatang.otf&quot;),
  });</p>
<p>   fontFamily: &quot;RIDIBatang&quot;,
 ```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1월회고 ]]></title>
            <link>https://velog.io/@qkrtjrwls_/1%EC%9B%94%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@qkrtjrwls_/1%EC%9B%94%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Fri, 02 Feb 2024 06:36:27 GMT</pubDate>
            <description><![CDATA[<p> 벌써 1달이 지났다. 최소 주 60시간은 개발 공부를 하는 걸 목표로 삼았는데, 시간적으로는 지켜졌지만, 집중이 잘 안되는 날도 있어서 아쉬웠다. 
그래도 꾸준히 코테 2~3단계를 풀고, 꾸준히 리액트, 리액트 네이티브를 공부했던 것에 대해서는 스스로 만족한다. 
올해 프로그래머스 데브 코스를 수료하고 시간대가 맞는다면 네이버 부스트 캠프와, sw 마에스트로를 지원해서 더 실력을 쌓아야겠다.
내 한계는 내 생각의 크기가 만든다.</p>
<h3 id="2월목표">2월목표</h3>
<ul>
<li>작은 프로젝트 들도 깃허브에 다 정리하기</li>
<li>나만의 notion 페이지 작성</li>
<li>리액트, 리액트 네이티브 집중적으로 공부하기</li>
<li>cs 공부 대비하기</li>
<li>코테는 꾸준히 </li>
<li>중요하지 않은 일에 시간 낭비하지 말기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 24일차 피그마(Figma)- 프로토타입 제작하기]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-24%EC%9D%BC%EC%B0%A8-%ED%94%BC%EA%B7%B8%EB%A7%88Figma-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-24%EC%9D%BC%EC%B0%A8-%ED%94%BC%EA%B7%B8%EB%A7%88Figma-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85-%EC%A0%9C%EC%9E%91%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 01 Feb 2024 06:22:24 GMT</pubDate>
            <description><![CDATA[<h1 id="📌프로토타입-제작하기">📌프로토타입 제작하기</h1>
<h2 id="📌준비---레퍼런스-찾기">📌준비 - 레퍼런스 찾기</h2>
<h3 id="핀터레스트">핀터레스트</h3>
<ul>
<li><a href="https://www.pinterest.co.kr/">https://www.pinterest.co.kr/</a><h3 id="wwit">WWIT</h3>
</li>
<li><a href="https://wwit.design/">https://wwit.design/</a></li>
</ul>
<h2 id="📌준비---unsplash">📌준비 - Unsplash</h2>
<h3 id="리소스-다운받기">리소스 다운받기</h3>
<h4 id="언스플래시-무료-이미지-및-사진httpsunsplashcomko">언스플래시: 무료 이미지 및 사진(<a href="https://unsplash.com/ko">https://unsplash.com/ko</a>)</h4>
<p> <img src="https://velog.velcdn.com/images/qkrtjrwls_/post/000de301-52a1-4af7-a4dd-395d0f566065/image.png" alt=""></p>
<ul>
<li>run 을 누르면 바로 실행 가능
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/d359be71-0917-45c8-80e5-6ca204a1e607/image.png" alt=""></li>
<li>마우스 우클릭으로 확인 가능</li>
<li>언스플래시 플러그인(<a href="https://www.figma.com/community/plugin/738454987945972471/unsplash">https://www.figma.com/community/plugin/738454987945972471/unsplash</a>)</li>
</ul>
<h2 id="📌준비---color-font-icon">📌준비 - Color, Font, icon</h2>
<h4 id="컬러-제너레이터httpsmycolorspacehex4a51e9sub1">컬러 제너레이터(<a href="https://mycolor.space/?hex=#4A51E9&amp;sub=1">https://mycolor.space/?hex=#4A51E9&amp;sub=1</a>)</h4>
<ul>
<li>내가 고른색과 어울리는 색을 확인할 수 있는 사이트<h4 id="눈누-상업적-이용-가능한-무료-폰트">눈누: 상업적 이용 가능한 무료 폰트</h4>
</li>
<li><a href="https://noonnu.cc/">https://noonnu.cc/</a><h4 id="추천-폰트">추천 폰트</h4>
</li>
<li><a href="https://catus.tistory.com/306">https://catus.tistory.com/306</a><h4 id="추천-아이콘">추천 아이콘</h4>
</li>
<li><a href="https://www.figma.com/community/file/1014241558898418245/material-design-icons">https://www.figma.com/community/file/1014241558898418245/material-design-icons</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[🚌[RN]Kakao-bus(카카오 버스) Clone 프로젝트]]></title>
            <link>https://velog.io/@qkrtjrwls_/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%B2%84%EC%8A%A4-Clone-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@qkrtjrwls_/%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%B2%84%EC%8A%A4-Clone-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Tue, 30 Jan 2024 15:28:57 GMT</pubDate>
            <description><![CDATA[<h2 id="🚌카카오버스-clone-해보기">🚌카카오버스 clone 해보기</h2>
<h3 id="🚌sectionlist와-flatlist와의-차이">🚌SectionList와 FlatList와의 차이</h3>
<pre><code> &lt;FlatList
          data={[
            { busNum: 146 },
            { busNum: 360 },
            { busNum: 740 },
            { busNum: 3412 },
            { busNum: 1100 },
            { busNum: 1700 },
          ]}
          renderItem={({ item }) =&gt; &lt;Text&gt;{item.busNum}&lt;/Text&gt;}
        /&gt;
         &lt;SectionList
          sections={[
            {
              title: &quot;간선버스&quot;,
              data: [{ busNum: 146 }, { busNum: 360 }, { busNum: 740 }],
            },
            {
              title: &quot;지선버스&quot;,
              data: [{ busNum: 3412 }],
            },
            {
              title: &quot;직행버스&quot;,
              data: [{ busNum: 1100 }, { busNum: 1700 }],
            },
          ]}
          renderSectionHeader={({ section: { title } }) =&gt; &lt;Text&gt;{title}&lt;/Text&gt;}
          renderItem={({ item }) =&gt; &lt;Text&gt;{item.busNum}&lt;/Text&gt;}
        /&gt;

</code></pre><ul>
<li>FlatList는 data 안에 배열을 넣어줬지만 SectionList는 sections 가 필요
그리고 title, 그 안에서 반복될 data list 가 들어간다.</li>
<li>Section 부분을 렌더하기 위해서는 renderSectionHeader 라는 prop을 활용</li>
</ul>
<h3 id="🚌usestate-useeffect-setinterval-을-이용해-1초마다-도착시각-업데이트-하기">🚌useState, useEffect, setInterval 을 이용해 1초마다 도착시각 업데이트 하기</h3>
<pre><code>   const [now, setNow] = useState(dayjs());

    useEffect(() =&gt; {
    setInterval(() =&gt; {
      const newNow = dayjs();
      setNow(newNow);
    }, 1000);
  }, []);
</code></pre><ul>
<li><p>만들어 줬으면 종료하는시점도 있어야 한다.</p>
<pre><code>useEffect(() =&gt; {
const interval = setInterval(() =&gt; {
  const newNow = dayjs();
  setNow(newNow);
}, 1000);

return () =&gt; {
  clearInterval(interval);
};
}, []);</code></pre></li>
<li><p>이렇게 해주면 컴포넌트가 언마운트 하는 시점에 자동으로 해제됨</p>
<h3 id="🚌sectionlist---listheadercomponet">🚌SectionList - ListHeaderComponet</h3>
<ul>
<li><p>헤더를 사용하기 위해서는 최상단이 안전영역 다음으로 그려지게 하면 안된다.
SafeAreaView -&gt; View 로 바꿔준다.</p>
</li>
<li><p>header 에 root 를 SafeAreaView 로 바꿔준다.   </p>
</li>
</ul>
<pre><code> const ListHeaderComponent = () =&gt; {
return (
  &lt;SafeAreaView
    style={{ backgroundColor: COLOR.GRAY_1, width: &quot;100%&quot;, height: 200 }}
  &gt;&lt;/SafeAreaView&gt;
);
};  </code></pre><h3 id="🚌itemseparatorcomponent">🚌ItemSeparatorComponent</h3>
<ul>
<li><p>FlatList나 SectionList와 같은 리스트 컴포넌트에서 각 아이템 사이에 위치할 컴포넌트를 지정하는 프로퍼티입니다. 이를 통해 아이템들 사이에 구분선이나 공간을 추가할 수 있다.</p>
</li>
<li><p>기본적으로 ItemSeparatorComponent는 리스트 내부의 각 아이템들 사이에 렌더링됩니다. 예를 들어, 리스트에 데이터가 10개 있을 경우, ItemSeparatorComponent를 통해 9개의 구분선이나 공간을 추가할 수 있다.</p>
</li>
</ul>
</li>
</ul>
<h3 id="🚌sectionlist---refreshcontrol">🚌SectionList - refreshControl</h3>
<ul>
<li><p>ScrollView, FlatList, SectionList 등에 스크롤이 가능한 곳에서 사용가능</p>
<pre><code>const [refreshing, setRefreshing] = useState(false);

 const onRefresh = () =&gt; {
setRefreshing(true);
};

useEffect(() =&gt; {
// 인디케이터가 보일때 데이터를 refetch 해준다.
if (refreshing) {
  setNow(dayjs());
  setRefreshing(false);
}
}, [refreshing]);

</code></pre></li>
</ul>
<pre><code>refreshControl={
      &lt;RefreshControl refreshing={refreshing} onRefresh={onRefresh} /&gt;
    }</code></pre><pre><code>
   - refresh 를 했을 때 api 측에 data 를 다시 refetch 해달라라는 요청
   - refreshing 이 true 일 때 인디케이터 가 보이고, 데이터를 refetch 해준다.
   - data 가 refetch 되면 setRefreshing(false)로 해줘서 인디케이터가 사라지도록
   - setRefreshing(false) 는 api refetch 가 완료되는 시점


### 🚌 custom hook -useTheme(다크모드), Switch Component</code></pre><p>  import { useState } from &quot;react&quot;;
import { DARK_COLOR, LIGHT_COLOR } from &quot;./color&quot;;</p>
<p>const useTheme = () =&gt; {
  const [isDark, setIsDark] = useState(false);</p>
<p>  const toggleIsDark = () =&gt; setIsDark(!isDark);</p>
<p>  return {
    NEWCOLOR: isDark ? DARK_COLOR : LIGHT_COLOR,
    toggleIsDark,
  };
};</p>
<p>export default useTheme;</p>
<pre><code>#### Switch Component</code></pre>   <Switch value={isDark} onValueChange={toggleIsDark} />
 ```
 - 스위치 Component 를 사용해서 기본값을 false 로 두고 change 했을 때 !isDark 를 해줌으로써 다크모드 구현
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 23일차 피그마(Figma)- 오토레이아웃, 컴포넌트]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-23%EC%9D%BC%EC%B0%A8-%ED%94%BC%EA%B7%B8%EB%A7%88Figma-%EC%98%A4%ED%86%A0%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-23%EC%9D%BC%EC%B0%A8-%ED%94%BC%EA%B7%B8%EB%A7%88Figma-%EC%98%A4%ED%86%A0%EB%A0%88%EC%9D%B4%EC%95%84%EC%9B%83-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8</guid>
            <pubDate>Tue, 30 Jan 2024 09:40:26 GMT</pubDate>
            <description><![CDATA[<h1 id="피그마-툴-학습하기심화">피그마 툴 학습하기(심화)</h1>
<h2 id="1심화-기능-오토레이아웃">1.심화 기능: 오토레이아웃</h2>
<h3 id="📌오토레이아웃">📌오토레이아웃</h3>
<blockquote>
<h4 id="css-의-flex-와-유사한-개념-가장-강력한-유용한-기능-중-하나">css 의 flex 와 유사한 개념 가장 강력한 유용한 기능 중 하나</h4>
</blockquote>
<ul>
<li>디자인 시간을 획기적으로 단축시킬 수 있다.</li>
<li>레이어를 선택하고 단축키 shift + a 하면 좌측 레이어 패널에 오토 레이아웃 하위로 묶임</li>
<li>ctrl + z (이전 상태로 돌아감)</li>
<li>오토레이아웃을 추가하면 기본적으로 균등한 마진값을 가진채로 자동으로 정렬된다.</li>
<li>제거하려면 (단축키 alt + shift + a)</li>
<li>오른쪽 메뉴바에 auto layout( 빼기 버튼을 눌러도 제거됨)</li>
<li>최초의 상태로 되돌리고 싶다면( ctrl +shift+ g)<h3 id="📌-오토레이아웃---리사이징-이론">📌 오토레이아웃 - 리사이징 이론</h3>
<ul>
<li>Hug contents 는 자식 요소의 크기에 따라 자동으로 리사이징 된다.</li>
<li>Fixed width 로 했다면 부모의 오토레이 영역은 고정됨</li>
<li>하위 레이어에서 fill container 를 설정하면 마진 영역을 제외하고 남는 부분을 하위 레이어가 채운다.</li>
<li>오토레이아웃을 선택하면 기본적으로 자동으로 마진값과 패딩값이 설정된다.</li>
<li><em>복사할때는 alt 누르고 마우스 참고</em><h3 id="📌-오토레이아웃---패널-살펴보기-추가-장점">📌 오토레이아웃 - 패널 살펴보기, 추가 장점</h3>
</li>
<li>우측에 individual padding 을 토글하면 각각의 패딩값을 따로따로 설정 가능</li>
<li>더보기 버튼을 클릭하면 패널을 불러오게 된다. </li>
<li>Canvas stacking 겹쳐지는 레이어의 순서를 설정 <ul>
<li>sns 나 유저 ui 기능 활용 (margin 값을 음수값으로 설정)</li>
</ul>
</li>
<li>오토레이아웃은 유연하다는 장점이 있다.</li>
<li>오토레이아웃에 레이어를 추가하고 싶은 경우 드래그앤 드랍을 통해서 넣을수도 있다.</li>
<li>해당 레이어를 꾹 눌러서 순서 변경 가능 </li>
<li>control + d 복사하는 기능, control + z 되돌리기 </li>
<li>container 오토 레이아웃을 클릭하고 enter 를 누르면 하위 레이어를 선택가능<h3 id="📌2심화-기능-컴포넌트">📌2.심화 기능: 컴포넌트</h3>
<h4 id="컴포넌트---기본-베리언트varient">컴포넌트 - 기본, 베리언트(Varient)</h4>
</li>
<li>컴포넌트란 언제든지 재 사용할수 있게 정의한 디자인 요소</li>
<li>생성하는 방법</li>
<li>레이어를 클릭후 중앙에 위치한 쿨바를 보면 create component 아이콘이 활성화됨(버튼 클릭)</li>
<li>또는 우클릭 후 Create component 라는 영역 클릭</li>
<li>control + alt + k</li>
<li>어디서 관리하는 지 : 좌측 사이드 바에 Assets 이라는 탭에서 components list를 확인 가능
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/206f3f55-5634-4603-955f-e0e926da8dd1/image.png" alt=""></li>
<li>사용 하는 방법: 해당 component 를 단순히 드래그 앤 드랍으로 사용 가능
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/ad8e0755-4313-4dcb-98c3-3af74c4388e4/image.png" alt=""></li>
<li>asset 에서 불러온 컴포넌트는 비어있는 사각형 모양이다.
기본적으로 component는 main 컴포넌트와 인스턴스로 구성된다.</li>
<li>main component: 최초로 만든 컴포넌트를 의미</li>
<li>main component 를 재사용 하게 되면 인스턴스 컴포넌트가 된다.(비어있는 사각형 모양)</li>
<li><h4 id="main-component-의-업데이트가-있으면-자동으로-인스턴스에도-반영이-된다">main component 의 업데이트가 있으면 자동으로 인스턴스에도 반영이 된다.</h4>
</li>
<li>main component 가 다른 페이지에 있다고 하더라도 사용 가능하다.<h4 id="베리언트varient">베리언트(Varient)</h4>
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/7284c69b-8409-435a-94a8-ae3e4c3c31a4/image.png" alt=""></li>
</ul>
</li>
<li>varient 는 변수라고 해서 component의 변수를 설정, </li>
<li>varient를 추가하면 기본적으로 property 와 default 를 설정하게 된다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/f5d94600-6b23-457a-af2e-2737d6eeff4e/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/c659bcda-9dbc-4285-a4e5-ca31ab8935cd/image.png" alt=""><ul>
<li>add varient 를 하게되면 레이어가 하나더 추가가 된다.</li>
<li>varient 의 이름은 독립적이어야 한다.</li>
<li>varient 를 추가 후 인스턴스 를 살펴보면 이전에는 없던 프로퍼티가 추가가 된다.</li>
<li>color 를 선택할 수 있게 됨
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/cee839ef-f22f-4a4a-84b2-65ec0c732fa7/image.png" alt=""></li>
</ul>
</li>
</ul>
<h3 id="📌3반응형-설정">📌3.반응형 설정</h3>
<h4 id="반응형--constrains">반응형- Constrains</h4>
<ul>
<li><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/3523eb50-ac51-48b5-a67a-e9789d3302ef/image.png" alt=""></li>
<li>CSS 상에 position 개념과 유사하다.</li>
<li>부모에 맞춰서 동작하는 개념 </li>
<li>프레임 하위에 존재하는 레이어들을 선택했을 때 활성화 된다.</li>
<li>수평과 수직 두가지 다 조정 가능</li>
<li>Right 로 설정 후 부모 레이어를 조절할 경우 우측에 고정되어서 움직인다.</li>
<li>control 을 누른채로 프레임을 리사이즈 하면 하위에 레이어와 상관없이 변경된다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 22일차 피그마(Figma)]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-2224%EC%9D%BC%EC%B0%A8-%ED%94%BC%EA%B7%B8%EB%A7%88</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-2224%EC%9D%BC%EC%B0%A8-%ED%94%BC%EA%B7%B8%EB%A7%88</guid>
            <pubDate>Tue, 30 Jan 2024 05:44:57 GMT</pubDate>
            <description><![CDATA[<h1 id="📌-피그마">📌 피그마</h1>
<blockquote>
<h4 id="피그마는-기본적으로-백터-기반의-ui-디자인-툴이라는-점에서-훨씬-더-생산성효율적-이다">피그마는 기본적으로 백터 기반의 ui 디자인 툴이라는 점에서 훨씬 더 생산성,효율적 이다.</h4>
</blockquote>
<ul>
<li>벡터: 점과 점을 연결해서 수학적인 원리로 그림을 표현(svg)<ul>
<li>확대를 하거나 축소를 해도 깨지는 부분이 없다.</li>
</ul>
</li>
<li>비트맵: 특정 색상값을 갖는 점(픽셀의 배열로 이미지를 표현) (png, jpg) <ul>
<li>확대나 축소시 테두리에 화질이 저하된다.</li>
</ul>
</li>
</ul>
<h2 id="📌-피그마-툴-학습하기기초">📌 피그마 툴 학습하기(기초)</h2>
<h3 id="📌1인터페이스">📌1.인터페이스</h3>
<ul>
<li>스페이스바: 캔버스 영역 움직이기</li>
<li>버전히스토리 : 특정시점으로 가고 싶으면</li>
<li>사이드바<ul>
<li>page: 각 페이지는 고유의 캠버스를 가지고 있다.(페이지를 클릭하면 캔버스 변경) 진행 상태에 따라서 진행중, 완성본 페이지를 나눌수 있다.</li>
<li>레이어: 캔버스에 오브젝트를 추가할 경우 각 오브젝트를 분리된 하나의 레이어로 취급 <h3 id="📌피그마-단축기">📌피그마 단축기</h3>
</li>
<li>피그마 내에서 단축기 확인하려면 control + shift + ?</li>
</ul>
</li>
</ul>
<h2 id="📌-2기본-기능">📌 2.기본 기능</h2>
<h3 id="📌프레임frame-섹션section">📌프레임(frame), 섹션(Section)</h3>
<h4 id="📌프레임">📌프레임</h4>
<ul>
<li>프레임은 디자인을 시장하기 전 바탕이 되는 도화지( 단축키 F)</li>
<li>우측바에 있는 설정된 프리셋을 불러올 수 있다.</li>
<li>프레임을 만들고 그  안에서 디자인을 한다.</li>
<li>프레임으로 레이어 그룹핑 하는법 (ctrl +alt+ g , option +command+ g)<h4 id="📌섹션">📌섹션</h4>
</li>
<li>그룹핑을 할 수 있는 방법중 하나, 프레임이나 그룹보다 좀더 상위 개념(shift  + s)</li>
<li>워크스페이스를 정돈하는 역할로 쓴다.<h3 id="📌기본-도형-텍스트text">📌기본 도형, 텍스트(Text)</h3>
<h4 id="📌기본도형">📌기본도형</h4>
</li>
<li>쉬프트를 클릭시 비율에 맞춰서 만들 수 있다.<h4 id="📌텍스트단축기-t">📌텍스트(단축기 t)</h4>
</li>
<li>클릭해서 생성 </li>
<li>클릭하고 드래그해서 원하는 영역을 잡아서 생성 가능</li>
<li>더블클릭해서 수정 가능</li>
<li>선택한 상태에서 t를 누르면 바로 수정 화면 진입 가능<h3 id="📌코멘트comment-좌측-사이드바">📌코멘트(comment), 좌측 사이드바</h3>
<h4 id="📌코멘트-단축키-c">📌코멘트( 단축키 c)</h4>
</li>
<li>원하는 부분 클릭</li>
<li>특정 영역 클릭하고 드래그해서 영역에 맞춰서 코멘트 남길 수 있다.</li>
<li>특정 사용자를 멘션할수도 있음</li>
<li>답변 가능 내용안에서 멘션가능</li>
<li>키보드 / 로 팝업코멘트를 남길 수 있다.<h4 id="📌좌측-사이드바">📌좌측 사이드바</h4>
</li>
<li>레이어: 마우스 커서를 올리면 자물쇠 모양, 눈 모양 활성화<ul>
<li>자물쇠는 잠금, 눈모양은 숨김 기능</li>
<li>잠금을 하면 캔버스 상에서 클릭이 되지 않는다.<h3 id="📌정렬align-프레임-사이즈와-오리엔테이션frame--orientation">📌정렬(Align), 프레임 사이즈와 오리엔테이션(frame &amp; orientation)</h3>
<h4 id="📌정렬">📌정렬</h4>
</li>
</ul>
</li>
<li>우측 사이드바에 가장 상단에 위치</li>
<li>2가지 이상의 레이어를 선택한 경우부터 정렬기능 활성화 </li>
<li>프레임 안에 있는 레이어를 선택하고 정렬기능을 사용할 경우 프레임을 부모로 보고 부모를 기준으로 정렬된다.<h4 id="📌프레임-1">📌프레임</h4>
</li>
<li>프레임을 선택한경우 프레임에 있는 화살표 버튼을 누르게 되면 프리셋들이 모여 있다. 프레임 사이즈 변경 가능</li>
<li>세로형, 가로형 으로 오리엔테이션이 돌아가는 모습 확인 가능</li>
<li>프레임을 클릭하고 resize to fit 누르면<ul>
<li>프레임 안에 레이어가 있다고 했을때 내부에 있는 레이어의 크기만큼 프레임이 자동으로 리사이즈 되는 기능</li>
</ul>
</li>
</ul>
<h3 id="📌포지션position-디멘션dimenstion">📌포지션(position), 디멘션(dimenstion)</h3>
<h4 id="📌포지션">📌포지션</h4>
<ul>
<li>일반적으로 레이어를 선택하면 우측사이드바 상단에 x 값과 y값을 통해서 확인</li>
<li>프레임 안에 존재하는 레이어의 경우 프레임을 기준으로 표시해준다.<h4 id="📌디멘션">📌디멘션</h4>
</li>
<li>포지션의 밑에 가로값과 높이값을 디멘션이라 부른다.</li>
<li>오른쪽의 링크를 클릭 후 가로 높이 값을 조정하면 비율에 맞게 조정됨</li>
<li>꼭지점을 대고 shift 를 누르면 회전할 수 있다</li>
<li>프레임을 클릭한 경우 clip comtent 라고하는 체크박스 활성화<ul>
<li>콘텐츠를 자를 것 이나 말것이냐 선택<h3 id="📌레이어layer-텍스트text">📌레이어(layer), 텍스트(text)</h3>
<h4 id="📌레이어">📌레이어</h4>
</li>
<li>우측에도 레이어 패널이 존재한다.<ul>
<li>투명도 조절, 블랜드 모드 설정<h4 id="📌텍스트">📌텍스트</h4>
</li>
</ul>
</li>
</ul>
</li>
<li>텍스트 레이어를 클릭하면 우측사이드바에 텍스트 프로퍼티가 추가된 모습을 확인 할 수 있다.</li>
<li>폰트 종류 선택 가능</li>
<li>폰트 weight, 사이즈 설정 가능</li>
<li>문장의 행간 조절 가능 </li>
<li>데브모드를 통해서 line-height 의 비율과 값까지 확인 가능</li>
<li>글자와 글자 사이의 간격 조절 가능(letter spacing)</li>
<li>더보기란 으로 데코레이션 가능</li>
</ul>
<h3 id="📌채우기fill-선stroke">📌채우기(fill), 선(Stroke)</h3>
<h4 id="📌채우기">📌채우기</h4>
<ul>
<li>기본적으로 색을 칠할 수 있는 면의 성격을 가진 레이어라면, 우측에 보면 fill 레이어, Fill 프로퍼티가 활성화 된다.</li>
<li>우측 상단에 + 버튼을 눌러서 사용 가능 </li>
<li>gradient 적용 가능</li>
<li>이미지나, 동영상을 불러 올 수 있다.<h4 id="📌선">📌선</h4>
</li>
<li>우측에 stroke 패널</li>
<li>+버튼 클릭해서 추가 가능</li>
<li>여러개의 레이어를 중첩 가능</li>
<li>선의 포지션을 결정하는 부분: inside, center, outside</li>
<li>상단에만 적용하거나 하단에만 하거나 하는 설정 가능<h3 id="📌선택된-컬러selection-colors-이펙트effects-내보내기">📌선택된 컬러,(selection colors,), 이펙트(Effects), 내보내기</h3>
<h4 id="📌선택된-컬러">📌선택된 컬러</h4>
</li>
<li>우측 사이드바 패널에 selection colors</li>
<li>복수의 레이어를 클릭하면 레이어들의 사용된 모든 컬러값을 보여준다.</li>
<li>해당 컬러가 사용된 레이어들을 한번에 수정 가능<h4 id="📌이펙트">📌이펙트</h4>
</li>
<li>플러스 버튼을 사용해서 여러개의 효과 적용가능</li>
<li>layer blur 흐림 효과 </li>
<li>backgounrd blur 하단에 위치한 레이어에 블러 효과 적용(fill layer 를 100 보다 낮게 설정 해야 적용 가능)<h4 id="📌export">📌export</h4>
</li>
<li>다운로드 받고 싶은 레이어를 클릭 후 우측 export 플러스 버튼 클릭</li>
<li>한번에 다운로드 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 20일차 과제 후기 - 메타인지]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-20%EC%9D%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-20%EC%9D%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 22 Jan 2024 15:41:04 GMT</pubDate>
            <description><![CDATA[<p>오늘도 과제가 있었다. 저번 과제는 화면 구현을 어떻게든 해서
모듈화나 리팩토링이 부족했던 것 같아 이번에는 모듈화부터 진행하면서 시작했다.
api 오류 하나 잡는데 거의 1시간을 써서 마지막 10초 남기고 제출을 했다..
자바스크립트는 여전히 부족하다고 느낀다.
공부를 하면서 느낀 점은 자기 객관화, 메타인지 가 정말 중요하다는 것이다.
내가 현재 수준이 어디 위치며, 뭐가 부족한지 명확하게 알고 부족한 걸 집중적으로 공부해야 한다는 걸 뼈저리게 느낀다.</p>
<p>강의만 보고 따라치는 게 내 실력인 줄 착각했던 것 같다.
앞으로만 강의만 보고 따라치지 말고 강의를 보고 내가 직접 안보고 만들어보는 공부를 하면서 
인출하는 방식으로 공부를 해야겠다.</p>
<p>아직 많이 부족하다. 더 열심히 해보자</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 19일차 과제 후기]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-19%EC%9D%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-19%EC%9D%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 21 Jan 2024 10:59:54 GMT</pubDate>
            <description><![CDATA[<p>오늘은 과제가 있는 날이었다.</p>
<p>자바스크립트 과제였고 4시간을 주고 미션을 구현하는 문제다.</p>
<p>처음 개발 공부를 시작할 때 자바스크립트를 3달 정도 공부 후 바로 리액트로 넘어가고부터는</p>
<p>자바스크립트에 대해 깊게 공부하지 않았고 리액트를 쓰다가 자바스크립트로 구현을 하니 조금 어색하기도 하고 헷갈렸던 것 같다.</p>
<p>화면 구현은 어떻게든 했지만 리팩토링, 모듈화를 하는 과정에서 시간이 조금 촉박해 제대로 하지 못했던 것이 조금 아쉬웠다. 그래도 미션을 하면서 느낀 점은 결국
자바스크립트라는 언어를 탄탄히 알고 있어야 한다는 것, 그래야 리액트를 하더라도, react-native를 하더라도 좀 더 이해가 빠르게 쉽게 할 수 있을 거라는 것이다.
방학기간에 자바스크립트 복습, 리액트, 리액트 네이티브에 대해 미리 공부해서 팀 프로젝트를 대비해 보자!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 17, 18일차 고양이 사진 검색 사이트]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-17-18%EC%9D%BC%EC%B0%A8-%EA%B3%A0%EC%96%91%EC%9D%B4-%EC%82%AC%EC%A7%84-%EA%B2%80%EC%83%89-%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-17-18%EC%9D%BC%EC%B0%A8-%EA%B3%A0%EC%96%91%EC%9D%B4-%EC%82%AC%EC%A7%84-%EA%B2%80%EC%83%89-%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Thu, 18 Jan 2024 13:47:11 GMT</pubDate>
            <description><![CDATA[<h2 id="📌api">📌api</h2>
<ul>
<li>request 처럼 성공 실패가 확실하지 않은 경우에는 되도록 try catch문을 쓰고,</li>
<li>status에서 error를 만들어줄때는 throw문을 쓴다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/9a512e4b-07a4-4e96-a871-d1a45f234c4a/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/4c83ada6-768b-459b-beec-5df4dce767a6/image.png" alt=""></li>
</ul>
<h2 id="📌모듈화">📌모듈화</h2>
<ul>
<li><p>ES6 module 형태로 코드를 변경합니다.</p>
<ul>
<li>webpack, parcel 과 같은 번들러를 사용x</li>
<li>해당 코드 실행을 위해서는 http-server 모듈을 통해 index.html 로 띄워야 합니다.<pre><code>const config = {
API_ENDPOINT : &quot;http://localhost:4001&quot;
}
import config from &#39;./config.js&#39;;
const {API_ENDPOINT} = config;
export default config;
</code></pre></li>
</ul>
<pre><code>### 중복제거 함수</code></pre><p>export default function uniqueArray(list) {
 return Array.from(new Set(list));
}
```</p>
<h2 id="📌기타리팩토링">📌기타리팩토링</h2>
</li>
<li><p><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/bab09f62-b570-4e3a-92b2-c2293219b7b7/image.png" alt=""></p>
</li>
<li><p>data, 와 page 를 리펙토링 해준다.</p>
</li>
<li><p>async await 리펙토링</p>
<pre><code>async showDetail(data) {
 const detailInfo = await api.fetchCatDetail(data.cat.id);
 if(detailInfo) {
    // 정보를 업데이트
    this.setState({
     visible: true,
     cat: detailInfo.data
   });
 }

}</code></pre></li>
</ul>
<h2 id="📌테스트">📌테스트</h2>
<ul>
<li>npm install --save-dev jest 설치 후 npm run test <pre><code>import uniqueArray from &#39;../utils/uniqueArray.js&#39;; // 테스트 대상 모드를 불러오고 
describe(&#39;uniqueArray.js&#39;, () =&gt; {   // describe로 시작 
test(&#39;중복 제거 확인&#39;, () =&gt; {
expect(uniqueArray([0, 1, 1])).toStrictEqual([0,1])
})
});</code></pre></li>
</ul>
<pre><code>



## 📌결과없음
- 검색 결과가 없는경우 유저가 불편함을 느끼지 않도록 ui적인 적절한 처리</code></pre><p>this.data = {
         show: false,
         isNull: false
     }</p>
<pre><code> show(data) {
 this.setState({
  show: data === null || data.length === 0,
  isNull: data === null
 })</code></pre><p>   }</p>
<pre><code>render() {
if (this.data.show) {
  this.$empty.style.display = &#39;block&#39;;
  if(this.data.isNull) {
    this.$empty.innerHTML = `
    &lt;p&gt;
      요청 실패😂
    &lt;/p&gt;
    `;
  } else {
    this.$empty.innerHTML = `
      &lt;p&gt;
        결과가 없습니다.😂
      &lt;/p&gt;
      `;
  }



} else {
  this.$empty.style.display = &#39;none&#39;;
  this.$empty.innerHTML = &#39;&#39;;
}</code></pre><pre><code>
## 📌추가 요구 사항
 - 검색어 히스토리를 숨겼다가 인풋에 마우스가 오버될때 보여주도록 ui 변경
 - 간단하게 css로 구현 </code></pre><p> .SearchInputSection {
  position: relative;
}</p>
<p>.KeywordHistory {
  display: none; 
  position: absolute;
  top: 75px;
  left: 0;
  width: 100%;
  background: #000;
  margin: 0;
  padding: 20px;
}</p>
<p>.SearchInputSection:hover .KeywordHistory {
  display: block;
}</p>
<pre><code>
 - 검색결과 각 아이템에 마우스 오버시 고양이 이름 노출하기
 - 아이템 호버시 opacity: 1로 해주기

 ```.SearchResult .item .content {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0,0,0, .3);
  text-align: center;
  font-size: 30px;
  color: #fff;
  opacity: 0;
  transition: all .5s ease;
}
.SearchResult .item:hover .content {
  opacity: 1;
}</code></pre><ul>
<li>랜덤 고양이 배너섹션 추가 </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 15,16일차 고양이 사진 검색 사이트]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-1516%EC%9D%BC%EC%B0%A8-%EA%B3%A0%EC%96%91%EC%9D%B4-%EC%82%AC%EC%A7%84-%EA%B2%80%EC%83%89-%EC%82%AC%EC%9D%B4%ED%8A%B8</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-1516%EC%9D%BC%EC%B0%A8-%EA%B3%A0%EC%96%91%EC%9D%B4-%EC%82%AC%EC%A7%84-%EA%B2%80%EC%83%89-%EC%82%AC%EC%9D%B4%ED%8A%B8</guid>
            <pubDate>Wed, 17 Jan 2024 07:17:11 GMT</pubDate>
            <description><![CDATA[<h2 id="📌로컬스토리지">📌로컬스토리지</h2>
<ul>
<li><p>최근 검색한 keyword를 Searchinput아래에 표시되도록 만들고, 해당 영역에 표시된 특정 키워드를 누르면 그 키워드로 검색이 일어나도록 만듭니다. 단, 가장 최근에 검색한 5개의 키워드만 노출되도록 합니다.</p>
<blockquote>
<h3 id="구현해보기">구현해보기</h3>
</blockquote>
<pre><code>// SearchInput 컴포넌트 하위에 배치
 class KeywordHistory {
 $keywordHistory = null;
 data = null;

 constructor({ $target, onSearch }) {
     const $KeywordHistory = document.createElement(&#39;ul&#39;);
     this.$KeywordHistory = $KeywordHistory;
     this.$KeywordHistory.className = &#39;KeywordHistory&#39;;
     $target.appendChild(this.$KeywordHistory);

    this.data = [
     &#39;아&#39;,
     &#39;고양이&#39;,
     &#39;cat&#39;,
    ];

  this.onSearch = onSearch;
  this.render();

 }

 render() {
     this.$KeywordHistory.innerHTML = this.data
      .map(
         keyword =&gt; `
         &lt;li&gt;&lt;button&gt;${keyword}&lt;/button&gt;&lt;/li&gt;
         `
      ).join(&#39;&#39;); 
     this.$KeywordHistory.querySelectorAll(&#39;li button&#39;).forEach(
         ($item, index) =&gt; {
         $item.addEventListener(&#39;click&#39;, () =&gt; {

           console.log(this.data[index]);
           this.onSearch(this.data[index]);
         });
     });

</code></pre></li>
</ul>
<h3 id="이제-데이터를-어떻게-가지고-올까">이제 데이터를 어떻게 가지고 올까</h3>
<ul>
<li>로컬스토리지에서 데이터를 가지고 오기 </li>
</ul>
<h4 id="예시코드">예시코드</h4>
<pre><code>  init() {
      let dummy = [
        &#39;아&#39;,
        &#39;고양이&#39;,
        &#39;cat&#39;,
      ];
      this.setState(dummy);
    }

    setState(nextData) {
    this.data = nextData;
    this.render();
    }
</code></pre><ul>
<li>let dummy 부분을 로컬에서 가지고 오면 됨</li>
<li>데이터를 split 통해서 배열로 바꿔준다.<h4 id="데이터를-get-하는-부분">데이터를 get 하는 부분</h4>
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/d0b7d4d0-befb-4cbf-b239-77ab4f4b6876/image.png" alt=""></li>
</ul>
<h4 id="데이터를-저장하는-부분">데이터를 저장하는 부분</h4>
<ul>
<li>저장하는 부분은 searchinput 컴포넌트에서 작성  </li>
<li>어떤시점에 작성을 할까 = 결과를 요청하는 시점, enter 하는 시점<ul>
<li>keyup 은 한글일때 2번 요청하는  enter 오류가 난다. (keypress 사용)</li>
<li>처음에 null 값이 오는걸 방지하기 위해서 삼항연산자 적용 
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/cfb0380b-083d-4d08-93a2-c3403936ad02/image.png" alt=""></li>
<li>수정해야 될 부분 </li>
</ul>
</li>
<li>최근데이터가 위로 가게끔 구현해야 하므로 unshift 사용</li>
<li>데이터를 5개까지만 제한<ul>
<li>slice(0, 5) 사용
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/c371ce29-acff-4024-9338-3da6f9659dbe/image.png" alt=""></li>
</ul>
</li>
</ul>
<blockquote>
<p>페이지를 새로고침해도 마지막 검색 결과 화면이 유지되도록 처리하기</p>
</blockquote>
<ul>
<li>APP.js 에서 구현해준다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/0f30c929-66ad-405f-9f0e-af5b4a6eb92b/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/9a05d6be-414d-4d77-b9c8-c0ccd20c5746/image.png" alt=""><ul>
<li>이제 저장한 데이터를 가져오기만 하면 된다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/59aa9b66-431c-4b6c-8e89-d979cd38ad61/image.png" alt="">
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/203e5d9e-5175-438d-af6f-998557b63d0a/image.png" alt=""></p>
<h2 id="📌스크롤-다음-페이지">📌스크롤 다음 페이지</h2>
<ul>
<li>검색 결과화면에서 유저가 브라우저 스크롤바를 끝까지 이동시켰을 경우, 그 다음 페이지를 로딩하도록 구현<ul>
<li>scroll 이벤트는 제한없이 계속 발생한다.</li>
</ul>
</li>
<li>다음  페이지 메서드 구현</li>
<li>app.js 
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/fb94f61b-ab85-4d38-9555-2a666615458d/image.png" alt=""><ul>
<li>cat 과 2라는 데이터를 어떤식으로 관리하면 좋을까, 저장을 해야한다.</li>
<li>로컬스토리지에 저장되어있던 데이터를 getitem으로 가져온다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/525fc5c4-5671-4269-918f-4ecbf0e157b8/image.png" alt=""></li>
</ul>
</li>
</ul>
<ul>
<li>searchResult 에서 받아와서 실행해준다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/74dc064f-87b5-4da7-a625-3e651b5f2e2b/image.png" alt=""></li>
</ul>
<h2 id="📌intersectionbserver-리펙토링">📌intersectionbserver (리펙토링)</h2>
<ul>
<li><p>기존 코드의 문제점은 스크롤 이벤트가 자주 일어나서 별도의 디바운드, 스로틀링 작업을 하지 않으면 퍼포먼스에 영향을 준다.(화면을 새로 그리는 작업을 하게 된다) - cpu, 낭비</p>
</li>
<li><p>사용자 경험에도 영향을 준다.</p>
</li>
<li><p>인터셉션 옵저버 활용해보기</p>
</li>
<li><p>isintersecting 은 현재 뷰 포트에 등장을 했는지 여부 등장을 하면 true</p>
</li>
<li><p>각 이미지에 index을 부여해준다. 
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/9bbcc844-5c20-4031-9ffe-ad6bfaeb4326/image.png" alt=""></p>
<ul>
<li><p>해당 아이템의 이미지의 인덱스를 받아서 마지막인덱스 일때 다음페이지 호출</p>
</li>
<li><p>처음에 이미지가 납작해서 마지막 페이지를 읽는 이슈로 인해 더미 이미지를 넣고, min-height 를 적용해준다.
<img src="https://velog.velcdn.com/images/qkrtjrwls_/post/d9e2d97b-e4a3-476a-addf-2f55c0b62ae3/image.png" alt=""></p>
<pre><code>render() {
this.$searchResult.innerHTML = this.data
 .map(
   (cat, index) =&gt; `
     &lt;li class=&quot;item&quot; data-index=${index}&gt;
       &lt;img src=&quot;https://via.placeholder.com/200*300&quot; data-src=${cat.url} alt=${cat.name} /&gt;
     &lt;/li&gt;
   `
 )
 .join(&quot;&quot;);

  // 이미지를 로드한다.
  item.target.querySelector(&#39;img&#39;).src = item.target.querySelector(&#39;img&#39;).dataset.src;</code></pre></li>
<li><p>더미 이미지에 이미지를 로드 해준다.</p>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[울트라러닝 책 요약- 단 1년 만에 MIT 4년 과정을 정복한 초고속 지식 습득의 비밀! ]]></title>
            <link>https://velog.io/@qkrtjrwls_/%EC%9A%B8%ED%8A%B8%EB%9D%BC%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@qkrtjrwls_/%EC%9A%B8%ED%8A%B8%EB%9D%BC%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Fri, 12 Jan 2024 03:48:04 GMT</pubDate>
            <description><![CDATA[<h1 id="울트라러닝">울트라러닝</h1>
<blockquote>
<p>해당 글은 울트라 러닝 이라는 책을 읽고 정리한 글입니다. </p>
</blockquote>
<h2 id="📌법칙1_메타학습">📌법칙1_메타학습</h2>
<blockquote>
<p>먼저 지도를 그려라.
  3가지 질문을 통해 메타 학습 탐색 해보기
  왜, 무엇을, 어떻게</p>
</blockquote>
<h3 id="왜-그것을-배우려-하는지">&#39;왜&#39; 그것을 배우려 하는지</h3>
<ul>
<li>무엇을 배우려는지 스스로 물어보는 일이 중요하다. 
그래야 세우려는 학습 계획들이 목적에 적합한지 알 수 있기 때문</li>
</ul>
<h3 id="무엇을-획득해야-하는가">&#39;무엇을&#39; 획득해야 하는가</h3>
<ul>
<li>왜 배울지에 답했다면 이제 공부하려는 지식이 어떻게 구조화되어 있는지를 살펴봐야 한다.<blockquote>
<p>1.개념</p>
</blockquote>
</li>
</ul>
<p>  2.사실정보
  3.절차</p>
<h4 id="개념">개념</h4>
<ul>
<li>개념이란 단어 아래에는 이해해야 할 내용들을 적는다.</li>
<li>개념이란 그것을 유용하게 사용하기 위해 융통성 있게 이해해야 할 어떤 생각을 말한다.</li>
</ul>
<h4 id="사실정보">사실정보</h4>
<ul>
<li>여기에는 암기해야 할 것들을 적는다.</li>
<li>사실 정보는 어쨋든 외우면 그만인 것들이다.</li>
</ul>
<h4 id="절차">절차</h4>
<ul>
<li><p>여기에는 연습해야 할 것들을 적어 넣는다.</p>
</li>
<li><p>절차는 수행해야 하는 행동들로, 의식적인 생각과는 관계없다.</p>
</li>
<li><p>예를 들어 언어의 경우 새로운 어휘를 배우려면 새로운 사실 정보를 암기해야 하지만 발음에는 연습이 필요하다. 따라서 &#39;절차&#39;에 넣어야 한다.</p>
<blockquote>
<p>브레인 스토밍을 끝냈다면 가장 어려울 것 같은 개념, 사실 정보, 절차들에 밑줄 긋기</p>
</blockquote>
</li>
</ul>
<h3 id="어떻게-학습할-것인가">&#39;어떻게&#39; 학습할 것인가?</h3>
<blockquote>
<ol>
<li>벤치마킹<ol start="2">
<li>강조제거</li>
</ol>
</li>
</ol>
</blockquote>
<h4 id="벤치마킹">벤치마킹</h4>
<ul>
<li>어떤 학습 프로젝트를 시작하는 방법은 대부분의 사람이 그 기술(분야)을 배운 공통적인 방식을 찾는 것</li>
<li>배우려는 분야가 전문적인 기술이라면 온라인에서 그 기술을 습득한 사람을 찾거나 전문가에게 그 분야를 공부하는 데 필요한 자원들을 물어보기.<h4 id="강조제거">강조제거</h4>
<ul>
<li>앱을 만드려고 혼자 프로그래밍을 배우고 있다면 나는 컴퓨터 이론보다는 앱 개발의 세부적인 작업들에 초점을 맞출 것</li>
<li>주요 목표가 말하기라면 문자를 암기하는 것은 과감히 포기하고 말하는 데 능숙해지는 것이 훨씬 더 효과적이다. </li>
</ul>
</li>
</ul>
<h3 id="계획을-얼마나-많이-세워야-할까">계획을 얼마나 많이 세워야 할까?</h3>
<h4 id="10퍼센트-규칙">10퍼센트 규칙</h4>
<ul>
<li><p>좋은 방법은 프로젝트를 시작하기 전에 예정된 시간의 약 10퍼센트를 탐색에 투자하는 것</p>
</li>
<li><p>1,000시간을 공부할 계획이라면 5퍼센트 정도의 시간</p>
</li>
<li><p>프로젝트를 시작하기 전에 일반적인 학습 방식, 인기 있는 자원과 도구들을 찾아보고 각각이      지닌 강점과 취약점을 아는 것이 좋다</p>
<h4 id="수확-체감과-한계비용-계산">수확 체감과 한계비용 계산</h4>
<ul>
<li>어떻게 탐색할지에 관한 질문의 답은 규칙적인 학습과 메타 학습의 한계비용을 비교해보기
더 많은 전문가를 면담하고, 더 많은 시간을 들여 온라인 검색을 이용 가능한 새로운 기술이 있는지 찾아본다. 그러고 나서 선택한 경로를 따라 몇 시간 더 공부한다.</li>
<li>각각에 어느 정도 시간을 들인 뒤에는 두 활동의 가치를 재빠르게 비교해보기</li>
<li>계속 탐색을 해나간다면 마침내는 그냥 학습을더 하는 것보다 가치가 줄어든다. 따라서 그 지점에서는 학습에 안정적으로 집중하기</li>
<li>실제로 탐색이 주는 보상은 변동이 크다. 몇시간 탐색하고 잡자코 있따 보면 빠르게 성공을 이끌어낼 완벽한 자원들을 우연히 만날 수도 있따.</li>
</ul>
</li>
</ul>
<h2 id="📌법칙2_집중하기">📌법칙2_집중하기</h2>
<blockquote>
<p>짧은 시간에 집중도를 높이기</p>
</blockquote>
<h2 id="📌법칙3_직접하기">📌법칙3_직접하기</h2>
<blockquote>
<p>목표를 향해 똑바로 나아가라</p>
</blockquote>
<ul>
<li><p>자이스월 이야기는 세 번째 법칙을 완벽하게 보여준 바로 &#39;직접하기&#39;</p>
</li>
<li><p>건축이 실제로 어떻게 이뤄지는지 보고 자신이 원하는 자리와 밀접한 관계가 있는 기술들을 습득합으로써, 그는 별로 인상적이지 않은 포트폴리오를 제출하는 졸업생 무리를 뚫고 나갈 수 있었다.</p>
</li>
<li><p>직접하기는 배우려는 기술을 실제로 사용할 환경과 상황에 가장 가까운 상태에서 학습하는 방식</p>
</li>
<li><p>로저 크레이그는 실제로 등장했던 질문들로 자가 테스트를 했다.</p>
</li>
<li><p>에릭 배런은 자신이 만들 비디오게임에 들어갈 아트워크를 직접 만들어봄으로써 비디오게임 아트를 배웠다.</p>
<blockquote>
<p>이런 접근법들의 공통점은 그 기술의 맥락에서 공부해서 마침내  실제로 그 기술을 사용할 수 있게 되었다는 점</p>
</blockquote>
</li>
<li><p>직접 하기를 가장 쉽게 하는 방법은 그저 잘하고 싶은 그 일을 행하는 데 많은 시간을 들이는 것</p>
</li>
<li><p>언어를 배우고 싶다면 베니 루이스처럼 그 언어로 말하기.</p>
</li>
<li><p>시험에 통과하고 싶다면 거기에 나오는 문제들을 풀어보기</p>
<blockquote>
<p>직접 학습은 책을 읽거나 앉아서 강의를 듣는 것보다 좌절하기 쉽고, 도전적인 일이며, 강도가 높다. 하지만 이런 극도의 어려움이 울트라러닝 지망생들에게는 경쟁적인 이점을 주는 강력한 원천이 되기도 한다.</p>
</blockquote>
</li>
</ul>
<h4 id="프로젝트-기반-학습">프로젝트 기반 학습</h4>
<ul>
<li>강좌보다는 프로젝트를 시도하는걸 택한다.</li>
<li>컴퓨터 게임을 만듦으로써 프로그램 짜는 법을 배우는 건 프로젝트 기반 학습의 완벽한 본보기다.</li>
</ul>
<h4 id="담금형-학습">담금형 학습</h4>
<ul>
<li>자신이 목표로 한 기술을 실행할 환경에 뛰어드는 것
이는 그 기술을 이용할 상황에 자신을 노출시켜서 일반적인 학습 방식보다 훨씬 더 많은 연습을 하게 된다는 이점이 있다.
ex) 팀 프로젝트에 참가하기<h4 id="모의-비행-방식">모의 비행 방식</h4>
</li>
<li>직접 하기 방식을 시뮬레이션하는 것이 학습전이를 더 잘 일으킨다. 따라서 프랑스로 여행을 가기 전에 프랑스어를 배우려면 낱말 카드를 넘기는 것보다 스카이프를 통해 공부하는 편이 학습전이가 더 잘일어날 것이다.<h4 id="과다-학습법">과다 학습법</h4>
</li>
<li>직접 하기를 강화하는 마지막 방법은 도전을 늘리는 것이다. 그럼으로써 목표를 달성하는 데 필요한 기술 수준에 도달할 수 있다.</li>
<li>애플리케이션을 곧장 프로그래밍하는것보다는, 누군가가 코딩하는 법을 촬영한 동영상을 보고 싶을지도 모른다.</li>
<li>어떤 프로젝트에 과다 학습법을 적용하는 방법 한 가지는 당신 자신에게 필요한 수준 이상의 시험이나 과제에 도전하는 걸 목표로 삼는 것이다.<blockquote>
<p>직접 학습은 울트라러닝 프로젝트의 중요한 특징으로, 대부분이 받아온 교육 방식과는 다르다.</p>
</blockquote>
</li>
</ul>
<ul>
<li>뭔가 새로운 것을 배우려고 한다면 그 지식이 어디에서 어떻게 나타나야 하는지 스스로에게 물어보는 습관을 들이자.</li>
<li>다음으로 그 맥락에서 자신이 학습 중인 것과 연관된 일을 하고 있는지 물어보기</li>
</ul>
<h2 id="📌법칙4_특화-학습">📌법칙4_특화 학습</h2>
<blockquote>
<p>취약점을 공략하라</p>
</blockquote>
<ul>
<li><p>자신의 학습 반응 속도에서 율속 단계가 어디인지 확인함으로써 그 부분을 따로 떼어내 집중적으로 학습하는 것이다.</p>
</li>
<li><p>기술의 전체적인 숙련도를 지배하는 그 부분을 증진시키면 해당 기술의 모든 측면을 동시에 연습하는 것보다 훨씬 빠르게 발전할 수 있다.</p>
</li>
<li><p>직접 하기 방식은 어떤 기술이 사용되는 환경과 근접한 환경에서 전체적인 기술을 연습하는 것인데, 특화 학습은 이와 정반대 방향에 있다. </p>
</li>
<li><p>특화 학습은 직접 연습 방식을 취하고, 그것을 부분으로 쪼갠다.</p>
<blockquote>
<p>직접 학습 다음에 특화 학습 전략</p>
</blockquote>
</li>
<li><p>많은 사람이 부분적인 기술들을 충분히 개발하면 학습전이가 일어나리라는 희망을 품고 직접적인 맥락을 무시하거나 그 차이를 도외시한다.</p>
</li>
<li><p>첫 단계는 그 기술을 직접적으로 연습하는 것이다. 그 기술을 사용할곳이 어디인지, 어떻게 사용할 것인지를 이해하고 그 기술을 실현할 환경과 비슷한 환경에서 연습한다.</p>
</li>
<li><p>다음 단계는 직접 하기 기술을 분석하고, 집중해야 할 요소들이 너무 많아서 진도가 안 나가는 하위 기술 속에서 율속 단계인 요소들을 분리하기. 이 부분들을 잘하게 될 때까지 특화 학습 하기.</p>
</li>
<li><p>마지막 단계는 직접 학습으로 되돌아가서 지금까지 배운 것들을 통합하기</p>
<blockquote>
<p>특화 학습을 하는 가장 쉬운 방법</p>
</blockquote>
</li>
<li><p>어떤 부분을 향상시켰을 때 최소의 노력으로 전체 능력을 가장 많이 향상시킬 수 있을까</p>
</li>
<li><p>방해꾼이 무엇인지 추적하고, &#39;직접 학습 다음에 특화 학습&#39;을 이용해 특화 학습으로 공략하고, 그것이 올바른 선택이었는지 잽싸게 점검한다.</p>
<blockquote>
<ol>
<li>시간 쪼개기</li>
<li>인지 요소 거르기</li>
<li>흉내 내기</li>
<li>돋보기 방식</li>
<li>되돌아가기</li>
</ol>
</blockquote>
<h4 id="시간쪼개기">시간쪼개기</h4>
</li>
<li><p>지금 공부하고 있는 과제에서 점점 더 어려워지거나 중요해지는 요소, 시간별로 쪼개서 연습할 수 있는 요소들을 찾기.</p>
<h4 id="인지-요소-거르기">인지 요소 거르기</h4>
</li>
<li><h4 id="흉내-내기">흉내 내기</h4>
</li>
<li><p>그림 그리기 프로젝트를 할 때 사진이 아니라 다른 사람들이 그린 그림에서 시작하기</p>
</li>
<li><p>창조적 작업의 경우 자신이 과거에 만든 작업물을 편집하는 것</p>
<h4 id="돋보기-방식">돋보기 방식</h4>
</li>
<li><p>어떤 한 가지 요소에 훨씬 많은 시간을 쏟는 것 </p>
<h4 id="되돌아가기">되돌아가기</h4>
</li>
<li><p>특정 단계로 되돌아가서 기초적인 내용 하나를 배우고, 연습하기를 반복하기</p>
</li>
</ul>
<h2 id="📌법칙5_인출">📌법칙5_인출</h2>
<blockquote>
<p>배운 것을 시험하라</p>
</blockquote>
<ul>
<li><p>교과서를 보지 않고 기억 인출을 시도한 행위가 다른 모든 방식을 뛰어넘은 것</p>
</li>
<li><p>뭔가를 수동적으로 복습하면 자신이 뭘 알고 뭘 모르는지에 관한 어떤 피드백도 받을 수 없다. </p>
</li>
<li><p>기억에서 지식을 소환하려고 애쓰는 행동은 직접학습이나 피드백과 연계되는 것을 넘어서서 그 자체로 강력한 학습 도구다.</p>
<ul>
<li>낮은 강도의 학습 전략들은 대게 쉬운 수준의 인출 작업을 요구한다.
따라서 어려움을 높이고 미처 &#39;준비가 되기&#39; 전에 자체 시험을 치르는 것이 훨씬 효율적이다. </li>
<li>인출은 사전 시험 효과 를 준다.<blockquote>
<p>효율적인 인출을 위한 팁</p>
</blockquote>
<ol>
<li>낱말 카드</li>
<li>자유 회상 - 책의 어떤 한 부분을 읽거나 강의를 들은 뒤, 빈 종이에 기억나는 것을 모조리 적는 것</li>
<li>문제집 방식 - 기록할 내용을 문제로 바꿔서 작고 나중에 답하는 것, 각 장별로 질문을 한가지로 제한하는 것, </li>
<li>도전 만들기 - 책을 보다 새로운 기술이 나오면 그 기술을 실제 예시로 표현해서 기록하는 것</li>
<li>클로즈 북 학습 방법 - 집접 하기든 특화 학습이든, 대상을 검색하는 능력을 차단하고 연습할 수 있다. 자료를 참고하지 않으면 그 정보는 참고 매뉴얼이 아니라 우리 머릿속에 저장된다.</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="📌법칙6_피드백">📌법칙6_피드백</h2>
<blockquote>
<p>날아드는 조언을 피하지 마라</p>
</blockquote>
<ul>
<li><p>우리가 뭔가를 잘못하고 있다거나 그것을 어떻게 수정할 것인지 말해주는 피드백은 강력한 도구가 될 수 있다.</p>
</li>
<li><p>에릭 배런은 게임 초안을 작성할 때 자신에게 돌아오는 비평 모두에 주의를 기울이지는 않았다. 그 조언이 자신의 비전과 상충될 때는 무시했다.</p>
</li>
<li><p>상황 한복판으로 들어가 곧장 피드백을 받고 그 정보를 이용하여 빨리 습득하는 대신, 우리는 한 방 머곡 중요한 학습 자원을 회피하곤 한다.</p>
<blockquote>
<p>결과 피드백
수정 피드백
정보 피드백</p>
</blockquote>
<h4 id="결과피드백-너-그거-잘못하고-있는-것-같은데">결과피드백 &quot;너, 그거 잘못하고 있는 것 같은데?</h4>
<ul>
<li>가장 흔하고 자주 받는 피드백</li>
<li>우리가 전반적으로 얼마나 잘하고 있는지는 말해주지만 더 나아지고 있는지, 혹은 나빠지고 있는지는 알려주지 않는다.</li>
<li>빠르게 발전 중일 때는 기존의 학습 방식을 고수할 수 있다.</li>
<li>발전이 지체되고 있을 때는 현재 방식에서 무엇을 바꿀 수 있을지 살펴볼 수 있다.</li>
</ul>
<h4 id="정보피드백-너-뭔가-잘못하고-있는-것-같은데">정보피드백 &quot;너, 뭔가 잘못하고 있는 것 같은데?</h4>
<ul>
<li>우리가 무엇을 잘못하고 있는지 말해준다. 하지만 그것을 어떻게 고쳐야 할지까지 말해주는 것은 아니다.</li>
<li>록의 스탠드업 코미디 실험 또한 정보 피드백을 받는 행위다. 어떤 농담이 제대로 먹혔을 때와 그렇지 않을 때를 청중의 반응을 보고 알 수 있었다.</li>
</ul>
</li>
</ul>
<h4 id="수정피드백-네가-잘못하고-있는-것을-어떻게-고칠-수-있을까">수정피드백: &quot;네가 잘못하고 있는 것을 어떻게 고칠 수 있을까?</h4>
<ul>
<li><p>가장 좋은 피드백은 수정 피드백이다.</p>
</li>
<li><p>이는 우리가 무엇을 잘못하고 있는지, 그것을 어떻게 수정해야 할지까지 알려준다. 이런 종류의 피드백은 대게 코치, 스승, 교사에게서 오는데, 올바른 학습 자원을 사용하고 있다면 자동적으로 받을 수 있다.</p>
</li>
<li><p>너무 빠른 피드백은 인출 작업을 수동적인 복습 상태로 넘어가게 한다. 그리고 답을 이미 알고 있는 것은 학습의 효율성을 떨어뜨릴 수 있다. 어려운 문제를 접했을 때 정답을 찾는 걸 포기하기 전에 어느 정도 시간까지는 그 문제와 씨름해보라.</p>
<blockquote>
<p>더 나은 피드백을 얻는 4가지 전략</p>
</blockquote>
</li>
</ul>
<h4 id="소음을-제거하라">소음을 제거하라</h4>
<ul>
<li>피드백에는 우리가 처리하고 싶은 유용한 정보가 담긴 신호와 소음, 2가지가 존재한다.<h4 id="바람직한-어려움의-적정선-찾기">바람직한 어려움의 적정선 찾기</h4>
<ul>
<li>자신이 성공할지 실패할지 예측할 수 없도록 환경을 주의 깊게 조정하기.</li>
<li>실패가 너무 잦으면 문제를 단순화해서 그 일을 젣로 하고 있는지 알아차릴 수 있다</li>
<li>실패가 거의 없으면 과제를 더 어렵게 하거나 기준을 더 엄격하게 올린 뒤 다양한 방법으로 해보고 무엇이 더 성공률이 높은지 알아보기</li>
<li>자신의 성취에 관해 좋은 기분 or 나쁜 기분 을 느끼게 하는 상황을 피하도록 노력해야 한다.<h4 id="메타-피드백">메타 피드백</h4>
</li>
<li>메타 피드백에서 중요한 유형 하나는 &#39;학습 속도&#39;다.</li>
<li>모의고사로 실력이 얼마나 향상되었는지를 측정</li>
<li>학습 속도가 느려지고 있다면 현재 사용 중인 방식에서 벗어나 특화 학습, 다른 학습 방식을 적용 해보는 게 이득이 될 수 있다.</li>
</ul>
</li>
</ul>
<h4 id="빠르고-강도높은-피드백을-받아라">빠르고 강도높은 피드백을 받아라</h4>
<ul>
<li>피드백을 향상시키는 가장 쉬운 방법 하나는 많이, 자주 받는 것이다.</li>
<li>강도 높고 재빠른 피드백은 정보적 이점을 제공하지만 훨씬 더 큰 장점은 강정적인 부분에 있다. 피드백에 대한 두려움은 종종 그 무엇보다 우리를 움츠러들게 한다. 강도 높고 빠른 피드백이 몰아치는 상황에 스스로 몸을 던지면 처음에는 불편하겠지만, 몇 달이고 몇 년이고 기다렸다 피드백을 받는 것보다 나을 수 있다.</li>
<li>스스로 어마어마한 양의 피드백에 노출되어 신호에서 소음을 제거하는 것이다.</li>
</ul>
<h2 id="📌법칙7_유지">📌법칙7_유지</h2>
<blockquote>
<p>새는 양동이에 물을 채우지 마라</p>
</blockquote>
<ul>
<li><p>유지는 전략적으로 우리가 배운 것을 머릿속에서 새나가지 않게 하는 능력</p>
</li>
<li><p>우리의 뇌가 최초에 배웠던 것을 훨씬 더 많이 망각하는 이유</p>
<ul>
<li>쇠퇴, 간섭, 망각된 신호</li>
</ul>
<blockquote>
<p>망각을 이기는 4가지 암기법</p>
</blockquote>
<h4 id="공백-기억하기-위해-반복하라">공백: 기억하기 위해 반복하라</h4>
<ul>
<li>10시간을 들여 뭔가를 공부한다면 하루에 10시간 공부하는 것보다 하루 한 시간씩 열흘 동안 공부하는 편이 훨씬 낫다.</li>
<li>공백을 적용하는 또 다른 전략은 반정기적으로 재환기 프로젝트를 행하는 것이다.</li>
<li>어떤 기술을 반정기적으로 연습하는 일 <h4 id="절차화-자동화될수록-더-오래-기억한다">절차화: 자동화될수록 더 오래 기억한다.</h4>
</li>
<li>절차적 지식은 무척이나 탄탄하며 서술적 지식보다 훨씬 오래 기억되곤 한다.(키보드 타이핑 하는 법)</li>
<li>대량의 지식이나 기술을 균등하게 공부하기보다 일부 핵심 정보에 훨씬 자주 초점을 맞춰 공부하는 것.<h4 id="초과학습-더-연습할수록-완벽해진다">초과학습: 더 연습할수록 완벽해진다.</h4>
</li>
<li>어떤 기술의 핵심 요소들을 꾸준히 연습하고 제련하기</li>
<li>고급 과정의 연습으로 보다 상위 수준에서 하위 기술의 핵심 부분들을 연습하기<h4 id="연상기호-그림-하나로-수천-개의-단어를-기억하기">연상기호: 그림 하나로 수천 개의 단어를 기억하기</h4>
</li>
<li><h2 id="📌법칙8_직관">📌법칙8_직관</h2>
<blockquote>
<p>뼈대를 세우기 전에 깊게 파라</p>
</blockquote>
</li>
</ul>
</li>
<li><p>어려운 문제라고 쉽게 포기하지 말기</p>
</li>
<li><p>대상을 증명하는 방식으로 이해하기</p>
</li>
<li><p>늘 구체적인 사례를 가지고 시작하기</p>
</li>
<li><p>자신을 속이지 말기</p>
<ul>
<li>더닝 크로거 효과: 어떤 주제에 관해 제대로 이해 하지 못하면서 실제로 아는 것 보다 더 많이 알고 있다고 믿는 걸 말한다. 방법은 질문 많이 하기!!  <blockquote>
<p>파인만 기법 활용하기</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ol>
<li>종이 한장을 꺼내 이해하려는 개념이나 문제를 위에서부터 쭉 써 내려간다.</li>
<li>그 아래 공간에 누군가에게 가르치듯이 설명을 해본다.
a. 그것이 개념이라면, 그 개념에 대해 한 번도 들어보지 못한 사람에게 어떻게 전달할 수 있을지 스스로 물어본다.
b. 그것이 문제라면, 어떻게 풀지 설명한다. 그리고 풀이 과정이 어째서 타당한지 스스로 설명해본다.</li>
<li>벽에 부딪혔을 때, 즉 자신이 이해하고 있는 것으로 정답을 도출하지 못했을 때는 책, 공책, 교사, 참고 자료 등으로 돌아가 답을 찾는다.</li>
</ol>
<h2 id="📌법칙9_실험">📌법칙9_실험</h2>
<blockquote>
<p>자신의 안전지대 밖을 탐험하라 </p>
</blockquote>
<blockquote>
<ol>
<li>따라하기, 창조하기</li>
<li>방법들을 나란히 놓고 비교하기</li>
<li>세로운 제약을 도입하기</li>
<li>관련 없는 기술들을 결합해 자신의 힘 찾기</li>
<li>극단을 탐험하기</li>
</ol>
</blockquote>
<h2 id="📌나의-첫-울트라러닝-프로젝트-시작하기">📌나의 첫 울트라러닝 프로젝트 시작하기</h2>
<h3 id="1단계-자신에게-필요한-조사하기">1단계: 자신에게 필요한 조사하기</h3>
<blockquote>
<ol>
<li>어떤 주제를 공부할지 대략적인 범위 정하기<ol start="2">
<li>사용하게 될 주요 자원들을 결정하기</li>
<li>벤치마킹할 다른 사람들의 방법을 찾기</li>
<li>직접 연습 기회를 찾기</li>
<li>예비 재료와 수단을 구하기</li>
</ol>
</li>
</ol>
</blockquote>
<h3 id="2단계-일정을-조율하기">2단계: 일정을 조율하기</h3>
<h3 id="3단계-계획을-실행하기">3단계: 계획을 실행하기</h3>
<h3 id="4결과를-검토하기">4.결과를 검토하기</h3>
<h3 id="5배운-것을-유지할-것인가-완전히-익힐-것인가">5.배운 것을 유지할 것인가, 완전히 익힐 것인가</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 클라우딩 어플리케이션 엔지니어링 - TIL 13,14일차 가계부 서비스 만들기 (렌더링, 이벤트, 서버간 통신)]]></title>
            <link>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-13%EC%9D%BC%EC%B0%A8-%EA%B0%80%EA%B3%84%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@qkrtjrwls_/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%94%A9-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-TIL-13%EC%9D%BC%EC%B0%A8-%EA%B0%80%EA%B3%84%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Wed, 10 Jan 2024 13:03:27 GMT</pubDate>
            <description><![CDATA[<h1 id="가계부-서비스-만들기">가계부 서비스 만들기</h1>
<p><img src="https://velog.velcdn.com/images/qkrtjrwls_/post/bb8f09d2-b75e-4f23-a902-6b023c1270b5/image.png" alt=""></p>
<h2 id="📌프로젝트-spec과-user-story-개념-정리">📌프로젝트 spec과 user story 개념 정리</h2>
<h3 id="가계부-서비스-spec">가계부 서비스 spec</h3>
<ul>
<li>소비내역을 관리하여 나의 자산현황을 파악하고 이전 기록을 확인하는 목적</li>
<li>main 컨셉<ul>
<li>현재 자산을 관리할 수 있다.</li>
<li>소비내역을 관리할 수 있다.</li>
</ul>
</li>
<li>entity 와 속성<ul>
<li>entity: 식별할 수 있는 대상으로 정리한 것</li>
<li>자산: id, 금액, 최초 생성일자, 수정 일자</li>
<li>소비내역: id, 금액, 카테고리, 내용, 시점금액 생성 일자<h3 id="user-story">User story</h3>
</li>
<li>유저의 목표달성을 위한 인터렉션을 하나의 문장으로 정리한 것</li>
<li>{{사용자}} 는 {{무언가를}} 위해 {{무언가를}} 할 수 있다.<h4 id="main-컨셉에서-디테일하게-세분화">main 컨셉에서 디테일하게 세분화</h4>
</li>
<li>현재 자산을 관리할 수 있다.<ul>
<li>현재 자산을 조회할 수 있다.</li>
<li>현재 자산을 등록할 수 있다.</li>
</ul>
</li>
<li>소비내역을 관리할 수 있다.<ul>
<li>소비내역을 등록할 수 있다.</li>
<li>소비내역을 수정할 수 있다.</li>
<li>소비내역을 삭제할 수 있다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="📌user-flow-정리">📌User flow 정리</h2>
<ul>
<li>user stroy를 기준으로, 구현 시나리오를 정리한 것</li>
<li>원칙<ul>
<li>유저의 행동을 시작으로 시나리오가 시작</li>
<li>유저의 행동에 따른 피드백을 제공해야함</li>
</ul>
</li>
<li>시나리오 성공 case를 먼저 작성</li>
<li>시나리오가 실패되는 case를 나열<ul>
<li>==엣지 케이스</li>
<li>시나리오의 조건들을 나열하고, 조건별로 실패가능한 케이스를 정리<h3 id="가계부-서비스---user-flow">가계부 서비스 - user flow</h3>
</li>
</ul>
</li>
<li>소비내역을 관리할 수 있다. &gt; 소비내역을 등록할 수 있다.</li>
<li>필수 조건: 자산 존재 여부, 자산 금액</li>
<li>성공 시나리오<ul>
<li>유저는 자산이  0원 이상 경우 소비내역을 등록 할 수 있다.</li>
</ul>
</li>
<li>실패 시나리오<ul>
<li>유저는 자산이 0원 미만이면 소비내역을 등록할 수 있다.</li>
<li>유저는 자산보다 많은 금액을 소비내역을 등록할 수 없다.<h3 id="상세-flow--diagram">상세 flow- diagram</h3>
</li>
<li>소비내역을 관리할 수 있다 &gt; 소비내역을 등록할 수 있따.</li>
<li>필수 조건: 자산 존재 여부, 자산 금액</li>
<li>&quot;유저는 자산을 확인한 후, 소비내역을 입력하여, 다시 계산된 자산을 확인할 수 있다.&quot;</li>
</ul>
</li>
</ul>
<h2 id="📌tech-spec">📌tech spec</h2>
<h3 id="tech-flow">tech flow</h3>
<blockquote>
<ol>
<li>서비스에 접근한다.</li>
<li>유저가 액션을 하면, 서비스는 액션을 입력 받는다.</li>
<li>입력받은 데이터를 서버에 저장한다.</li>
<li>현재 자산을 서버로부터 받아온다.</li>
<li>서버로부터 받은 자산 데이터를 화면에 보여준다.</li>
</ol>
</blockquote>
<h4 id="1-서비스에-접근한다">1. 서비스에 접근한다.</h4>
<ul>
<li>구현 목표: 유저가 브라우저에서 화면을 확인할 수 있도록 한다.</li>
<li>필요<ol>
<li>유저가 브라우저에 접근한다.</li>
<li>유저가 확인할 수 있는 화면이 그려진다.</li>
</ol>
</li>
<li>tech flow<ol>
<li>브라우저를 사용하여 서비스 url에 접속한다.</li>
<li>서비스에 필요한 파일을 load 한다.</li>
<li>load한 파일들을 활용하여 화면을 그린다.<h4 id="2-유저가-액션을-하면-서비스는-액션을-입력-받는다">2. 유저가 액션을 하면, 서비스는 액션을 입력 받는다.</h4>
</li>
</ol>
</li>
<li>구현 목표: 유저의 액션을 서비스에서 입력받는다.</li>
<li>필요:<ol>
<li>유저가 액션할 수 있는 ui</li>
<li>유저의 액션을 입력받을 수 있도록 준비</li>
</ol>
</li>
<li>tech flow<ol>
<li>input ui에 키보드로 숫자를 입력한다.</li>
<li>input에 등록된 이벤트가 실행된다.</li>
<li>입력받은 데이터를 브라우저에서 확인할 수 있다.<h4 id="3-입력받은-데이터를-서버에-저장한다">3. 입력받은 데이터를 서버에 저장한다.</h4>
</li>
</ol>
</li>
<li>목표: 유저에게 입력받은 데이터를 서버에 저장</li>
<li>필요<ol>
<li>서버</li>
<li>서버와 브라우저간 통신(api)</li>
</ol>
</li>
<li>tech flow<ol>
<li>유저가 버튼을 클릭</li>
<li>버튼에 등록된 서버 전송 이벤트가 발생</li>
<li>api를 통해 서버에 데이터 저장을 요청</li>
<li>서버는 요청사항이 완료되면, 브라우저에게 알려준다.<h4 id="4-현재-자산을-서버로부터-받아온다">4. 현재 자산을 서버로부터 받아온다.</h4>
</li>
</ol>
</li>
<li>목표: 현재 자산 데이터를 서버로부터 받아온다.</li>
<li>필요:  <ol>
<li>서버</li>
<li>서버와 브라우저가 통신(api)</li>
</ol>
</li>
<li>tech flow<ol>
<li>api를 통해 서버에 데이터 조회를 요청한다.</li>
<li>서버에서 데이터를 응답해준다.<h4 id="5-서버로부터-받은-자산-데이터를-화면에-보여준다">5. 서버로부터 받은 자산 데이터를 화면에 보여준다.</h4>
</li>
</ol>
</li>
<li>목표: 서버로부터 응답받은 데이터를 화면에 보여준다.</li>
<li>필요:<ol>
<li>서버로부터 응답받은 데이터</li>
<li>응답 데이터를 유저가 보기 쉽게 처리하는 로직</li>
<li>유저가 확인할 수 있는 화면 그리기</li>
</ol>
</li>
<li>tech flow<ol>
<li>응답 데이터를 유저가 보기 쉽게 처리</li>
<li>처리된 데이터를 화면에 다시 보여준다</li>
</ol>
</li>
</ul>
<blockquote>
<h3 id="3가지-레이어">3가지 레이어</h3>
</blockquote>
<ul>
<li>웹/유저/서버 간 인터렉션</li>
</ul>
<ol>
<li><p>웹 -&gt; 유저: 화면을 보여준다.(렌더링)</p>
</li>
<li><p>웹 &lt;- 유저: 액션 입력 받을 수 있도록 한다.</p>
</li>
<li><p>웹 -&gt; 서버 : 데이터 조회/저장/수정 요청한다.</p>
<ul>
<li><ol>
<li>웹 &lt;- 서버: 요청사항에 대한 응답을 받는다.</li>
</ol>
</li>
</ul>
<h2 id="📌tech-spec--렌더링">📌Tech Spec- 렌더링</h2>
<h4 id="렌더링">렌더링</h4>
<ul>
<li>기본 렌더링</li>
<li>html 파일에 문서를 작성</li>
<li>최초 파일이 로드, 브라우저에 의해 html 을 읽어, 화면 그림</li>
<li>런타임 때 렌더링</li>
<li>런타임때 js로 렌더링 조작</li>
<li>액션이 있을때 ui를 변경해야하는 case <h4 id="html을-통한-렌더링">html을 통한 렌더링</h4>
</li>
</ul>
</li>
</ol>
<ul>
<li><p>html파일, css 파일, dom의 개념</p>
</li>
<li><p>html</p>
<ul>
<li>hyper text markup language의 약자</li>
<li>웹페이지와 웹사이트의 구조를 구성하는 코드(마크업)</li>
<li>웹을 로드할 때 처음에 로드하는 파일</li>
</ul>
</li>
<li><p>css</p>
<ul>
<li>cascading style sheet</li>
<li>마크업 언어가 실제로 표시되는 방법을 기술하는 스타일 언어</li>
<li>선택자 {...}</li>
</ul>
</li>
<li><p>DOM</p>
<ul>
<li>Document Object Model</li>
<li>html 문서와 상호작용할 수 있는 인터페이스</li>
<li>node와 object로 문서를 표현</li>
<li>트리 구조: 부모/자식의 관계가 형성</li>
<li>렌더링 과정<ul>
<li><ol>
<li>html 마크업 파싱(읽어들이는 과정) - DOM 트리 구축</li>
</ol>
</li>
<li><ol start="2">
<li>css 마크업 파싱 - CSSOM 트리 빌드</li>
</ol>
</li>
<li><ol start="3">
<li>dom 과 cssom을 결합하여 렌더링 트리 형성</li>
</ol>
</li>
<li><ol start="4">
<li>렌더트리 배치</li>
</ol>
</li>
<li><ol start="5">
<li>렌더트리 페인팅</li>
</ol>
</li>
</ul>
</li>
<li>2) 런타임때 렌더링 조작</li>
<li>triggering이 있을때 ui를 변경해야하는 case</li>
<li>런타임때 자바스크립트로 dom을 조작하여 렌더링</li>
<li>리렌더링 - 리페인팅, 재배치 발생 </li>
</ul>
<blockquote>
</blockquote>
<ol>
<li>자바스크립트로 DOM노드 선택</li>
<li>노드 조작<ul>
<li>선택한 노드에 새로운 노드 추가</li>
<li>선택한 노드 수정/삭제</li>
</ul>
</li>
</ol>
<ul>
<li>document 인터페이스를 통해 접근</li>
<li>DOM 노드 선택<ul>
<li>document.querySelector(선택자)</li>
<li>document.querySelector(&quot;.className&quot;)</li>
<li>document.querySelector(&quot;#idName&quot;)</li>
</ul>
</li>
<li>노드 생성<ul>
<li>document.createElement(태그이름)</li>
</ul>
</li>
<li>노드 추가 <ul>
<li>Node.appendChild(Node)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="📌이벤트">📌이벤트</h2>
<blockquote>
<h3 id="유저가-클릭-했을-때-함수를-실행-시키고-싶다">유저가 클릭 했을 때, 함수를 실행 시키고 싶다?</h3>
</blockquote>
<h3 id="eventtarget-객체">EventTarget 객체</h3>
<ul>
<li>이벤트의 대상이 되는 객체가 eventtarget 객체를 구현<ul>
<li>document, window ...</li>
</ul>
</li>
<li>이벤트를 수신할 수 있는 수신기를 가질 수 있음<h3 id="이벤트-유형">이벤트 유형</h3>
</li>
<li>유저와의 상호작용, 기본환경 상태의 변화..</li>
<li>click, focus(input), blur(input)..<h3 id="addeventlistener">addEventListener</h3>
<ul>
<li>Node.addEventListener(이벤트 유형, 콜백함수)</li>
<li>요소를 생성할 때, 이벤트 리스너도 함께 등록</li>
</ul>
</li>
</ul>
<h2 id="📌서버간-통신">📌서버간 통신</h2>
<ul>
<li>데이터 조작을위해 클라이언트와 서버와의 통신이 필요함</li>
<li>서버 통신에는 물리적인 시간 지연이 발생<ul>
<li>요청과 동시에 바로 처리 불가능</li>
<li>요청이후 응답이 오기까지 기다렸다가, 응답 신호를 받아야함</li>
</ul>
</li>
<li>자바스크립트는 이러한 상황에 필요한 처리기가 필요<ul>
<li>콜백 패턴</li>
<li>promise 객체</li>
<li>async- await <h3 id="promise">Promise</h3>
</li>
</ul>
</li>
<li>미래의 어떤 시점에 결과를 제공하겠다는 약속을 의미하는 이름의 Promise객체를 제공</li>
<li>Promise 객체의 3가지 상태<ul>
<li>대기 pending: 수행중</li>
<li>이행 fulfilled: 성공적으로 완료</li>
<li>거부 rejected: 수행이 실패</li>
</ul>
</li>
<li>메서드:<ul>
<li>then: fulfilled 일 경우</li>
<li>catch: reject 일 경우 </li>
</ul>
</li>
</ul>
<h3 id="동기와-비동기">동기와 비동기</h3>
<h4 id="동기">동기</h4>
<ul>
<li>직렬적으로 작업을 수행하는 방식</li>
<li>요청 이후, 응답을 받아야지 다음 동작이 이루어지는 방식</li>
</ul>
<h4 id="비동기">비동기</h4>
<ul>
<li>병렬적으로 작업을 수행하는 방식</li>
<li>요청 이후, 응답수락 여부와 상관없이 다음 작업이 동작하는 방식</li>
</ul>
<h3 id="async--await">async- await</h3>
<ul>
<li>비동기 처리 패턴 중 하나</li>
<li>promise 단점 보안. 가독성을 높임</li>
<li>함수에 async 키워드를 붙여, promise 인스턴스를 반환</li>
<li>await를 promise 인스턴스 앞에 추가하고, 성공처리 이후에 다음 함수 명령문 실행</li>
</ul>
<h2 id="📌프로젝트-셋팅">📌프로젝트 셋팅</h2>
<h3 id="npm">npm</h3>
<ul>
<li>다른이가 만든 코드 패키지를 사용하여, 프로젝트 작업의 시간을 단축,</li>
<li>패키지들의 설치 및 관리가 필요<h3 id="노드-패키지-매니저">노드 패키지 매니저</h3>
<ul>
<li>node.js의 패키지 관리자.</li>
<li>모듈 설치를 관리해주는 역할.<ul>
<li>버전관리, 코드 종속성 관리<h3 id="번들러--의존성-있는-모듈-코드를-하나의-파일로-만들어주는-도구">번들러 : 의존성 있는 모듈 코드를 하나의 파일로 만들어주는 도구</h3>
</li>
</ul>
</li>
</ul>
</li>
<li>html, css, javascript 파일들</li>
<li>개발 편의와 브라우저에서의 최적화 코드간의 형태 차이<ul>
<li>개발 편의: 가독성, 프레임워크 및 라이브러리 사용,</li>
<li>브라우저 최적화: 용량 최적화, 캐싱, 리소스 최적화, 버전 대응...</li>
</ul>
</li>
<li>작업된 코드를 브라우저에 최적화되도록 정리하는 중간 처리기가 필요</li>
<li>대표적인 번들러<ul>
<li>wepack,vite,parcel, ... <h2 id="📌실습">📌실습</h2>
<h3 id="npmhtml-vite-설치">npm,html, vite 설치</h3>
</li>
</ul>
</li>
<li>npm init -y</li>
<li>npm install vite -D<h3 id="sass-설치">Sass 설치</h3>
</li>
<li>npm add -D sass<h3 id="json-server-세팅">json server 세팅</h3>
</li>
<li>npm install -D json-server</li>
<li>npx i axios <h3 id="git-세팅">git 세팅</h3>
</li>
<li>git init</li>
<li>git add .</li>
<li>git commit -m &quot;프로젝트 세팅&quot;</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[GIt 과 Github ]]></title>
            <link>https://velog.io/@qkrtjrwls_/GIt-%EA%B3%BC-Github</link>
            <guid>https://velog.io/@qkrtjrwls_/GIt-%EA%B3%BC-Github</guid>
            <pubDate>Wed, 10 Jan 2024 07:45:56 GMT</pubDate>
            <description><![CDATA[<h1 id="git-과-github">GIt 과 Github</h1>
<h2 id="📌git-버전-관리-시스템">📌Git 버전 관리 시스템</h2>
<h3 id="버전-관리-시스템의-목적">버전 관리 시스템의 목적</h3>
<ul>
<li><p>이력 관리 </p>
<ul>
<li>무언가 잘못됐을 때 돌아가기 </li>
<li>특정 시점 사이의 변화 비교하기 </li>
<li>누가, 왜 수정했는지 파악하기 </li>
</ul>
</li>
<li><p>분기 관리</p>
<ul>
<li>큰 변경 작업을 안전하게 진행하기 </li>
<li>병렬적으로 진행된 작업을 편리하게 통합하기 </li>
<li>종류 : git, mercurial, subversion...<h4 id="git은-분산저장소-버전-관리-시스템">git은 분산(저장소) 버전 관리 시스템</h4>
</li>
</ul>
</li>
<li><p>서버에서도 진행, 컴퓨터에서도 진행 각각 진행한다. </p>
</li>
<li><p>로컬과 서버에 동시 존재한다.</p>
</li>
<li><h4 id="git은-기본-동작으로-최대한-변화를-발생시키지-않으려-한다">git은 기본 동작으로 최대한 변화를 발생시키지 않으려 한다.</h4>
<h4 id="git-저장소-생성-방법">git 저장소 생성 방법</h4>
</li>
<li><p>git init(내 로컬에서 먼저 만드는 것)</p>
</li>
<li><p>git clone(remote 에 있는걸 그대로 복제해오는 것)</p>
<h4 id="commit">commit</h4>
</li>
<li><p>의미 있는 변화 </p>
</li>
<li><p>미래를 위한 보험(현재의 변화를 추적하기 위한 용도)</p>
</li>
<li><p>하나로 만들어놓은 커밋을 3개로 분리하기는 힘듬</p>
</li>
<li><p>3개로 쪼개어 놓은 것을 하나로 합치는 것은 쉬움</p>
</li>
<li><p>가급적이면  쪼개는 것이 낫다.</p>
<h4 id="staging-area">Staging Area</h4>
<h4 id="branch">branch</h4>
</li>
<li><p>분기관리</p>
</li>
<li><p>위험한 작업을 바로 메인에다 올려둘 수 없으니 분리해둠</p>
</li>
<li><p>용도에 따른 분리 </p>
</li>
<li><p>브랜치를 합치는 명령어 merge / bebase</p>
</li>
</ul>
<h2 id="📌github">📌Github</h2>
<h3 id="github에-push하기">github에 push하기</h3>
<h3 id="로컬-저장소에-있는-commit-들을-github에-반영">로컬 저장소에 있는 commit 들을 github에 반영</h3>
<ul>
<li>push 를 해준다.</li>
<li>pull (remote 에 있는걸 rocal로 가져온다.) fetch 후 pull</li>
<li>Branch Workflow<ul>
<li>git flow, gitbhub flow(가장 간단), gitlab flow, trunk-based flow</li>
</ul>
</li>
<li>pull request</li>
</ul>
<h3 id="fork">Fork</h3>
<ul>
<li>(오픈소스에 기여할 때 필수, 협업을 할 때 선택적으로 적용)<h3 id="충돌최대한-적게-하면서-push-하는-방법">충돌최대한 적게 하면서 push 하는 방법</h3>
</li>
<li>pull 을 자주 한다.</li>
<li>두 작업자가 같은 파일을 수정하지 않도록 작업을 나눈다.</li>
<li>작업량 작게 만들기 </li>
</ul>
]]></description>
        </item>
    </channel>
</rss>