본문 바로가기

Web development/Node.js & Typescript22

[Typescript] 제네릭(Generic)을 사용하는 이유 일단 나는 제네릭이라는 용어 자체를 몰랐다. 제너레이터랑 헷갈렸을 정도니까. 꺾쇠, 타입 키워드를 듣고도, 아. Array 말하는건가? 그거 그냥 string[]과 동일한 문법의 한 종류 아닌가? 생각했다. IDE에서 알려주는 정보 모달에서 라고 되어있는 것도 그냥 여기에 타입을 넣으세요~ 라는 의미인줄 알았는데... 제네릭을 진작 알았다면, 타입 정의의 새로운 세계가 열렸을텐데 참 아쉽다. 제네릭은 함수나 클래스에서 사용할 타입을 외부에서 유동적으로 지정해줄 수 있는 것을 말한다. 특정 타입을 사용할 것이지만, 그 타입을 유동적으로 지정할 수 있다. 예를들면 아래와 같이 사용할 수 있다. 리스폰스에 페이지네이션 정보와 함께 데이터 배열을 보내는 경우는 흔히 있다. 이때 totalItem, current.. 2020. 7. 10.
[Sequelize] there is no unique constraint matching given keys for referenced table 원인과 해결방법 기존에 MySQL+Sequelize를 사용하다가, PostgreSQL로 DB를 이전하게 되었다. dialect랑 접속정보만 바꿔주면 되는 간단한 작업이었는데, 아래와 같은 에러를 만나게 되었다. there is no unique constraint matching given keys for referenced table "rfqs" 멀쩡하게 잘 되던게 DB를 바꾸니까 에러가 났기 때문에 설정이라든지 문법의 문제겠거니 했는데.. 위 에러는 PK와 FK가 일치하지 않을 때 나는 에러다. 내 경우 한 테이블에 PK가 두개 지정되어 있었고, 해당 키를 FK로 갖는 다른 테이블은 두 PK중 하나만을 FK로 지정하고 있었다. 예를들어 (아무렇게나 쓴 수도코드다) Person { id: integer; email: .. 2020. 6. 23.
[Typescript] Jest 모킹시 빨간줄 뜨는 문제 (Property 'mock' does not exist on type) mocking시 모킹한 모듈이 몇번 호출되었는지 확인하는 테스트 코드를 짤 때, mock 부분에 빨간줄이 뜨면서 에러가 날 때가 있다. IDE에서 관련된 힌트를 주지도 않아서 한참 헤맸는데... 알고보니 TS Lint 문제였다. 해결방법은 간단하다. // @ts-ignore expect(mockedModule.mock.calls.length).toBe(0); 바로 윗줄에 // @ts-ignore를 추가해주면 된다. 2020. 6. 2.
package-lock.json의 역할과 커밋해야 하는 이유 npm install시 자동으로 생기는 package-lock.json이 대체 무슨 역할인지 알아보자. package.json은 이 프로젝트 패키지의 정보들을 담고 있다. 이름, 버전 등을 포함하고 있는데, 의존성 모듈 정보도 가지고 있다. { "name": "myApp", ... "dependencies": { "express": "^4.16.4", ... } } dependencies에는 이 패키지 실행에 필요한 다른 모듈들의 이름과 버전 정보가 명시되어 있다. 그래서 다른 사람이 내 코드를 다운받아 실행하더라도, npm install만 실행하면 내가 설치했던 의존 모듈들이 함께 설치된다. 하지만, 여기엔 문제가 몇가지 있다. 첫번째 문제는, 명시된 모듈이 다른 버전으로 설치될 수 있다는 것이다. d.. 2020. 4. 3.
[Javascript] 이벤트루프와 호출 스택(call stack), 비동기성 자바스크립트의 큰 특징으로 비동기성과 싱글스레드, Non-blocking IO가 있다. 비동기성은 알겠고, 논 블로킹 IO도 비동기성에서 오는 특징이라는건 알겠는데, 비동기성은 어떻게 동작하는 것일까? 그것도 싱글스레드라면, 한번에 한 동작밖에 못하는게 아닌지? 우선 동기성과 비동기성은 간단히 그림으로 살펴보자. 한 동작을 수행하다가 다른 동작이 필요한 경우, 동기 : 응답이 반환될때까지 하던 일을 멈추고 기다린다. 비동기 : 응답을 기다리느라 하던 일을 멈추지 않는다. 여기서 언뜻 들었던 의문이 있다. 하던 일을 멈추지 않는다 = 여러 일을 동시에 한다 => 싱글스레드인데? 이 부분은 자바스크립트의 동작 원리, 특히 이벤트루프와 호출스택을 이해해야 한다. 호출 스택(call stack) 자바스크립트는 .. 2020. 4. 3.
[Javascript] for, setTimeout 퀴즈 아래와 같은 코드의 출력이 어떻게 될까? for (var i = 0 ; i { console.log(i) }, 1000) } 난 보고.. 1초 있다가 1, 또 1초 있다가 2, 또 1초있다가 3 찍힐거라고 생각했다. 정답은 1초 후 거의 동시에 3이 3번 찍힌다. 정답을 보고서, 아.. for문이 너무 빨리 돌아서 그렇구나? 1초안에 3번 도는게 끝나서 3이 세번 찍히는구나 했다. 그리고 await가 걸린것도 아니니 당연히 각 setTimeout은 거의 동시에 실행되니까, 그래서 거의 동시에 찍히는거구나 했다. (이건 당연한건데 왜 생각을 못했을까?) 그러면 for문 반복횟수를 늘리고, setTimeout 시간을 줄이면 다른 숫자도 찍히겠구나? for.. 2020. 3. 31.
[Javascript] map vs filter vs reduce for문 대신 map을 사용할 수 있다. const people = [ { name: 'effy', age: 13}, { name: 'kim', age: 7}, { name: 'cathy', age: 21}, { name: 'moro', age: 28}, { name: 'jamonda', age: 32} ] // for let names1 = []; for (const person of people) { names1.push(person.name); } console.log(names1); // map const names2 = people.map((person) => person.name) console.log(names2); names1과 names2는 같다. 값 반환에 조건이 필요한 경우 filte.. 2020. 2. 11.
[Javascript] List/Set/ Map 순회하기 기본적으로 리스트를 순회하는 방법은 이렇다. const list = [1, 2, 3]; for (var i = 0 ; i < list.length ; i++){ console.log(list[i]); } index를 쓰지 않고 of를 사용할 수도 있다. const list = [1,2,3] for(const item of list){ console.log(item); } for (const a of arr) console.log(a); // inline으로 쓸 수도 있다. [대괄호]로 선언해서 배열을 만들 수도 있지만, Set이나 Map으로 순회가능한 객체를 만들수도 있다. const set = new Set([1,2,3]); const map = new Map([['a', 1],['b', 2],['c'.. 2020. 2. 9.
[Javascript] 함수와 일급객체, 고차함수와 클로저 일급객체란? 1) 값으로 사용될 수 있고 2) 변수에 할당할 수 있고 3) 함수의 리턴값으로 사용할 수 있고 4) 함수의 인자로 전달할 수 있는 객체를 말한다. javascript에서 함수는 일급객체이다. 따라서 1) 함수를 값으로 사용할 수 있고 2) 함수를 변수에 할당할 수 있고 3) 함수의 리턴값으로 함수를 사용할 수 있고 4) 함수의 인자로도 함수를 전달할 수 있다. 고차함수 함수를 값으로 다룰 수 있다는 의미는 고차함수를 사용할 수 있다는 의미이기도 하다. 고차함수란 함수가 함수를 인자로 받는 것을 말한다. const test = f ⇒ f(1); /** * 익명함수(f => f(1))를 test 변수에 할당했다. * 함수의 인자로 함수를 전달했다(f) * 이 함수는 함수를 인자로 받아 1을 인.. 2020. 2. 6.