<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_lynn.log</title>
        <link>https://velog.io/</link>
        <description>개발 공부한 걸 올립니다</description>
        <lastBuildDate>Wed, 19 Oct 2022 15:04:34 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. dev_lynn.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_lynn" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[LeetCode Rotate Array]]></title>
            <link>https://velog.io/@dev_lynn/LeetCode-Rotate-Array</link>
            <guid>https://velog.io/@dev_lynn/LeetCode-Rotate-Array</guid>
            <pubDate>Wed, 19 Oct 2022 15:04:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_lynn/post/c4ef3ce9-7a41-4a80-aa14-4e1cec8747ab/image.png" alt=""></p>
<h3 id="rotate-array-문제-해결-과정">Rotate Array 문제 해결 과정</h3>
<p>medium, 정답률 39.2%</p>
<p>쉬운 문제인줄 알고 만만하게 봤는데 &#39;In place&#39; 조건이 붙으면서 고민을 해야했던 문제..</p>
<p>처음에 in place 상관 없이 생각한 방법은
nums 배열을 (nums.length-k)부터 (nums.length-1)까지 slice한 배열을 nums 맨 앞에 갖다 붙이는 것이었다.</p>
<p>그 이후 문제를 제대로 읽고 생각했던 로직을 수도코드로 나타내면</p>
<pre><code>while i&lt;k:
    n=nums.length-1번째 요소 제거 후 대입
    nums 맨 앞에 n 삽입
    i++</code></pre><p>이렇게 되었는데.. 시간초과를 만났다.</p>
