나의 개발일지(김지헌)
항해 99 96일차 12/23일 본문
오늘은 6시에 수료식을 했다. 앙케이트 같이 투표를 해서 상을 줬었다.
잘 들어줬어 넌 항상 을 받았는데 의지가 되는 동료 였다는게 정말 기쁘게 느껴졌고 좋았다.
내일은 면접이여서 기술 면접 준비를 하고 있는데 생각보다 머리게 잘 들어오지 않는거 같고 이해하는게 조금 힘든거 같다 한번에 많이 넣는다는 느낌이라 빡센거 같다. 하지만 준비를 잘해서 내가 발전 할 수 있는 회사에 취업해서 재미있게 놀고 싶다.
40. 동시성과 병렬성을 비교하여 설명해주실 수 있을까요?
동시성동시에 실행 되는 거 같이 보임 한번에 많은 것은 처리, 논리적인 개념
- 싱글코어에서 멀티쓰레드를 동작 시키는 방식
- 동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함한다.
- 병렬성 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말한다.멀티 코어에서 멀티 쓰레드를 동작시키는 방식
- 실제로 동시에 여러 작업이 처리되는 것, 한번에 많은 일을 처리, 물리적인 개념
41. 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주실 수 있을까요?
-
- 깊은 복사
- …(Spread) 연산자를 통해 변수 A를 변수 B에 복사하여 할당한 경우에는 A 와 B는 다른 주소를 갖게 되었다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사 - Object.assign() 메서드를 통해 첫 번째 인자로 { } 객체를, 두 번째 인자로 복사할 변수를 넣어서 복사하여 나온 결과 변수에 할당하였다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사
- 얕은 복사 - 객체를 직접 대입하는 경우 (ex a = 1 , b = a) 참조에 의한 할당이 이루어지므로 같은 데이터 (주소) 를 가지고 있다 ⇒ 깊은 복사와는 다르게 데이터 및 주소도 같은 얕은 복사
- 배열을 복사할 때는 1 레벨 정도의 깊이에서만 효과적으로 동작 ⇒ 다차원 배열을 복사하기에는 깊은 복사는 적합하지 않을 수 있다. 그래서 1 depth까지는 깊은 복사, 2 depth 이상이면 얕은 복사를 추천
- 깊은 복사
42. JS의 passed by value 와 passed by reference 에 대해 아는 만큼 설명해주실 수 있을까요?
- passed by value (값에 의한 전달)원시 타입 데이터는 변수에 할당 될 때 메모리상에 고정된 크기로 저장되고 해당 변수가 원시 데이터의 값을 보관인자로 넘기는 값을 복사해서 새로운 함수에 전달하는 방식. 값에 의한 호출은 원본값이 변경될 가능성은 없지만, 고비용과 메모리의 문제점이 있음
- //값이 변경되지 않음 즉 원본의 데이터가 보존되어 변경되지 않고 나옴 function test(a){ a = 44; } var a = 33; test(a); console.log(a); // 33, Access By Value
- 복사된 데이터를 전달하여 구성해서 값을 수정해도 원본 데이터에는 영향을 주지 않는 방식
- 원시타입 : Number,boolean,undefined,string,null
- passed by reference (참조에 의한 전달)데이터의 크기가 정해져있지 않고 변수에 할당 될 때 값이 직접 해당 변수에 저장될 수 없으며 변수에는 데이터에 대한 참조가 저장이 된다 즉 변수의 값이 힙 메모리의 주소 값을 저장하는 것주소값을 인자로 전달하는 방식 참조에 의한 호출은 원본값의 변경이 일어날 수도 있다는 문제점이 있음
- //값이 수정되면 그 주소를 참조하기 때문에 값이 변경됨 function test(b){ b.name = "name changed to c"; } var b = { name : "test object" }; test(b); console.log(b); // { name: 'name changed to c' }
- 주소 값을 전달하여 실제 값에 대한 Alias를 구성함으로써 값을 수정하면 원본의 데이터가 수정되는 방식
- 참조 타입 : object, array,function
43. 고차 함수란 무엇인지 설명해주실 수 있을까요?
- 고차함수는 함수를 인자로 전달받거나 함수를 결과로 반환하는 함수를 말하며 인자로 받은 함수를 필요한 시점에 호출하거나 클로저를 생성하여 반환한다.
//함수를 리턴할때 function adder(added) { return function (num) { return num + added; }; } /* * 함수 adder는 다른 함수를 리턴하는 고차 함수입니다. * adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴합니다. * 리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴합니다. */ // adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있습니다. let output = adder(5)(3); // -> 8 console.log(output); // -> 8 // adder가 리턴하는 함수를 변수에 저장할 수 있습니다. // javascript에서 함수는 일급 객체이기 때문입니다. const add3 = adder(3); output = add3(2); console.log(output); // -> 5
//다은 함수를 인자로 받는경우 function double(num) { return num * 2; } //고차함수 double 함수를 인자로 받음 function doubleNum(func, num) { return func(num); } /* * 함수 doubleNum은 다른 함수를 인자로 받는 고차 함수입니다. * 함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우 * 함수 func는 함수 doubleNum의 콜백 함수입니다. * 아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백 함수입니다. */ let output = doubleNum(double, 4); console.log(output); // -> 8
- 클로저: 함수와 함수가 선언된 어휘적 환경의 조합이다
45. JWT에 대해 설명해주실 수 있을까요? 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주시면 좋습니다.
- JWT 유저를 인증하고 식별하기 위한 토큰기반 인증이며 header,payload,signature로 구성됩니다.각 요소는 ,로 구분된다. header에는 타입과 해시 알고리즘 종류가 담겨있고,payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있고. signature는 개인키로 서명한 전자서명이 담겨있음
- JWT는 회원가입시 PW를 서비스 단에서 JWT처리를 해서 저장하고 검증시 입력 받은 PW와 DB에 저장되어 있는 암호화된 비밀번호를 찾아서 검증 해서 일치하면 ture를 리턴해서 검증을 완료한다. 에쎄스 토큰은 3시간 리프레쉬토큰은 7일로 설정해서 회원인증이 필요한 api 접근전 검증 미들웨어에서 에쎄스 토큰이 일치하면 검증 완료 되며 에쎄스 토큰 만료시 데이터베이스에 저장된 리프레쉬를 검증해서 일치하거나 만료되지 않으면 재발급 해주고 인증이 완료된다.
46. 재미있게 공부한 알고리즘이 있다면 설명해주실 수 있을까요?
47. Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
정확하게 말하면 node는 싱글스레드가 아니다. node도 여러개의 스레드를 가지고 있지만 자바스크립트를 실행하는 스레드는 단 하나이므로 node를 싱글스레드 부르고 있으며.그 싱글스레드가 바로 이벤트 루프입니다.
node는 이벤트 기반의 플랫폼이기 때문에 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식으로 작동한다. 이 말은 곧 node 에서 일어나는 모든 처리는 일련의 콜백을 처리하는 것과 같다고 할 수 있다. Nods.js는 v8이라는 자바스크립트 엔진과 비동기 작업을 처리하는 libuv 라는 라이브러리로 이뤄져있다.
이때 libuv가 제공하는 것이 이벤트루프이다. 이 이벤트루프가 자바스크립트 엔진으로부터 넘겨받은 비동기 작업을 OS의 비동기 interface에 넘겨주거나 스레드 풀에 할당한다. 이후 할당한 작업이 끝나면 태스크큐에 콜백함수를 전달한 후 콜스택이 비게 될 경우 차례로 콜스택으로 다시 넘겨 실행하게 한다. 이 이벤트루프가 싱글스레드이고 실제적으로 자바스크립트를 처리할 수 있는 메인스레드이기 때문에 node.js를 싱글스레드 라고 한다.
- 동시성동시에 실행 되는 거 같이 보임 한번에 많은 것은 처리, 논리적인 개념
- 싱글코어에서 멀티쓰레드를 동작 시키는 방식
- 동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함한다.
- 병렬성 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말한다.멀티 코어에서 멀티 쓰레드를 동작시키는 방식
- 실제로 동시에 여러 작업이 처리되는 것, 한번에 많은 일을 처리, 물리적인 개념
41. 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주실 수 있을까요?
-
- 깊은 복사
- …(Spread) 연산자를 통해 변수 A를 변수 B에 복사하여 할당한 경우에는 A 와 B는 다른 주소를 갖게 되었다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사 - Object.assign() 메서드를 통해 첫 번째 인자로 { } 객체를, 두 번째 인자로 복사할 변수를 넣어서 복사하여 나온 결과 변수에 할당하였다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사
- 얕은 복사 - 객체를 직접 대입하는 경우 (ex a = 1 , b = a) 참조에 의한 할당이 이루어지므로 같은 데이터 (주소) 를 가지고 있다 ⇒ 깊은 복사와는 다르게 데이터 및 주소도 같은 얕은 복사
- 배열을 복사할 때는 1 레벨 정도의 깊이에서만 효과적으로 동작 ⇒ 다차원 배열을 복사하기에는 깊은 복사는 적합하지 않을 수 있다. 그래서 1 depth까지는 깊은 복사, 2 depth 이상이면 얕은 복사를 추천
- 깊은 복사
42. JS의 passed by value 와 passed by reference 에 대해 아는 만큼 설명해주실 수 있을까요?
- passed by value (값에 의한 전달)원시 타입 데이터는 변수에 할당 될 때 메모리상에 고정된 크기로 저장되고 해당 변수가 원시 데이터의 값을 보관인자로 넘기는 값을 복사해서 새로운 함수에 전달하는 방식. 값에 의한 호출은 원본값이 변경될 가능성은 없지만, 고비용과 메모리의 문제점이 있음
- //값이 변경되지 않음 즉 원본의 데이터가 보존되어 변경되지 않고 나옴 function test(a){ a = 44; } var a = 33; test(a); console.log(a); // 33, Access By Value
- 복사된 데이터를 전달하여 구성해서 값을 수정해도 원본 데이터에는 영향을 주지 않는 방식
- 원시타입 : Number,boolean,undefined,string,null
- passed by reference (참조에 의한 전달)데이터의 크기가 정해져있지 않고 변수에 할당 될 때 값이 직접 해당 변수에 저장될 수 없으며 변수에는 데이터에 대한 참조가 저장이 된다 즉 변수의 값이 힙 메모리의 주소 값을 저장하는 것주소값을 인자로 전달하는 방식 참조에 의한 호출은 원본값의 변경이 일어날 수도 있다는 문제점이 있음
- //값이 수정되면 그 주소를 참조하기 때문에 값이 변경됨 function test(b){ b.name = "name changed to c"; } var b = { name : "test object" }; test(b); console.log(b); // { name: 'name changed to c' }
- 주소 값을 전달하여 실제 값에 대한 Alias를 구성함으로써 값을 수정하면 원본의 데이터가 수정되는 방식
- 참조 타입 : object, array,function
43. 고차 함수란 무엇인지 설명해주실 수 있을까요?
- 고차함수는 함수를 인자로 전달받거나 함수를 결과로 반환하는 함수를 말하며 인자로 받은 함수를 필요한 시점에 호출하거나 클로저를 생성하여 반환한다.
//함수를 리턴할때 function adder(added) { return function (num) { return num + added; }; } /* * 함수 adder는 다른 함수를 리턴하는 고차 함수입니다. * adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴합니다. * 리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴합니다. */ // adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있습니다. let output = adder(5)(3); // -> 8 console.log(output); // -> 8 // adder가 리턴하는 함수를 변수에 저장할 수 있습니다. // javascript에서 함수는 일급 객체이기 때문입니다. const add3 = adder(3); output = add3(2); console.log(output); // -> 5
//다은 함수를 인자로 받는경우 function double(num) { return num * 2; } //고차함수 double 함수를 인자로 받음 function doubleNum(func, num) { return func(num); } /* * 함수 doubleNum은 다른 함수를 인자로 받는 고차 함수입니다. * 함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우 * 함수 func는 함수 doubleNum의 콜백 함수입니다. * 아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백 함수입니다. */ let output = doubleNum(double, 4); console.log(output); // -> 8
- 클로저: 함수와 함수가 선언된 어휘적 환경의 조합이다
45. JWT에 대해 설명해주실 수 있을까요? 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주시면 좋습니다.
- JWT 유저를 인증하고 식별하기 위한 토큰기반 인증이며 header,payload,signature로 구성됩니다.각 요소는 ,로 구분된다. header에는 타입과 해시 알고리즘 종류가 담겨있고,payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있고. signature는 개인키로 서명한 전자서명이 담겨있음
- JWT는 회원가입시 PW를 서비스 단에서 JWT처리를 해서 저장하고 검증시 입력 받은 PW와 DB에 저장되어 있는 암호화된 비밀번호를 찾아서 검증 해서 일치하면 ture를 리턴해서 검증을 완료한다. 에쎄스 토큰은 3시간 리프레쉬토큰은 7일로 설정해서 회원인증이 필요한 api 접근전 검증 미들웨어에서 에쎄스 토큰이 일치하면 검증 완료 되며 에쎄스 토큰 만료시 데이터베이스에 저장된 리프레쉬를 검증해서 일치하거나 만료되지 않으면 재발급 해주고 인증이 완료된다.
46. 재미있게 공부한 알고리즘이 있다면 설명해주실 수 있을까요?
47. Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
정확하게 말하면 node는 싱글스레드가 아니다. node도 여러개의 스레드를 가지고 있지만 자바스크립트를 실행하는 스레드는 단 하나이므로 node를 싱글스레드 부르고 있으며.그 싱글스레드가 바로 이벤트 루프입니다.
node는 이벤트 기반의 플랫폼이기 때문에 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식으로 작동한다. 이 말은 곧 node 에서 일어나는 모든 처리는 일련의 콜백을 처리하는 것과 같다고 할 수 있다. Nods.js는 v8이라는 자바스크립트 엔진과 비동기 작업을 처리하는 libuv 라는 라이브러리로 이뤄져있다.
이때 libuv가 제공하는 것이 이벤트루프이다. 이 이벤트루프가 자바스크립트 엔진으로부터 넘겨받은 비동기 작업을 OS의 비동기 interface에 넘겨주거나 스레드 풀에 할당한다. 이후 할당한 작업이 끝나면 태스크큐에 콜백함수를 전달한 후 콜스택이 비게 될 경우 차례로 콜스택으로 다시 넘겨 실행하게 한다. 이 이벤트루프가 싱글스레드이고 실제적으로 자바스크립트를 처리할 수 있는 메인스레드이기 때문에 node.js를 싱글스레드 라고 한다.
- 동시성동시에 실행 되는 거 같이 보임 한번에 많은 것은 처리, 논리적인 개념
- 싱글코어에서 멀티쓰레드를 동작 시키는 방식
- 동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함한다.
- 병렬성 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말한다.멀티 코어에서 멀티 쓰레드를 동작시키는 방식
- 실제로 동시에 여러 작업이 처리되는 것, 한번에 많은 일을 처리, 물리적인 개념
41. 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주실 수 있을까요?
-
- 깊은 복사
- …(Spread) 연산자를 통해 변수 A를 변수 B에 복사하여 할당한 경우에는 A 와 B는 다른 주소를 갖게 되었다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사 - Object.assign() 메서드를 통해 첫 번째 인자로 { } 객체를, 두 번째 인자로 복사할 변수를 넣어서 복사하여 나온 결과 변수에 할당하였다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사
- 얕은 복사 - 객체를 직접 대입하는 경우 (ex a = 1 , b = a) 참조에 의한 할당이 이루어지므로 같은 데이터 (주소) 를 가지고 있다 ⇒ 깊은 복사와는 다르게 데이터 및 주소도 같은 얕은 복사
- 배열을 복사할 때는 1 레벨 정도의 깊이에서만 효과적으로 동작 ⇒ 다차원 배열을 복사하기에는 깊은 복사는 적합하지 않을 수 있다. 그래서 1 depth까지는 깊은 복사, 2 depth 이상이면 얕은 복사를 추천
- 깊은 복사
42. JS의 passed by value 와 passed by reference 에 대해 아는 만큼 설명해주실 수 있을까요?
- passed by value (값에 의한 전달)원시 타입 데이터는 변수에 할당 될 때 메모리상에 고정된 크기로 저장되고 해당 변수가 원시 데이터의 값을 보관인자로 넘기는 값을 복사해서 새로운 함수에 전달하는 방식. 값에 의한 호출은 원본값이 변경될 가능성은 없지만, 고비용과 메모리의 문제점이 있음
- //값이 변경되지 않음 즉 원본의 데이터가 보존되어 변경되지 않고 나옴 function test(a){ a = 44; } var a = 33; test(a); console.log(a); // 33, Access By Value
- 복사된 데이터를 전달하여 구성해서 값을 수정해도 원본 데이터에는 영향을 주지 않는 방식
- 원시타입 : Number,boolean,undefined,string,null
- passed by reference (참조에 의한 전달)데이터의 크기가 정해져있지 않고 변수에 할당 될 때 값이 직접 해당 변수에 저장될 수 없으며 변수에는 데이터에 대한 참조가 저장이 된다 즉 변수의 값이 힙 메모리의 주소 값을 저장하는 것주소값을 인자로 전달하는 방식 참조에 의한 호출은 원본값의 변경이 일어날 수도 있다는 문제점이 있음
- //값이 수정되면 그 주소를 참조하기 때문에 값이 변경됨 function test(b){ b.name = "name changed to c"; } var b = { name : "test object" }; test(b); console.log(b); // { name: 'name changed to c' }
- 주소 값을 전달하여 실제 값에 대한 Alias를 구성함으로써 값을 수정하면 원본의 데이터가 수정되는 방식
- 참조 타입 : object, array,function
43. 고차 함수란 무엇인지 설명해주실 수 있을까요?
- 고차함수는 함수를 인자로 전달받거나 함수를 결과로 반환하는 함수를 말하며 인자로 받은 함수를 필요한 시점에 호출하거나 클로저를 생성하여 반환한다.
//함수를 리턴할때 function adder(added) { return function (num) { return num + added; }; } /* * 함수 adder는 다른 함수를 리턴하는 고차 함수입니다. * adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴합니다. * 리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴합니다. */ // adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있습니다. let output = adder(5)(3); // -> 8 console.log(output); // -> 8 // adder가 리턴하는 함수를 변수에 저장할 수 있습니다. // javascript에서 함수는 일급 객체이기 때문입니다. const add3 = adder(3); output = add3(2); console.log(output); // -> 5
//다은 함수를 인자로 받는경우 function double(num) { return num * 2; } //고차함수 double 함수를 인자로 받음 function doubleNum(func, num) { return func(num); } /* * 함수 doubleNum은 다른 함수를 인자로 받는 고차 함수입니다. * 함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우 * 함수 func는 함수 doubleNum의 콜백 함수입니다. * 아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백 함수입니다. */ let output = doubleNum(double, 4); console.log(output); // -> 8
- 클로저: 함수와 함수가 선언된 어휘적 환경의 조합이다
45. JWT에 대해 설명해주실 수 있을까요? 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주시면 좋습니다.
- JWT 유저를 인증하고 식별하기 위한 토큰기반 인증이며 header,payload,signature로 구성됩니다.각 요소는 ,로 구분된다. header에는 타입과 해시 알고리즘 종류가 담겨있고,payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있고. signature는 개인키로 서명한 전자서명이 담겨있음
- JWT는 회원가입시 PW를 서비스 단에서 JWT처리를 해서 저장하고 검증시 입력 받은 PW와 DB에 저장되어 있는 암호화된 비밀번호를 찾아서 검증 해서 일치하면 ture를 리턴해서 검증을 완료한다. 에쎄스 토큰은 3시간 리프레쉬토큰은 7일로 설정해서 회원인증이 필요한 api 접근전 검증 미들웨어에서 에쎄스 토큰이 일치하면 검증 완료 되며 에쎄스 토큰 만료시 데이터베이스에 저장된 리프레쉬를 검증해서 일치하거나 만료되지 않으면 재발급 해주고 인증이 완료된다.
46. 재미있게 공부한 알고리즘이 있다면 설명해주실 수 있을까요?
47. Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
정확하게 말하면 node는 싱글스레드가 아니다. node도 여러개의 스레드를 가지고 있지만 자바스크립트를 실행하는 스레드는 단 하나이므로 node를 싱글스레드 부르고 있으며.그 싱글스레드가 바로 이벤트 루프입니다.
node는 이벤트 기반의 플랫폼이기 때문에 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식으로 작동한다. 이 말은 곧 node 에서 일어나는 모든 처리는 일련의 콜백을 처리하는 것과 같다고 할 수 있다. Nods.js는 v8이라는 자바스크립트 엔진과 비동기 작업을 처리하는 libuv 라는 라이브러리로 이뤄져있다.
이때 libuv가 제공하는 것이 이벤트루프이다. 이 이벤트루프가 자바스크립트 엔진으로부터 넘겨받은 비동기 작업을 OS의 비동기 interface에 넘겨주거나 스레드 풀에 할당한다. 이후 할당한 작업이 끝나면 태스크큐에 콜백함수를 전달한 후 콜스택이 비게 될 경우 차례로 콜스택으로 다시 넘겨 실행하게 한다. 이 이벤트루프가 싱글스레드이고 실제적으로 자바스크립트를 처리할 수 있는 메인스레드이기 때문에 node.js를 싱글스레드 라고 한다.
- 동시성동시에 실행 되는 거 같이 보임 한번에 많은 것은 처리, 논리적인 개념
- 싱글코어에서 멀티쓰레드를 동작 시키는 방식
- 동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함한다.
- 병렬성 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말한다.멀티 코어에서 멀티 쓰레드를 동작시키는 방식
- 실제로 동시에 여러 작업이 처리되는 것, 한번에 많은 일을 처리, 물리적인 개념
41. 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주실 수 있을까요?
-
- 깊은 복사
- …(Spread) 연산자를 통해 변수 A를 변수 B에 복사하여 할당한 경우에는 A 와 B는 다른 주소를 갖게 되었다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사 - Object.assign() 메서드를 통해 첫 번째 인자로 { } 객체를, 두 번째 인자로 복사할 변수를 넣어서 복사하여 나온 결과 변수에 할당하였다. ⇒ A 와 B의 값이 같아지는 (얕은 복사와 다르게 주소는 다르지만) 깊은 복사
- 얕은 복사 - 객체를 직접 대입하는 경우 (ex a = 1 , b = a) 참조에 의한 할당이 이루어지므로 같은 데이터 (주소) 를 가지고 있다 ⇒ 깊은 복사와는 다르게 데이터 및 주소도 같은 얕은 복사
- 배열을 복사할 때는 1 레벨 정도의 깊이에서만 효과적으로 동작 ⇒ 다차원 배열을 복사하기에는 깊은 복사는 적합하지 않을 수 있다. 그래서 1 depth까지는 깊은 복사, 2 depth 이상이면 얕은 복사를 추천
- 깊은 복사
42. JS의 passed by value 와 passed by reference 에 대해 아는 만큼 설명해주실 수 있을까요?
- passed by value (값에 의한 전달)원시 타입 데이터는 변수에 할당 될 때 메모리상에 고정된 크기로 저장되고 해당 변수가 원시 데이터의 값을 보관인자로 넘기는 값을 복사해서 새로운 함수에 전달하는 방식. 값에 의한 호출은 원본값이 변경될 가능성은 없지만, 고비용과 메모리의 문제점이 있음
- //값이 변경되지 않음 즉 원본의 데이터가 보존되어 변경되지 않고 나옴 function test(a){ a = 44; } var a = 33; test(a); console.log(a); // 33, Access By Value
- 복사된 데이터를 전달하여 구성해서 값을 수정해도 원본 데이터에는 영향을 주지 않는 방식
- 원시타입 : Number,boolean,undefined,string,null
- passed by reference (참조에 의한 전달)데이터의 크기가 정해져있지 않고 변수에 할당 될 때 값이 직접 해당 변수에 저장될 수 없으며 변수에는 데이터에 대한 참조가 저장이 된다 즉 변수의 값이 힙 메모리의 주소 값을 저장하는 것주소값을 인자로 전달하는 방식 참조에 의한 호출은 원본값의 변경이 일어날 수도 있다는 문제점이 있음
- //값이 수정되면 그 주소를 참조하기 때문에 값이 변경됨 function test(b){ b.name = "name changed to c"; } var b = { name : "test object" }; test(b); console.log(b); // { name: 'name changed to c' }
- 주소 값을 전달하여 실제 값에 대한 Alias를 구성함으로써 값을 수정하면 원본의 데이터가 수정되는 방식
- 참조 타입 : object, array,function
43. 고차 함수란 무엇인지 설명해주실 수 있을까요?
- 고차함수는 함수를 인자로 전달받거나 함수를 결과로 반환하는 함수를 말하며 인자로 받은 함수를 필요한 시점에 호출하거나 클로저를 생성하여 반환한다.
//함수를 리턴할때 function adder(added) { return function (num) { return num + added; }; } /* * 함수 adder는 다른 함수를 리턴하는 고차 함수입니다. * adder는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴합니다. * 리턴되는 익명 함수는 인자 한 개를 받아서 added와 더한 값을 리턴합니다. */ // adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있습니다. let output = adder(5)(3); // -> 8 console.log(output); // -> 8 // adder가 리턴하는 함수를 변수에 저장할 수 있습니다. // javascript에서 함수는 일급 객체이기 때문입니다. const add3 = adder(3); output = add3(2); console.log(output); // -> 5
//다은 함수를 인자로 받는경우 function double(num) { return num * 2; } //고차함수 double 함수를 인자로 받음 function doubleNum(func, num) { return func(num); } /* * 함수 doubleNum은 다른 함수를 인자로 받는 고차 함수입니다. * 함수 doubleNum의 첫 번째 인자 func에 함수가 들어올 경우 * 함수 func는 함수 doubleNum의 콜백 함수입니다. * 아래와 같은 경우, 함수 double은 함수 doubleNum의 콜백 함수입니다. */ let output = doubleNum(double, 4); console.log(output); // -> 8
- 클로저: 함수와 함수가 선언된 어휘적 환경의 조합이다
45. JWT에 대해 설명해주실 수 있을까요? 구체적으로 JWT를 어디서 처리하는지, 어떠한 방식으로 검증하는지, 재발급 방식과 주기는 어떻게 처리하는지, 다른 API 서비스 호출 시 어떻게 잡아서 인증 처리하는지 말씀해주시면 좋습니다.
- JWT 유저를 인증하고 식별하기 위한 토큰기반 인증이며 header,payload,signature로 구성됩니다.각 요소는 ,로 구분된다. header에는 타입과 해시 알고리즘 종류가 담겨있고,payload는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있고. signature는 개인키로 서명한 전자서명이 담겨있음
- JWT는 회원가입시 PW를 서비스 단에서 JWT처리를 해서 저장하고 검증시 입력 받은 PW와 DB에 저장되어 있는 암호화된 비밀번호를 찾아서 검증 해서 일치하면 ture를 리턴해서 검증을 완료한다. 에쎄스 토큰은 3시간 리프레쉬토큰은 7일로 설정해서 회원인증이 필요한 api 접근전 검증 미들웨어에서 에쎄스 토큰이 일치하면 검증 완료 되며 에쎄스 토큰 만료시 데이터베이스에 저장된 리프레쉬를 검증해서 일치하거나 만료되지 않으면 재발급 해주고 인증이 완료된다.
47. Node.js는 single-threaded 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
정확하게 말하면 node는 싱글스레드가 아니다. node도 여러개의 스레드를 가지고 있지만 자바스크립트를 실행하는 스레드는 단 하나이므로 node를 싱글스레드 부르고 있으며.그 싱글스레드가 바로 이벤트 루프입니다.
node는 이벤트 기반의 플랫폼이기 때문에 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식으로 작동한다. 이 말은 곧 node 에서 일어나는 모든 처리는 일련의 콜백을 처리하는 것과 같다고 할 수 있다. Nods.js는 v8이라는 자바스크립트 엔진과 비동기 작업을 처리하는 libuv 라는 라이브러리로 이뤄져있다.
이때 libuv가 제공하는 것이 이벤트루프이다. 이 이벤트루프가 자바스크립트 엔진으로부터 넘겨받은 비동기 작업을 OS의 비동기 interface에 넘겨주거나 스레드 풀에 할당한다. 이후 할당한 작업이 끝나면 태스크큐에 콜백함수를 전달한 후 콜스택이 비게 될 경우 차례로 콜스택으로 다시 넘겨 실행하게 한다. 이 이벤트루프가 싱글스레드이고 실제적으로 자바스크립트를 처리할 수 있는 메인스레드이기 때문에 node.js를 싱글스레드 라고 한다.
'항해 99' 카테고리의 다른 글
항해 99 97일차 12/24일 (0) | 2022.12.24 |
---|---|
항해 99 95일차 12/22일 (0) | 2022.12.23 |
항해 99 94일차 12/21일 (0) | 2022.12.22 |
항해 99 93일차 12/20일 (0) | 2022.12.21 |
항해 99 92일차 12/19일 (2) | 2022.12.20 |