나의 개발일지(김지헌)
자료구조 본문
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를 싱글스레드 라고 한다.
48. Node.js는 non-blocking, asynchronous 기반 JS 런타임입니다. 이에 대해 아는 만큼 설명해주실 수 있을까요?
-
- 함수는 다른 함수의 리턴 값을 고려하지 않고 동작한다. (비동기)
- 함수는 다른 함수에게 제어권을 주지 않고 자신의 코드를 계속 실행한다. (논 블로킹)
- 정리하면, 함수가 다른 함수를 호출할 때 제어권을 주지 않고 자신의 코드를 계속 실행한다. 함수가 다른 함수를 호출할 때 콜백함수를 함께 줘서 다른 함수는 자신의 작업을 처리하면 콜백 함수를 실행한다.논 블로킹은 다른 주체의 작업에 관련 없이 자신의 작업을 하는것을 의미한다.
- 논블로킹 I/O 모델은 Input과 Output이 관련된 작업(http, Database CRUD, third party api, filesystem) 등의 블로킹 작업들을 백그라운드에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달하는 것을 말합니다.
49. Node.js의 이벤트 루프란 무엇이고 왜 필요하며 어떻게 작동하는지 아는 만큼 설명해주실 수 있을까요?
- 이벤트 루프(Event Loop) 란?이벤트 루프는 Node.js가 비동기 작업을 관리하기 위한 구현체다.각 페이즈는 자신만의 큐를 관리한다.페이즈의 큐에 담긴 작업을 모두 실행하거나 시스템의 실행 한도에 다다르면 Node.js는 다음 페이즈로 넘어간다.
- 이벤트 루프가 살아있는 한 Node.js는 이벤트 루프를 반복한다.
- Node.js는 순서대로 페이즈를 방문하면서 큐에 쌓인 작업을 하나씩 실행한다.
- 이벤트 루프는 총 6개의 페이즈로 구성되어 있으며 한 페이즈에서 다음 페이즈로 넘어가는 것을 틱이라고 한다.
- 페이즈 전환 순서 또한 그림에 나타난 것처럼 Timer Phase -> Pending Callbacks Phase -> Idle, Prepare Phase -> Poll Phase -> Check Phase -> Close Callbacks Phase -> Timer Phase 순을 따른다. 이렇게 한 페이즈에서 다음 페이즈로 넘어가는 것을 틱(Tick)이라고 부른다.
- 이벤트 루프(Event Loop)는 콜백 큐와 호출 스택을 모두 모니터링하고 지속적으로 실행되는 프로세스이다. 호출 스택이 비어 있지 않으면, 이벤트 루프는 비어 있을 때까지 기다렸다가 콜백 대기열에서 호출 스택으로 다음 함수를 배치하게 된다.
50. 트랜스파일러와 번들러에 대해 설명해주실 수 있을까요?
- 트랜스파일러을 말한다.
- 이를 해주는 것이 트랜스파일러(Transpiler)이다. 트랜스파일러가 필요한 이유는 지원하지 않는 언어를 지원하는 다른 언어로 변환하기 위해서 이다.
- 트랜스파일링(Transpiling)이란 어떤 특정 언어로 작성된 소스 코드를 다른 언어의 소스 코드로 변환하는 것
- 번들러번들러 없을때 단점
- 필요한 코드와 적절한 로드 순서를 추적해야한다.
- <script>태그가 여러 개인 경우 서버 호출이 많아져 성능이 저하된다.
- 수많은 수작업이 필요하다.
- 여러 개로 나뉘어져 있는 JS파일을 하나의 “Javascript Bundle”파일로 만들어준다. (의존성 처리)모듈 번들러가 없으면 수동으로 파일을 결합하거나 수많은 <script>태그를 사용하여 자바 스크립트를 HTML로 로드해야 한다.
51 .async await -> 순서대로 쓰면 동기적인 처리방식처럼 보이는데 왜 이렇게 동작하는지? 이거는 동기적인 방식인지?
- 3개의 async await코드 A,B,C 가 있다고 가정했을때 동작시 A,B,C 순서대로 코드가 동작하면서 비동기처리를 하게됩니다. 동작한 순서대로 비동기처리를 해서 처리가 완료 되면 콜백함수를 실행 시켜서 결과 값을 보여주기 때문에 동기적인 움직임으로 보인다.
- 동시성동시에 실행 되는 거 같이 보임 한번에 많은 것은 처리, 논리적인 개념
- 싱글코어에서 멀티쓰레드를 동작 시키는 방식
- 동시성은 적어도 두 개의 스레드가 진행 중일 때 존재하는 조건이며, 가상 병렬 처리의 한 형태로 시간 분할(time-slicing)을 포함한다.
- 병렬성 병렬성도 동시성을 의미하지만 동시성과의 차이는 각 코어내의 스레드가 실제로 동시에 명령어를 실행할 수 있음을 말한다.멀티 코어에서 멀티 쓰레드를 동작시키는 방식
- 실제로 동시에 여러 작업이 처리되는 것, 한번에 많은 일을 처리, 물리적인 개념