<pre><code class="language-js">var rotate = function(nums, k) {
   let i=0
   while(i&lt;k){
       let num=nums.splice(nums.length-1,1)
       nums.unshift(num)
       i++
   }
};</code></pre>
<h3 id="힌트를-보고-수정">힌트를 보고 수정</h3>
<p>리트코드 힌트와 다른 사람들이 푼 과정을 살펴보니 배열을 뒤집는 것을 이용했다.
예시 nums=[1,2,3,4,5,6,7] k=3를 살펴보면
처음에 전체 배열을 한 번 뒤집고..
[7,6,5,4,3,2,1]</p>
<p>rotate될 요소가 0번째 부터 k-1번째 까지 있으니 k를 기준으로 나눠서 생각해보면
[7,6,5] // [4,3,2,1]</p>
<p>0~k-1번째 요소들을 뒤집고, k번째부터 마지막 요소까지 뒤집는다.
[5,6,7,1,2,3,4]</p>
<p>하지만 추가 변수를 만들거나 배열 공간을 할당할 수는 없다.
또한 js에서 제공하는 reverse 함수는 전체 배열을 뒤집는것 밖에 할수가 없다.
따라서 인덱스별로 잘라 뒤집을 수 있는 reverse를 직접 구현해야 했다.</p>
<h3 id="reverse-구현">reverse 구현</h3>
<p>배열이 있고 시작 인덱스, 끝 인덱스 변수를 만들어서 구현했다.</p>
<p>[1,2,3,4] 배열이 있고 시작 인덱스 0, 끝은 가장 마지막인 3에서 시작한다.</p>
<p>0번째와 3번째 요소를 swap [4,2,3,1]
시작 변수+1, 끝 변수-1
그다음 1번째와 2번째 요소를 swap한다 [4,3,2,1]
시작 변수+1, 끝 변수-1</p>
<p>시작 인덱스는 2, 끝 인덱스는 1이 되어 swap을 종료한다.</p>
<p>이런식으로 시작 인덱스 변수와 끝 인덱스 변수 값을 증가, 감소시켜 요소 값들을 서로 바꿀 수 있도록 구상했다.</p>
<pre><code class="language-js">function reverse(arr,start,end){
    if(start&lt;0 || end&gt;arr.length || start&gt;=end) return
    let startIdx=start
    let endIdx=end

    while(startIdx&lt;endIdx){
        [arr[startIdx],arr[endIdx]]=[arr[endIdx],arr[startIdx]]
        startIdx+=1
        endIdx-=1
    }
}</code></pre>
<p>swap은 js 구조분해할당을 이용해서 한 줄로 구현,
swap 반복 조건은 while로 작성했다.
이때 start,end가 배열 범위에 벗어나거나 start가 end보다 큰 경우 바로 종료한다.</p>
<h3 id="최종">최종</h3>
<p>reverse 함수 구현을 바탕으로 한 메인함수이다.</p>
<pre><code class="language-js">var rotate = function(nums, k) {
    if(nums.length&lt;=1) return nums
    if(k&gt;=nums.length) k%=nums.length

    reverse(nums,0,nums.length-1)
    reverse(nums,0,k-1)
    reverse(nums,k,nums.length-1)
};</code></pre>
<p>이때 처음에 k 조건을 보지 않고 if문 없이 reverse만 실행했을 때 틀린 답으로 처리됐다. k가 배열 크기보다 커질 수 있어 이 때는 mod 나머지 연산자로 k를 다시 세팅한다.
(문제에서는 규칙을 찾지 못해 틀렸을 때 디버깅하면서 알았다..)</p>
<p>추가로 nums 배열 요소가 하나일 때는 그대로 반환하도록 조건도 달았다.</p>
<p>결과는 
Runtime: 91 ms
Memory Usage: 52.8 MB</p>
<p>특히 소요시간이 98.39% 앞서있다고 해서 기분이 좋았다..ㅋㅋㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[기술 면접 대비:JavaScript]]></title>
            <link>https://velog.io/@dev_lynn/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-JavaScript</link>
            <guid>https://velog.io/@dev_lynn/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-JavaScript</guid>
            <pubDate>Mon, 03 Oct 2022 15:23:53 GMT</pubDate>
            <description><![CDATA[<p>면접을 보면서 점차 보완할 예정입니다.</p>
<h2 id="자바스크립트-특징">자바스크립트 특징</h2>
<blockquote>
<p>객체 기반의 스크립트 언어
동적이고 타입을 명시할 필요가 없다
객체지향,함수형 프로그래밍 모두 지원
싱글스레드 언어-&gt;콜스택이 하나</p>
</blockquote>
<h2 id="브라우저에서-언제-비동기적으로-동작하는가">브라우저에서 언제 비동기적으로 동작하는가?</h2>
<blockquote>
<p>콜스택에서 바로 호출되지 않고 태스크큐를 거치는 경우 (ajax 같은 http request, setTimeout, 이벤트 리스너 동작 등)</p>
</blockquote>
<h2 id="자바스크립트-엔진-동작-원리">자바스크립트 엔진 동작 원리</h2>
<blockquote>
<ol>
<li>자바스크립트 코드를 보고 태스크를 콜스택으로 보낸다</li>
<li>비동기적으로 처리해야하는 태스크가 들어오면 web api(백그라운드) 부분으로 보내짐</li>
<li>web api에서 처리된 태스크는 태스크큐로 보내진다</li>
<li>이벤트루프가 콜스택이 현재 비어있는지(=실행 중인 태스크가 없는지) 확인하고 태스크큐에 있던 태스크를 콜스택으로 보낸다.</li>
</ol>
</blockquote>
<h2 id="이벤트-루프">이벤트 루프</h2>
<blockquote>
<p>자바스크립트 엔진과 실행환경을 상호 연동해주는 장치</p>
</blockquote>
<h2 id="호이스팅">호이스팅</h2>
<blockquote>
<p>변수나 함수의 선언부만 코드 최상단으로 끌어올리는 것을 말한다.</p>
</blockquote>
<h3 id="호이스팅을-막기-위해서는">호이스팅을 막기 위해서는?</h3>
<blockquote>
<p>var대신 let,const 키워드를 사용한다.
함수를 선언할 때 선언식은 사용하지 말고 표현식, 화살표 함수 형태로 할당한다.</p>
</blockquote>
<h2 id="클로저">클로저</h2>
<blockquote>
<p>함수가 속한 렉시컬 스코프를 기억해서 함수가 렉시컬 스코프 밖에서 실행 되어도 그 스코프에 접근할 수 있도록 하는 것</p>
</blockquote>
<h2 id="스코프-및-렉시컬-스코프">스코프 및 렉시컬 스코프</h2>
<blockquote>
<p>변수나 함수 호출시 식별자를 사용하는데 그 식별자를 검색하는 일종의 매커니즘을 스코프라 하고,
렉시컬 스코프란 변수,함수,블록 스코프를 어디에 작성했는가에 따라 정해지는 스코프.</p>
</blockquote>
<h2 id="this">this</h2>
<h3 id="바인딩">바인딩</h3>
<blockquote>
<p>클래스형 컴포넌트에서 this 주체가 바뀌는 경우가 발생. 바인딩을 하거나 화살표 함수로 바뀌면 주체가 바뀌는 일을 막을 수 있다.</p>
</blockquote>
<h3 id="바인딩-방법">바인딩 방법</h3>
<blockquote>
<p>new를 사용하면 해당 객체로 바인딩됨
call,apply,bind를 사용해서 명시적 바인딩 사용
객체의 메소드로 호출하면 해당 객체에 바인딩됨
strict mode의 경우 undefined로 초기화된다
일반 브라우저면 window 객체에 바인딩됨</p>
</blockquote>
<h2 id="이벤트-전파">이벤트 전파</h2>
<blockquote>
<p>이벤트가 발생했을 때 브라우저가 이벤트를 실행시킬 요소를 결정하는 과정을 말한다. 전파 종류에는 버블링, 캡쳐링 2가지가 있다.</p>
</blockquote>
<h3 id="이벤트-버블링-캡쳐링">이벤트 버블링, 캡쳐링</h3>
<blockquote>
<p>이벤트 버블링은 하위 요소에서 상위 요소로 전파되는 것을 의미하고 캡쳐링은 상위 요소에서 하위 요소로 전파된다.
이때 기본 동작 방식은 이벤트 버블링이다.</p>
</blockquote>
<h2 id="이벤트-위임">이벤트 위임</h2>
<blockquote>
<p>하위 요소에서 이벤트 핸들러를 지정하지 않아도 상위 요소에 이벤트 핸들러를 달아 하위 요소들을 제어하는 것을 말한다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[기술 면접 대비:데이터베이스(DB)]]></title>
            <link>https://velog.io/@dev_lynn/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-db</link>
            <guid>https://velog.io/@dev_lynn/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-db</guid>
            <pubDate>Mon, 03 Oct 2022 09:40:32 GMT</pubDate>
            <description><![CDATA[<p>개인적으로 연습하기 위해 간단하게 단답형으로 암기하면서 작성했음을 미리 알립니다. 면접을 보면서 점차 보완할 예정입니다.</p>
<h2 id="빅데이터의-3대-요소--3v">빅데이터의 3대 요소 = 3V</h2>
<blockquote>
<p>variety(다양성), volume(크기,규모), velocity(속도)</p>
</blockquote>
<h2 id="엔티티-테이블">엔티티, 테이블</h2>
<blockquote>
<p>엔티티는 저장하고 관리되는 데이터의 집합을 의미하며 실제로 존재하지 않습니다.
테이블은 엔티티와 다르게 물리적으로 실재하는 데이터 저장 공간입니다.
이때 엔티티들의 관계를 나타낸 다이어그램이 ERD입니다.</p>
</blockquote>
<h2 id="도메인-스키마-릴레이션-뷰">도메인, 스키마, 릴레이션, 뷰</h2>
<blockquote>
<p>도메인은 <strong>속성</strong>의 값이 가질 수 있는 범위를 의미합니다.
스키마는 데이터베이스의 구조와 제약조건의 정보를 담고있는 기본적인 구조를 말합니다.
릴레이션은 관계형 데이터베이스에서 정보를 구분하여 저장하는 기본 단위입니다.
뷰는 하나 이상의 물리 테이블에서 유도되는 가상의 테이블 개념입니다.</p>
</blockquote>
<h2 id="인덱스">인덱스</h2>
<h3 id="인덱스가-무엇입니까">인덱스가 무엇입니까?</h3>
<blockquote>
<p>데이터베이스에서 값에 대한 주소 정보를 가지는 자료 구조를 인덱스라고 합니다.</p>
</blockquote>
<h3 id="인덱스를-왜-사용하며-무엇이-좋습니까">인덱스를 왜 사용하며 무엇이 좋습니까?</h3>
<blockquote>
<p>검색 연산의 최적화를 위해 주로 사용됩니다. 데이터 조회할 때 속도를 높이기 때문입니다.</p>
</blockquote>
<h2 id="기본키와-외래키">기본키와 외래키</h2>
<blockquote>
<p>기본키는 릴레이션의 대표키입니다. 이 기본키를 이용해서 외래키를 통해 다른 릴레이션을 참조할 수 있습니다. 외래키는 다른 릴레이션의 기본키를 참조하는 키를 말합니다.</p>
</blockquote>
<h2 id="정규화반정규화">정규화,반정규화</h2>
<blockquote>
<p>데이터 중복 등의 이상현상을 없애기 위해 <strong>릴레이션</strong>을 분해하는 것을 말합니다. 반정규화는 데이터베이스의 관리를 편하게 하기 위해 데이터 중복,통합,분리 등의 작업을 하는 것입니다. 의도적으로 정규화를 위배하는 과정입니다.</p>
</blockquote>
<h2 id="무결성">무결성</h2>
<h3 id="무결성에-대해-말해보고-무결성-제약-조건에-대해서도-설명해보세요"><strong>무결성</strong>에 대해 말해보고 <strong>무결성 제약 조건</strong>에 대해서도 설명해보세요.</h3>
<blockquote>
<p>데이터 <strong>결함 없이</strong> 정확하고 일관되게 유지되는 성질을 무결성이라고 합니다.
무결성 제약 조건은 데이터의 정확성과 일관성을 보장하기위해 데이터베이스 저장,수정,삭제의 제약을 건 조건입니다.</p>
</blockquote>
<h2 id="트랜잭션">트랜잭션</h2>
<h3 id="트랜잭션에-대해-설명해보세요">트랜잭션에 대해 설명해보세요.</h3>
<blockquote>
<p>데이터베이스 시스템에서 하나의 논리적 기능을 수행하기 위한 작업의 기본 단위를 의미합니다.</p>
</blockquote>
<h3 id="트랜잭션의-특성은-무엇입니까">트랜잭션의 특성은 무엇입니까?</h3>
<blockquote>
<p> 트랜잭션 특성은 크게 원자성,일관성,고립성,지속성 4가지가 있습니다.</p>
</blockquote>
<ol>
<li>원자성은 트랜잭션의 연산이 모두 성공하거나 실패해야한다는 점<ol start="2">
<li>일관성은 시스템이 가지고 있는 고정 요소는 트랜잭션 수행 전 후 상태가 같아야 하는 점</li>
<li>고립성은 동시에 실행되고 있는 트랜잭션들이 서로 영향을 미치지 않는다는 점</li>
<li>지속성은 성공이 완료된 트랜잭션의 결과는 지속적(영속적)으로 데이터베이스에 저장되어야 한다는 점입니다.</li>
</ol>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[기술 면접 대비:Java]]></title>
            <link>https://velog.io/@dev_lynn/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-java</link>
            <guid>https://velog.io/@dev_lynn/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-java</guid>
            <pubDate>Mon, 03 Oct 2022 09:07:55 GMT</pubDate>
            <description><![CDATA[<p>개인적으로 연습하기 위해 간단하게 단답형으로 암기하면서 작성했음을 미리 알립니다. 면접을 보면서 점차 보완할 예정입니다.</p>
<h2 id="자바의-특징에-대해-말해보세요"><strong>자바의 특징</strong>에 대해 말해보세요.</h2>
<blockquote>
<p>객체지향프로그래밍(OOP)을 지원하며 
OOP의 특성으로는 다형성,추상화,캡슐화(은닉),상속이 대표적입니다.
(다형성은 한 객체가 여러 타입을 가질 수 있는 것)
가비지 컬렉터를 이용해서 자동으로 메모리를 관리합니다.
운영체제에 독립적입니다.
멀티스레드를 지원합니다.(이는 싱글스레드인 자바스크립트와 반대)</p>
</blockquote>
<h2 id="프로세스와-스레드에-대해-각각-설명해보세요"><strong>프로세스</strong>와 <strong>스레드</strong>에 대해 각각 설명해보세요.</h2>
<blockquote>
<p>프로세스는 운영체제에서 시스템 자원을 할당받는 작업 단위를 의미하고
스레드는 프로세스 내에서 실행되는 흐름 단위를 말합니다.</p>
</blockquote>
<p>-&gt; 프로세스, 스레드 질문은 운영체제에서 다시 한 번 정리해야겠다!</p>
<h2 id="클래스-객체-인스턴스에-대해-각각-설명해보세요-뭐가-다른가"><strong>클래스</strong>, <strong>객체</strong>, <strong>인스턴스</strong>에 대해 각각 설명해보세요. 뭐가 다른가?</h2>
<blockquote>
<p>클래스는 객체를 설계하는데 필요한 설계도,틀을 말하고
객체는 구현할 대상을 의미합니다. 클래스의 인스턴스입니다.
인스턴스는 클래스를 바탕으로 구현된 실체를 의미합니다.</p>
</blockquote>
<h2 id="인터페이스-추상클래스에-대해-설명해보세요"><strong>인터페이스</strong>, <strong>추상클래스</strong>에 대해 설명해보세요.</h2>
<blockquote>
<p>인터페이스는 객체를 어떻게 구성할지에 대한 설계도를 말하고 추상클래스는 상속을 위한 클래스로서 인터페이스보다 추상적입니다.</p>
</blockquote>
<h2 id="오버라이딩과-오버로딩은-무엇이-다릅니까"><strong>오버라이딩</strong>과 <strong>오버로딩</strong>은 무엇이 다릅니까?</h2>
<blockquote>
<p>오버라이딩은 상속에서 사용되는 개념으로서 부모 메소드를 자식 메소드에서 재정의하는 것을 의미합니다. 오버로딩은 같은 이름의 메소드를 여러개 정의하는 것을 말합니다. 이때 매개변수의 타입이나 개수가 달라야 합니다.</p>
</blockquote>
<h2 id="final은-무엇입니까"><strong>final</strong>은 무엇입니까?</h2>
<blockquote>
<p>변수와 메소드,클래스 등에서 사용할 수 있는 키워드입니다.
변수에서 final을 사용하면 변경이 불가능한 상수가 됩니다. 메소드에서 사용하게 되면 상속받은 클래스에서 이 메소드를 오버라이딩할 수 없습니다.
클래스에서 사용하면 상속 자체가 불가능합니다.</p>
</blockquote>
<h2 id="예외와-에러의-차이는-무엇입니까"><strong>예외</strong>와 <strong>에러</strong>의 차이는 무엇입니까?</h2>
<blockquote>
<p>에러는 시스템적으로 발생하는 치명적인 오류로서 메모리 용량 초과, 스택오버플로우 등이 있습니다. 반면 예외는 개발자가 처리 가능한 수준의 오류입니다. 자바에서는 try-catch 중 catch 구문에서 예외처리가 가능합니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[원티드 프리온보딩 사전과제 회고]]></title>
            <link>https://velog.io/@dev_lynn/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-%EC%82%AC%EC%A0%84%EA%B3%BC%EC%A0%9C-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@dev_lynn/%EC%9B%90%ED%8B%B0%EB%93%9C-%ED%94%84%EB%A6%AC%EC%98%A8%EB%B3%B4%EB%94%A9-%EC%82%AC%EC%A0%84%EA%B3%BC%EC%A0%9C-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Fri, 09 Sep 2022 01:35:44 GMT</pubDate>
            <description><![CDATA[<p>사전과제 제출 깃허브 링크
<a href="https://github.com/hlezg08/wanted-pre-onboarding-fe">https://github.com/hlezg08/wanted-pre-onboarding-fe</a>
-&gt;readme에 데모 영상, 요구사항이 있습니다</p>
<h2 id="1-프로젝트-기본-설명">1. 프로젝트 기본 설명</h2>
<p>수행 기간 : 2022.08.18~20</p>
<h3 id="사용-라이브러리-설명">사용 라이브러리 설명</h3>
<ul>
<li>Language : TypeScript 사용을 고민했으나 단기간에 완성을 목표로만 하여 넣지 못함</li>
<li>CSS in JS - emotion : js로 관리할 수 있는 css in js 라이브러리 중 하나를 사용하고 싶었고 이용자 수
가 많은 styled-components와 고민. 두 라이브러리가 큰 차이가 없다고 생각해서 그나마 사용 경험이
있는 emotion을 선택</li>
<li>API - fetch가 아닌 axios : fetch는 응답받은 결과에 대해 json으로 다시 변환해야하지만 axios 라이브
러리는 변환할 필요 없이 간편해서 고름</li>
<li>Route - react router dom : next.js의 useRouter를 이용해서 페이지 라우팅을 구현해본 적이 있었지만
react만을 이용한 라우팅 구현 경험이 없었음. 고민하던 중 이용자수가 많은 것을 선택</li>
</ul>
<h3 id="폴더-구조">폴더 구조</h3>
<pre><code>/src
├── assets
├── components
│ ├── commons
│ └── units
│ ├──signin
│ ├──signup
│ └──todo
├── pages
├── styles
├── App.js
└── index.js</code></pre><h2 id="2-프로젝트-개인-리뷰">2. 프로젝트 개인 리뷰</h2>
<h3 id="good">GOOD</h3>
<ul>
<li>페이지 기준으로 컴포넌트를 분리</li>
<li>container-presenter 패턴으로 추가 분리 → 상태 관리, api 요청, props 및 UI에 대한 경계가 명확
해지면서 가독성 향상됨</li>
<li>투두리스트에 대해 리스트의 각 아이템을 다시 분리했고 이 덕분에 수정 상태의 관리가 쉬워졌음</li>
<li>투두리스트 update request을 이용해서 완료 표시도 체크박스로 가능하게 만들었음</li>
</ul>
<h3 id="bad">BAD</h3>
<ul>
<li>공통으로 사용되는 버튼이나 인풋을 공통 컴포넌트로 분리하지 못한 점</li>
<li>액세스토큰을 전역 상태로 관리하고 싶었으나 라이브러리 사용에 제약 있을까봐 아예 넣지 않은 점</li>
<li>api request 이후 컴포넌트 변경 사항에 대해 변경 부분만 리렌더링하는 대신 새로고침(리로드)</li>
<li>이메일,비밀번호 유효성 검사에 대해 스타일 변화나 에러 문구 X (input placeholder만 보여줌)</li>
</ul>
<h2 id="3-보완하면-좋을-점">3. 보완하면 좋을 점</h2>
<ul>
<li>작은 프로젝트지만 타입스크립트 사용</li>
<li>api request 부분을 함수 형태로 분리</li>
<li>전역 상태로 액세스토큰을 관리했으면 좋았을거 같다</li>
<li>공통 컴포넌트 분리</li>
<li>이메일, 비밀번호 유효성 검사 문구 추가로 표시 (에러 메세지 등)</li>
<li>컴포넌트 변경시 새로고침(리로드)하지 말고 바뀐 부분만 리렌더링</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript에서 타입 잡아주기(1)]]></title>
            <link>https://velog.io/@dev_lynn/TypeScript%EC%97%90%EC%84%9C-%ED%83%80%EC%9E%85-%EC%9E%A1%EC%95%84%EC%A3%BC%EA%B8%B0-1</link>
            <guid>https://velog.io/@dev_lynn/TypeScript%EC%97%90%EC%84%9C-%ED%83%80%EC%9E%85-%EC%9E%A1%EC%95%84%EC%A3%BC%EA%B8%B0-1</guid>
            <pubDate>Thu, 28 Jul 2022 16:18:58 GMT</pubDate>
            <description><![CDATA[<h2 id="instance-type">Instance Type</h2>
<h4 id="try-catch-구문에서-catch-error의-타입">try-catch 구문에서 catch error의 타입</h4>
<p><img src="https://velog.velcdn.com/images/dev_lynn/post/09d0f908-980d-4e49-b04d-25acac94ccdd/image.png" alt=""></p>
<h4 id="eventtarget-instance">event.target instance</h4>
<p><img src="https://velog.velcdn.com/images/dev_lynn/post/ee61aeed-bce0-4226-9dcc-114d0997d4e9/image.png" alt=""></p>
<p>위와 같이 작성해주는 것이 좋다.</p>
<h2 id="event-type">Event Type</h2>
<h4 id="img-태그-onerror-속성의-event-type">img 태그 onError 속성의 event type</h4>
<pre><code class="language-ts">onError={(event) =&gt; {
     if (event.target instanceof HTMLImageElement)
        event.target.src = &quot;에러가 났을때 넣는 이미지 src&quot;;
}}</code></pre>
<h4 id="마우스로-인해-발생하는-event-type">마우스로 인해 발생하는 event type</h4>
<pre><code class="language-ts">const onClickMouseEvent=(event: MouseEvent&lt;HTMLDivElement&gt;)=&gt;{
    // 함수 내용
}</code></pre>
<p>&lt;&gt;안에는 어떤 요소에서 마우스 이벤트가 발생하는지 명시
예를 들어 HTMLDivElement는 div 태그에서 마우스 이벤트가 발생함을 뜻한다.</p>
<h4 id="onchange-event-type">onChange Event type</h4>
<pre><code class="language-ts">const onChangeInput=(event:ChangeEvent&lt;HTMLInputElement&gt;)=&gt;{
    // 함수 내용
}</code></pre>
<p>next.js로 프로젝트를 만들지 않으면 React.ChangeEvent와 같이 써야하지만 나의 경우엔 next.js를 사용했으므로 패스!</p>
<p><del>사실 코드에서 커서 갖다대면 타입 나오긴 합니다..</del></p>
<h2 id="props-type">Props Type</h2>
<h4 id="useref-props-넘겨줘야-할-때-쓰는-type">useRef props 넘겨줘야 할 때 쓰는 type</h4>
<pre><code class="language-ts">// 예시
navRef: MutableRefObject&lt;HTMLDivElement&gt;;</code></pre>
<p>MutableRefObject를 써주고 제네릭에 어떤 element 타입인지 적어주면 끝.</p>
<h4 id="react-hook-form-props-type">react-hook-form props type</h4>
<pre><code class="language-ts">register: UseFormRegister&lt;FieldValues&gt;;
handleSubmit: UseFormHandleSubmit&lt;FieldValues&gt;;
formState: FormState&lt;FieldValues&gt;;</code></pre>
<p>물론 FileValues도 어떤 값들을 인풋으로 받는지 타입을 설정해줘야 하지만.. 1차적으로 any를 사용하지 않고 props type을 넘겨주는 방법 중 하나이다.</p>
<h4 id="usestate에서-setstate-props-type">useState에서 setState props type</h4>
<p>state 변수 타입이 boolean이면 &lt;&gt;안에 다음과 같이 적는다.</p>
<pre><code class="language-ts">import { Dispatch, SetStateAction, useState } from &quot;react&quot;;
Dispatch&lt;SetStateAction&lt;boolean&gt;&gt;;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Warning: A component is changing an uncontrolled input to be controlled. 해결법]]></title>
            <link>https://velog.io/@dev_lynn/Warning-A-component-is-changing-an-uncontrolled-input-to-be-controlled</link>
            <guid>https://velog.io/@dev_lynn/Warning-A-component-is-changing-an-uncontrolled-input-to-be-controlled</guid>
            <pubDate>Thu, 28 Jul 2022 15:53:09 GMT</pubDate>
            <description><![CDATA[<p>Warning: A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. </p>
<h3 id="원인">원인</h3>
<p>해당 컴포넌트는 제어되지 않고 변하는 컴포넌트 즉,비제어 컴포넌트이다. 
undefined 값이 들어올 때 발생할 수 있는 문제.</p>
<p>에러는 아니고 경고 수준이지만 컴포넌트가 렌더링 되었을 때 모든 경우에 대비하는 것이 중요하다고 생각했다.</p>
<h3 id="해결법">해결법</h3>
<p>값이 undefined일때 || 연산자 등으로 조건부 렌더링하기</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. 해결법]]></title>
            <link>https://velog.io/@dev_lynn/Error-Element-type-is-invalid-expected-a-string-for-built-in-components-or-a-classfunction-for-composite-components-but-got-undefined</link>
            <guid>https://velog.io/@dev_lynn/Error-Element-type-is-invalid-expected-a-string-for-built-in-components-or-a-classfunction-for-composite-components-but-got-undefined</guid>
            <pubDate>Thu, 28 Jul 2022 15:49:24 GMT</pubDate>
            <description><![CDATA[<p>Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it&#39;s defined in, or you might have mixed up default and named imports.</p>
<h3 id="원인">원인</h3>
<p>components의 이름이 잘못되었거나, import 경로가 잘못 입력되었을때 발생
페이지에 들어가는 컴포넌트 함수를 만들지 않고, 메인페이지에서 렌더시켰더니 발생했다.</p>
<h3 id="해결책">해결책</h3>
<ul>
<li>import된 파일의 경로와 이름을 하나씩 확인</li>
<li>혹시 함수가 만들어지지 않은 빈 페이지를 연결한건 아닌지 확인</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript tsconfig.json 다루기]]></title>
            <link>https://velog.io/@dev_lynn/TypeScript-tsconfig.json</link>
            <guid>https://velog.io/@dev_lynn/TypeScript-tsconfig.json</guid>
            <pubDate>Thu, 28 Jul 2022 15:39:04 GMT</pubDate>
            <description><![CDATA[<p>TypeError가 뜨는데 해결하기도 어렵고.. 빌드는 해야겠고 막막할때 tsconfig.json에서 몇가지 설정을 넣으면 해결할 수 있다.</p>
<p>대소문자 다를 때 구분하려면</p>
<pre><code> &quot;forceConsistentCasingInFileNames&quot;: true</code></pre><p>개체가 &#39;undefined&#39;인거 같습니다 에러나오면</p>
<pre><code>&quot;strictNullChecks&quot;: false</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[Eslint Warning 없애는 법]]></title>
            <link>https://velog.io/@dev_lynn/Eslint-Warning</link>
            <guid>https://velog.io/@dev_lynn/Eslint-Warning</guid>
            <pubDate>Thu, 28 Jul 2022 15:36:11 GMT</pubDate>
            <description><![CDATA[<h2 id="the-nextjs-plugin-was-not-detected-in-your-eslint-configuration-또는-warning-react-version-not-specified-in-eslint-plugin-react-settings--경고가-뜰-때-해결법">The Next.js plugin was not detected in your ESLint configuration 또는 Warning: React version not specified in eslint-plugin-react settings.  경고가 뜰 때 해결법!</h2>
<p>(참고 링크 : <a href="https://github.com/vercel/next.js/discussions/28485">https://github.com/vercel/next.js/discussions/28485</a>)</p>
<p>.eslint.json 파일 삭제 후
.eslint.js에 다음 소스코드 첨부</p>
<pre><code>settings: {
    react: {
      version: &quot;detect&quot;,
    },
  },</code></pre><p>하지만 이렇게 해도 npx eslint . 를 실행했을때 타입스크립트(tsx,ts) 파일들은 에러가 보이지 않는다. 여전히 npx eslint &quot;<em>*/</em>.tsx&quot;로 실행해야 한다.</p>
<h4 id="타입스크립트-에러는-보이지-않는-이유">타입스크립트 에러는 보이지 않는 이유!</h4>
<p><a href="https://pravusid.kr/typescript/2020/07/19/typescript-eslint-prettier.html">https://pravusid.kr/typescript/2020/07/19/typescript-eslint-prettier.html</a></p>
<p>위 사이트로 살펴본 결과,
기본적으로 eslint는 js만 찾아낸다고 한다.</p>
<p>그래서 tsx,ts 에러까지 확인하려면</p>
<pre><code>npx eslint --ext .js,.ts,.tsx src</code></pre><p>또는</p>
<pre><code>npx eslint src/**/*</code></pre><p>라고 작성하는 것이 맞다.</p>
<p>물론 여기에 작성한 명령어 디렉토리 기준은 src이므로 pages나 src 외에 벗어나는 디렉토리에 대해서는 다르게 작성해야 한다.</p>
<p>2달 동안 매달린건 아니지만.. 항상 궁금했던 eslint 문제가 해결돼서 뿌듯하다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[팀프로젝트 1주차 회고]]></title>
            <link>https://velog.io/@dev_lynn/team-project-week1</link>
            <guid>https://velog.io/@dev_lynn/team-project-week1</guid>
            <pubDate>Sun, 10 Jul 2022 14:53:27 GMT</pubDate>
            <description><![CDATA[<p>팀 프로젝트 주제는 행사 open api DB를 이용한 행사 정보 소개 및 동행자를 구하는 커뮤니티 사이트로 정했다.
여행 동행자 구하는 것과 굉장히 유사할 예정..</p>
<h3 id="기획과-디자인에서-난관">기획과 디자인에서 난관..</h3>
<p>디자이너가 없어서 실제 서비스와 가깝게 디자인하는게 너무 어렵다.
팀원들이 각자 디자인을 하다보니 통일성이 없고 제각각이 되어 결국 다시 디자인을 진행하기로 했다.</p>
<p>와이어프레임과 퍼블리싱 디자인을 직접해야하다보니 figma 사용법을 익힐 수 밖에 없었다. 처음엔 오래걸리고 헤맸는데 유튜브 동영상을 보면서 하다보니까 마지막엔 조금 익숙해졌다. </p>
<p>제일 도움된 영상</p>
<ol>
<li><a href="https://www.youtube.com/watch?v=ESxsgBYuMB8">https://www.youtube.com/watch?v=ESxsgBYuMB8</a></li>
</ol>
<p>2.연정 디자이너님 유튜브
<a href="https://www.youtube.com/watch?v=GsZk8s5JdWg">https://www.youtube.com/watch?v=GsZk8s5JdWg</a></p>
<p>통일성 있는 디자인을 위해 기존 사이트 참고를 많이 했다
주제가 행사 정보 보여주기+동행구하는 커뮤니티 사이트라서 주로 여행플랫폼, 웹사이트를 참고했다.
(마이리얼트립,트립소다,...)</p>
<p>그 외에도 상품 판매 및 결제를 위해 쇼핑몰 사이트도 참고하며 ui를 제작했다.</p>
<h3 id="퍼블리싱-개선">퍼블리싱 개선</h3>
<p>1주차는 Mock-Up 만들기를 위한 퍼블리싱이 주가 되어 고도화된 코드를 짜진 않았지만 더 나은 style을 위해 기존에 짜던 코드보다 개선하려고 노력했다.</p>
<ul>
<li>네비게이션 바를 만들고 스크롤을 해도 최상단에 위치하도록 만들기</li>
<li>사이드바 고정 fixed와 sticky 중에 고민-&gt;
<code>position: -webkit-sticky;
position: sticky;</code> 가 가장 적합해서 sticky로 확정</li>
<li>네비게이션 바에서 탭을 누를 때 특정 스크롤 위치로 이동하도록 만들기</li>
<li>fetch해올 정보가 많을 때는(그리 많지 않은데도..) next.js 렌더링 속도가 너무 느림-&gt;개선 필요</li>
<li>리액트 lifecycle(useEffect 사용), 가상 DOM(useRef)을 적용은 했지만 더 이해 필요</li>
<li>grid 스타일 반응형 디자인<ul>
<li>grid-template-columns 속성을 잘 사용하자</li>
<li>grid-gap으로 요소 간의 간격을 조절할 수 있다.</li>
</ul>
</li>
</ul>
<pre><code class="language-js">export const GridWrapper = styled.div`
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  grid-gap: 1.25rem;
  @media screen and (max-width: 767px) {
    grid-gap: 0.625rem;
  }
`;</code></pre>
<p>(이런식으로 조절해봤다. 모바일 사이즈에서는 grid-gap을 더 좁게 설정했다)</p>
<ul>
<li>이미지 반응형+정사각형으로 만들기<pre><code class="language-js">export const ImageWrapper = styled.div`
width: 100%;
position: relative;
::after {
  display: block;
  content: &quot;&quot;;
  padding-bottom: 100%;
}
:hover {
  cursor: pointer;
}
`;
export const Image = styled.img`
position: absolute;
width: 100%;
height: 100%;
`;</code></pre>
</li>
</ul>
<h3 id="그-외">그 외</h3>
<p>기능적인 면에서 동행 커뮤니티에 실시간 채팅 기능을 넣고 싶어서 간단하게나마 강의를 들으며 공부중이다. socket.io가 JS에서 써먹기 좋을거 같아서 비교적 간단하게 만들 수 있을거 같다는 느낌이 든다! CRUD API 적용이 어느정도 될때쯤 바로 채팅 구현을 시작해봐야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git으로 협업하기]]></title>
            <link>https://velog.io/@dev_lynn/git-flow</link>
            <guid>https://velog.io/@dev_lynn/git-flow</guid>
            <pubDate>Sat, 02 Jul 2022 11:52:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://techblog.woowahan.com/wp-content/uploads/img/2017-10-30/git-flow_overall_graph.png" alt="https://techblog.woowahan.com/wp-content/uploads/img/2017-10-30/git-flow_overall_graph.png"></p>
<p>(사진 출처 : <a href="https://techblog.woowahan.com">https://techblog.woowahan.com</a>)</p>
<p>이제 더이상 master(=main)에서만 작업하지 말자!!
브랜치 이름은 반드시 정해져있는건 아니지만 실무에서 통상적으로 이렇게 나눠서 쓴다.</p>
<ol>
<li><p><span style="color:blue">develop(=dev)</span>
개발시 메인이 되는 브랜치</p>
</li>
<li><p><span style="color:blue">feature</span>
세부 기능을 구현할 때</p>
</li>
</ol>
<ul>
<li>develop에서만 개발하지 않고 기능별로 feature 브랜치를 생성→develop에 merge (ex: 게시판 목록 브랜치 생성 후 이동<code>git checkout -b feature-boards</code>)</li>
<li>git issue에서 어떤 기능을 구현할지 적고 그 이슈번호를 feature에 적으면 구분하기 쉽다.
(ex: 이슈 번호가 20번-&gt; <code>git checkout -b feature-#21</code></li>
</ul>
<ol start="3">
<li><span style="color:blue">master</span>
개발이 끝나고 배포할 때</li>
<li><span style="color:blue">release </span>
기능 구현이 끝나고 버그만 잡을 때 이용
develop에서 release로 브랜치 이동한 뒤 디버깅이 끝나면 master로 합치기</li>
<li><span style="color:blue">hotfixes </span></li>
</ol>
<p><strong>배포 후</strong> 생각지 못한 긴급 버그가 발생했을 때 이용
hotfixes 브랜치에서 디버깅→다시 master로 합치기</p>
<h2 id="브랜치-명령어">브랜치 명령어</h2>
<p>브랜치 이동
<code>git checkout 이미있는브랜치이름</code></p>
<p>브랜치 생성하고 그 브랜치로 이동 
<code>git checkout -b develop</code>
(예시: develop 브랜치로 이동)</p>
<p>모든 브랜치와 현재 위치해있는 브랜치 확인
<code>git branch</code>
<img src="https://velog.velcdn.com/images/dev_lynn/post/22d1f6e7-d69f-4faf-ab3e-e2a47daa0c5a/image.png" align="left"/><br/></p>
<p>브랜치 삭제
<code>git branch -D 삭제할브랜치이름</code></p>
<h2 id="팀에서의-git-프로세스">팀에서의 git 프로세스</h2>
<ol>
<li><p>팀장은 팀 레파지토리 master에 초기 보일러플레이트를 push하고 develop으로 옮기기
(이 때, 개인은 팀 레파지토리에 접근할 수 없도록)</p>
</li>
<li><p>팀원은 팀 레파지토리를 fork 하고 git clone한다.</p>
</li>
<li><p>remote 등록하기
<code>git remote add upstream 팀레파지토리주소</code></p>
</li>
<li><p>팀원들은 각자 다른 기능을 맡아 서로 다른 파일에서 작업한 뒤 push한다.
이때 develop 내용을 따와서 feature에서 작업해야 한다.
같은 파일을 두 명이상 작업하고 있으면 안된다.</p>
</li>
</ol>
<ul>
<li>develop에서 <code>git checkout -b feature-#이슈번호</code></li>
<li><code>git add .</code></li>
<li><code>git commit -m &quot;커밋 메세지&quot;</code></li>
<li><code>git push origin feature-#이슈번호</code></li>
</ul>
<ol start="5">
<li>팀 레파지토리에 pull request를 보낸다. 이후 코드확인 뒤 팀장이 merge (다같이 확인 후 merge 예정!)</li>
</ol>
<hr>
<ol start="6">
<li>각 팀원들은 각 기능 구현이 완료된 코드를 받은 뒤 작업한다.
팀 develop 코드를 받아오기 <code>git pull upstream develop</code>
이때 본인의 develop(또는 master)에서 받아와야 한다.</li>
</ol>
<h2 id="주의점">주의점</h2>
<ol>
<li>같은 기능을 두 명 이상 같이 개발하면 안됨 (merge시 충돌 위험성이 있음)</li>
<li>하루에 두번이상 Pull Request(PR)날릴 때 각 PR이 의존되면 안됨</li>
<li>가급적 최소 1일 1 PR하기</li>
<li>공통기능은 한명이 맡고 잘 구현되어야 함 (예: 로그인)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로그래머스 완주하지 못한 선수]]></title>
            <link>https://velog.io/@dev_lynn/programmers-1</link>
            <guid>https://velog.io/@dev_lynn/programmers-1</guid>
            <pubDate>Sat, 02 Jul 2022 10:58:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_lynn/post/601b4b0e-c075-4b00-93d0-53de9ed41e56/image.png" alt=""></p>
<h3 id="입출력-예">입출력 예</h3>
<p><img src="https://velog.velcdn.com/images/dev_lynn/post/3e0fe654-4d98-4299-9e78-1469a51783ae/image.png" alt=""></p>
<h3 id="예시를-보고-생각했던-로직">예시를 보고 생각했던 로직</h3>
<p>카테고리에 해시로 되어있길래 질문하기 창에서 찾다가 해시 적용+구현하기 좋은 로직을 발견해서 내가 생각했던 과정을 그대로 옮겨왔다.</p>
<p>동명이인이 있는 3번째 입출력 예시이다.</p>
<ol>
<li>object로 초기화 </li>
</ol>
<p><strong>{mislav:0,stanko:0,ana:0}</strong></p>
<ol start="2">
<li>participant 배열을 돌면서 object key가 있을 때 value 하나씩 증가
<strong>{mislav:2,stanko:1,ana:1}</strong></li>
</ol>
<ol start="3">
<li>completion 배열을 돌면서 이름이 있을때 value를 하나씩 감소</li>
</ol>
<p><strong>{mislav:1,ana:0,stanko:0}</strong></p>
<ol start="4">
<li>최종적으로 0이 아닌 key값을 반환 -&gt; &quot;mislav&quot;</li>
</ol>
<h3 id="최종적으로-구현한-코드">최종적으로 구현한 코드</h3>
<pre><code class="language-js">function solution(participant, completion) {
  let hash = {};

  // object 타입으로 hash(해시테이블) 초기화
  for (let el of participant) hash[el] = 0;

  // participant 요소가 hash의 key일때 value 하나씩 증가
  for (let el of participant) if (hash[el] !== undefined) hash[el]++;

  // completion 배열을 돌면서 요소가 hash의 key에 해당되면 value 하나씩 감소
  for (let el of completion) if (hash[el] !== undefined) hash[el]--;

  // value가 0이 아닌 key값을 반환
  for (let key in hash) {
    if (hash[key] !== 0) return key;
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP 응답 코드]]></title>
            <link>https://velog.io/@dev_lynn/HTTP-%EC%9D%91%EB%8B%B5-%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@dev_lynn/HTTP-%EC%9D%91%EB%8B%B5-%EC%BD%94%EB%93%9C</guid>
            <pubDate>Fri, 01 Jul 2022 00:23:26 GMT</pubDate>
            <description><![CDATA[<p>5개의 클래스로 구분된다.
위키백과에 있는 클래스 정의는 다음과 같다.</p>
<p>1xx (정보): 요청을 받았으며 프로세스를 계속한다
2xx (성공): 요청을 성공적으로 받았으며 인식했고 수용하였다
3xx (리다이렉션): 요청 완료를 위해 추가 작업 조치가 필요하다
4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없다
5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했다</p>
<table>
<thead>
<tr>
<th align="center">응답대역</th>
<th align="center">응답코드</th>
<th align="left">설명</th>
</tr>
</thead>
<tbody><tr>
<td align="center">정보전송</td>
<td align="center">100</td>
<td align="left">Continue(클라이언트로 부터 일부 요청을 받았으며 나머지 정보를 계속 요청함)</td>
</tr>
<tr>
<td align="center">임시응답</td>
<td align="center">101</td>
<td align="left">Switching protocols</td>
</tr>
<tr>
<td align="center">성공</td>
<td align="center">200</td>
<td align="left">OK(요청이 성공적으로 수행됨)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">201</td>
<td align="left">Created (PUT 메소드에 의해 원격지 서버에 파일 생성됨)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">202</td>
<td align="left">Accepted(웹 서버가 명령 수신함)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">203</td>
<td align="left">Non-authoritative information (서버가 클라이언트 요구 중 일부만 전송)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">204</td>
<td align="left">No content (PUT, POST, DELETE 성공은 했지만 전송할 데이터가 없는 경우)</td>
</tr>
<tr>
<td align="center">리다이렉션</td>
<td align="center">301</td>
<td align="left">Moved permanently (요구한 데이터를 변경된 타 URL에 요청)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">302</td>
<td align="left">Not temporarily</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">304</td>
<td align="left">Not modified (컴퓨터 로컬의 캐시 정보를 이용함, 대개 gif 등은 웹 서버에 요청하지 않음)</td>
</tr>
<tr>
<td align="center">클라이언트 <br/>요청 에러</td>
<td align="center">400</td>
<td align="left">Bad Request (사용자의 잘못된 요청을 처리할 수 없음)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">401</td>
<td align="left">Unauthorized (인증이 필요한 페이지를 요청한 경우)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">402</td>
<td align="left">Payment required(예약됨)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">403</td>
<td align="left">Forbidden (접근 금지, 디렉터리 리스팅 요청 및 관리자 페이지 접근 등을 차단)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">404</td>
<td align="left">Not found, (요청한 페이지 없음)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">405</td>
<td align="left">Method not allowed (혀용되지 않는 http method 사용함)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">407</td>
<td align="left">Proxy authentication required (프락시 인증 요구됨)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">408</td>
<td align="left">Request timeout (요청 시간 초과)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">410</td>
<td align="left">Gone (영구적으로 사용 금지)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">412</td>
<td align="left">Precondition failed (전체 조건 실패)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">414</td>
<td align="left">Request-URI too long (요청 URL 길이가 긴 경우)</td>
</tr>
<tr>
<td align="center">서버<br/> 요청 에러</td>
<td align="center">500</td>
<td align="left">Internal server error (내부 서버 오류)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">501</td>
<td align="left">Not implemented (웹 서버가 처리할 수 없음)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">503</td>
<td align="left">Service unnailable (서비스 제공 불가)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">504</td>
<td align="left">Gateway timeout (게이트웨이 시간 초과)</td>
</tr>
<tr>
<td align="center"></td>
<td align="center">505</td>
<td align="left">HTTP version not supported (해당 http 버전 지원되지 않음)</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS ES6]]></title>
            <link>https://velog.io/@dev_lynn/JS-ES6</link>
            <guid>https://velog.io/@dev_lynn/JS-ES6</guid>
            <pubDate>Thu, 30 Jun 2022 15:31:03 GMT</pubDate>
            <description><![CDATA[<p>ES6에서 달라진 문법 정리!</p>
<h4 id="const--let">const , let</h4>
<p>var는 호이스팅 현상을 최소화하고자 사용 지양
const,let으로 변경 가능 여부를 키워드 정의</p>
<h4 id="화살표-함수">화살표 함수</h4>
<pre><code class="language-js">const hello = () ⇒ {} // →화살표 함수</code></pre>
<h4 id="비구조화-할당">비구조화 할당</h4>
<p>객체, 배열 프로퍼티를 꺼내기 쉬워졌다.
참고 : <a href="https://velog.io/@dev_lynn/destructuring-assignment-rest-parameter">https://velog.io/@dev_lynn/destructuring-assignment-rest-parameter</a></p>
<h4 id="반복문-forof문">반복문 (for...of문)</h4>
<p>각각의 요소들을 가져옴, for(let i=0;i&lt;n;i++) 같은 증감식 표현보다 효율적이긴 하지만 속도 느림</p>
<pre><code class="language-js">for(let key of object)</code></pre>
<pre><code class="language-js">const obj = [1,2,3];

for (let key of obj) {
    console.log(key); // 1,2,3
}</code></pre>
<p>for in과 for of의 차이점</p>
<ul>
<li>for in 반복문 : 객체의 모든 열거 가능한 속성에 대해 반복</li>
<li>for of 반복문 : <code>[Symbol.iterator]</code> 속성을 가지는 컬렉션 전용</li>
</ul>
<h4 id="스프레드-연산자">스프레드 연산자</h4>
<p>깊은 복사 할 때 유용
참고 : <a href="https://velog.io/@dev_lynn/js-deep-copy-shallow-copy">https://velog.io/@dev_lynn/js-deep-copy-shallow-copy</a></p>
<h4 id="기본-매개변수">기본 매개변수</h4>
<p>함수를 실행할 때 파라미터를 별도로 지정하지 않으면 함수 선언부에 작성한 디폴트 값을 사용할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS V8 Engine]]></title>
            <link>https://velog.io/@dev_lynn/JS-V8-Engine-rytf1swy</link>
            <guid>https://velog.io/@dev_lynn/JS-V8-Engine-rytf1swy</guid>
            <pubDate>Thu, 30 Jun 2022 15:13:02 GMT</pubDate>
            <description><![CDATA[<h3 id="js-v8-engine">JS V8 Engine</h3>
<blockquote>
<p>구글 크롬과 node.js에서 사용되는 자바스크립트 엔진</p>
</blockquote>
<h3 id="동작-과정">동작 과정</h3>
<p>오토마타, 컴파일러를 배운적 있어도 용어만 들어봤을 뿐(parser,ast 정도..?) 구동원리에 대해 아직은 생소하다..</p>
<p><img src="https://velog.velcdn.com/images/dev_lynn/post/5a9e4696-17ba-469d-8552-bf3a875082ab/image.png" alt=""></p>
<ol>
<li><p>parser : 소스코드 파싱
자바스크립트 소스코드를 가져와서 파서에게 넘기면 소스코드를 분석한 후 Abstract Syntax Tree로 변환한다.
각 키워드에 대해 어휘와 문법을 해석한 뒤 파싱하게 된다.</p>
</li>
<li><p>ignition 인터프리터로 바이트 코드 변환
자바스크립트 코드를 바이트 코드로 변환하는 인터프리터.
수시로 코드를 파싱하는 작업을 최소화하고 코드의 양을 줄일 수 있다.</p>
</li>
<li><p>TurboFan으로 바이트 코드 컴파일
자바스크립트 엔진의 최적화 기법</p>
</li>
</ol>
<p>C++로 작성된 low level 엔진이라 실제 개발과는 거리가 멀다고 생각될 수는 있다. 원리를 이해하며 개발하기까지 조금이라도 찾아보며 공부해야겠다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[브라우저 렌더링 과정]]></title>
            <link>https://velog.io/@dev_lynn/browser-rendering</link>
            <guid>https://velog.io/@dev_lynn/browser-rendering</guid>
            <pubDate>Thu, 30 Jun 2022 14:45:52 GMT</pubDate>
            <description><![CDATA[<p>브라우저에 HTML, CSS가 렌더링 되는 순서</p>
<ol>
<li>다운로드</li>
<li>HTML 준비</li>
<li>CSS 준비</li>
</ol>
<hr>
<p>사실상 1~3번 과정이 HTML,CSS 파일을 parsing하는 과정이다.</p>
<hr>
<ol start="4">
<li>HTML,CSS 합치기 (= rendering tree를 만드는 style 과정)</li>
<li>위치 그리기 layout (= reflow)</li>
<li>컬러 입히는 레이어 만드는 과정 paint (= repaint)</li>
</ol>
<hr>
<ol start="7">
<li>마지막으로  레이어를 합성해서 실제 화면에 그리는 과정(Composite)<blockquote>
<p>브라우저마다 레이아웃,페인트 용어 이름은 다르다.</p>
</blockquote>
</li>
</ol>
<p>reflow가 repaint보다 시간이 더 오래걸린다.
위치가 바뀌면 사이즈가 바뀌고 그 사이즈에 맞게 색칠을 해야하기 때문에 리소스를 더 많이 잡아먹기 때문이다!</p>
<p>css 프로퍼티마다 layout,paint,composite가 전부 발생하기도 하고 일부만 발생하기도 한다.
-&gt;참고 사이트 : <a href="https://csstriggers.com/">https://csstriggers.com/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 데이터 타입 : null, undefined]]></title>
            <link>https://velog.io/@dev_lynn/JS-null-undefined</link>
            <guid>https://velog.io/@dev_lynn/JS-null-undefined</guid>
            <pubDate>Thu, 30 Jun 2022 14:31:49 GMT</pubDate>
            <description><![CDATA[<p>null, undefined 모두 js에서 &#39;값이 없음&#39;을 의미하지만 둘이 다르다!</p>
<h3 id="기본적인-차이">기본적인 차이</h3>
<ul>
<li><p>undefined = no assign
값이 할당되지 않음을 뜻하는 데이터 타입
정의되지 않았음, 초기화되지 않았음 등을 의미
또는 존재하지 않는 배열의 원소값을 접근할 때 
또는 존재하지 않는 객체의 프로퍼티를 접근할 때 등을 의미
변수를 선언만 해도 할당됨</p>
</li>
<li><p>null = no value
명시적으로 값이 &#39;비어있음&#39;을 의미
아무것도 참조하지 않음
객체를 담을 변수를 초기화할 때 일반적으로 사용
변수를 선언한 후에 null로 값을 바꿔야 null이 들어감</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS? Node? 뭐가 다르지?]]></title>
            <link>https://velog.io/@dev_lynn/JS-Node</link>
            <guid>https://velog.io/@dev_lynn/JS-Node</guid>
            <pubDate>Thu, 30 Jun 2022 14:26:15 GMT</pubDate>
            <description><![CDATA[<p>처음에 바닐라 자바스크립트로 공부해왔다가 프론트 러닝커브를 위해 react.js 프레임워크를 쓰기 시작했다. js가 node.js를 통해 백엔드 개발이 가능하고 프론트 서버 실행에 사용된다는걸 알고는 있지만 차이점을 깊게 고민한 적이 없었다.</p>
<p>자세히 알지는 못하지만 공부하는 입장에서 짧게나마 적으려 한다.</p>
<p>Node.js 자체가 웹서버가 아니다. 얘는 단순히 자바스크립트 런타임으로써 웹서버를 만들 수 있는 방법 중 하나라고 볼 수 있다.</p>
<p>JS는 브라우저에서만 동작하는 프로그래밍 &#39;언어&#39; 중에 하나이다. 파이썬,자바,C와 같은 개념. 브라우저와 문서(Document)를 다루는 개발 도구.</p>
<p>특히 node.js는 웹서버를 만드는 도구로서 장점이 몇 있기 때문에 사용된다.</p>
<ul>
<li>비동기 처리 가능</li>
<li>구글 크롬의 V8 엔진 이용 가능</li>
<li>적은 양의 자원으로 일 처리</li>
</ul>
<h3 id="차이점들-요약">차이점들 요약</h3>
<table>
<thead>
<tr>
<th align="left">JS</th>
<th align="left">Node</th>
</tr>
</thead>
<tbody><tr>
<td align="left">특정 환경(브라우저)에서만 이용 가능</td>
<td align="left">브라우저 없이 어느 환경에서든 실행 가능</td>
</tr>
<tr>
<td align="left">브라우저에서만 동작</td>
<td align="left">데스크탑에서 동작</td>
</tr>
<tr>
<td align="left">프로그래밍 언어,개발 도구</td>
<td align="left">js 언어로 웹서버를 구축하는 도구</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS array reduce]]></title>
            <link>https://velog.io/@dev_lynn/JS-array-reduce</link>
            <guid>https://velog.io/@dev_lynn/JS-array-reduce</guid>
            <pubDate>Thu, 30 Jun 2022 09:35:34 GMT</pubDate>
            <description><![CDATA[<p>MDN에는 인자 설명을 이렇게 해놓았다.</p>
<blockquote>
<p>리듀서 함수는 네 개의 인자를 가집니다.
  누산기 (acc),현재 값 (cur),현재 인덱스 (idx),원본 배열 (src)
-&gt;리듀서 함수의 반환 값은 누산기에 할당되고, 누산기는 순회 중 유지되므로 결국 최종 결과는 하나의 값이 됩니다.</p>
</blockquote>
<p>(활용 예제)
팩토리얼을 reduce로도 풀 수 있다.</p>
<pre><code class="language-js">const array1 = [1, 2, 3, 4];

// 1 * 2 * 3 * 4 = 4!
const init = 1;
const sumWithInit = array1.reduce(
  (p, c) =&gt; p * c,
  init
);

console.log(sumWithInit);
//24</code></pre>
<p>(세번째 인자 index까지 포함한 예제)
1부터 10까지 더하기-&gt;1부터 n까지 더하기로 발전 가능</p>
<pre><code class="language-js">const answer=new Array(10).fill(1).reduce((acc,cur,i)=&gt;{
        return acc+cur+i
    },0);</code></pre>
]]></description>
        </item>
    </channel>
</rss>