dotenv는 Node.js 프로젝트에서 환경 변수를 로드하는 데 도움을 주는 패키지이다. dotenv.config()는 이러한 dotenv 패키지의 기능 중 하나로, 환경 변수를 로드하는 메서드이다. redis를 연결하는 부분은 싱글턴 패턴을 이용하여 제작하였는데, createClient하는 부분을 생성자에서 dotenv를 이용하여 .env파일에 있는 값을 사용해서 url을 넣어주었다. 이 redis 파일에서는 dotenv를 import해주지 않았다. 왜냐면 최상단인 app.ts에서 dotenv.config() 함수를 호출하여 이미 환경변수들을 로드하였고, redis를 연결하는 함수는 그 밑에서 호출하였기 때문이다. 왜 undefined로 나오는가? <img src="https://velog.velcdn.com/images/gkqkehs7/post/fcc6ffee-163f-48b5-b760-e13f891343e9/image.png
Javascript의 전역객체 Javascript는 최상위에 전역 객체를 가진다. 우리가 값을 선언하면 Javascript의 모든 객체와 값들은 이 전역 객체 밑으로 들어가며, 오직 하나만 생성 가능하다 브라우저에서는 window로 전역객체에 접근이 가능하고 nodejs에서는 global로 전역객체에 접근이 가능하다. 둘다 또한 globalThis로 접근 가능하다. 브라우저에서 globalThis는 window이고, Node.js에서 globalThis는 globa
앞선 포스트에서 설명한 것 처럼, 객체 리터럴을 이용하여 객체를 만들 수 있었다. 유저별로 객체를 여러개 만들어 유저들의 이름과 나이를 저장하는 경우를 생각해보자. 위 처럼 3명의 유저라면 3개만 만들면 되지만 100명 1000명.. 유저마다 이러한 객체를 만들 수는 없는 노릇이다. 생성자 함수 우리는 이럴때 생성자 함수를 사용할 수 있다. 생성자 함수는 일반 함수와 다른 것은 없다 하지만 함수 이름의 첫 글자는 대문자로 시작하고, 반드시 'new' 연산자를 붙여 인스턴스를 만들어야 한다. this 일반 함수와 다르게 대문자로 시작하는 생성자 함수에 new를 붙혀 인스턴스를 만들면 빈 객체를 만들어져 this에 자동으로 할당되고, this에 새로운 프로퍼티를 추가해 this를 수정하고, 마지막으로 this가 자동으로 반환된다. 생성자의 return문 생성자 함수엔 보통 return 문이 없다. 반환해야 할 것들
객체(object) 자바스크립트는 객체 기반 프로그래밍 언어이다. 그렇다면 객체란 무엇인가? 객체는 0개 이상의 프로퍼티로 구성된 집합으로, 프로퍼티는 key와 value로 구성된다. 객체의 프로퍼티엔 값과 함수 모두 들어갈 수 있다. 값이 함수인 경우에는 method라고 부른다. 객체 리터럴(object literal) 리터럴은 사람이 이해할 수 있는 문자나 약속된 기호를 사용해 값을 생성하는 표기법을 말하는데, 자바스크립트에서 객체를 생성하는 가장 일반적인 방법이 객체 리터럴을 사용하는 것이다. 프로퍼티에 접근하기 마침표로 접근법 대괄호 접근법 대괄호 표기법을 사용할 때는 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 한다. 프로퍼티 값 갱신 이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신된다. 프로퍼티 값 생성 존재하지 않는
저번 글에 작성했던 가게에 대한 정보와, 가게의 좋아요 목록을 가져오는 코드를 서로 영향을 주지 않기 때문에 promise.all을 통해 병렬처리 하여 가져왔다. 하지만 팀원분이 이 코드는 문제없이 동작하지만 Database의 조회 이외의 작업을 할때는 위험한 코드라고 말씀하셨다. 예를 들어 위의 코드를 보자. 가게에 대한 리뷰를 작성하고, 좋아요도 늘려주었다. 위 두 작업은 연관성이 없어 Promise.all로 처리하였다. 하지만 만약 첫번째 가게에 대한 리뷰를 작성만 성공하고 좋아요를 늘리는 작업은 실패하면 어떻게 될까? Promise.all은 전달되는 promise 중 하나라도 거부되면, Promise.all이 반환하는 promise는 에러와 함께 바로 거부된다고 하였다. 하지만 Javascript의 Promise는 취소되지 않기 때문에 에러를 return하는 것이지, 리뷰작성 쿼리는 그대로 계속 수행되어 Database에 저장되어 버리는 것이다. <
async-await은 태스크의 순서가 보장되어야 할 때는 분명 강력하지만, 각각의 태스크가 서로 연관성이 없는 작업일 때는 앞의 작업이 끝날 때까지 기다릴 필요가 없다. 따라서 우리는 이때 다른 방법을 택해야한다. Promise.all Promise.all은 여러 비동기 동작(프라미스)을 하나로 묶어 하나의 promise 처럼 관리할 수 있게 해준다. 배열 안 promise가 모두 처리되면 새로운 promise가 이행되는데, 배열 안 프라미스의 결괏값을 담은 배열이 새로운 promise의 result가 된다. 가게에 대한 리뷰와, 가게에 대한 좋아요 목록들을 DB에서 가져올때 두개가 다른 테이블에 존재한다면 굳이 리뷰 목록들을 가져올때까지 기다렸다가 좋아요 목록들을 가져올 필요가 없다. 이렇게 promise.all을 통해 가게에 대한 리뷰와 좋아요를 동시에 가져올 수 있다. Promise.all에 전달되는 promis
try-catch는 모든 에러를 처리할 수 있을까? 또한 이런 경우 func1~func4번 각각 함수마다 try-catch를 작성해줘야 할까? throw try-catch전에 먼저 throw에 대해 알아보자. 우리는 throw를 통해서 강제로 예외를 발생시킬 수 있다. throw 뒤에 문자열을 적어주면 해당 문자열로 에러를 표시해 준다. 하지만 보통은 throw뒤에 Error객체를 사용한다. Error 객체를 사용하게 되면 에러가 어디서 발생했는지에 대한 정보를 얻을 수 있다. <img src="https://velog.velcdn.com/images/gkqkehs7/post/2899a87f-7956-4421-9999-85
저번 글에서 callback함수에 따른 js의 비동기 처리, 그리고 callback함수의 불편함에 의한 promise의 사용법을 알아보았다. 이번 글에선, 이렇게 만들어진 promise객체를 반환하는 함수를 더욱 직관적으로 만들어 주는 await/async에 대해 알아보자. Promise 이렇게 저번글에서서 Promise객체를 통해 비동기 처리를 하는 법을 알아보았다. promise객체의 반환값은 resolve 또는 reject 에 담기고, resolve시에는 then의 callback함수를 통해, reject시에는 catch의 callback함수를 통해 그 결과물을 확인 할 수 있었다. await/async 개발을 하다보면, 코드의 가독성은 매우 중요하다. 교수님께선 종종 현업에 가면 너가 새롭게 코드를 다 짜는 일은 거의 없고, 코드를 수정해나가는게 대부분이라 하셨고 다른 사람이 작성한 코드를 읽는 것은 매우 중요하다 하셨다. awa
저번글에서 js는 비동기적 아니라 동기적으로 동작하고, web api (nodejs에선 c++ api) 때문에 js가 비동기적으로 동작하는 것처럼 보이는 것을 알았다. 그렇다면, 어떻게 비동기적으로 작동하는 코드를 순차적으로 수행할 수 있을까? 비동기적인 코드를 어떻게 순차적으로 수행할 수 있을까? 저번 글에 따르면 console.log('1') 수행 -> setTimeout은 web api로 이동 -> console.log('3') 수행 -> stack이 다 비워지면, callBack queue에 있던 console.log('2')가 스택으로 이동하여 수행으로 위 코드는 실행 된다. 어떻게 하면 console.log('2')가 console.log('3') 보다 먼저 수행되게 할 수 있을까? callback 정답은 callback함수를 사용하면 된다. callback함수란 무엇일까? 간단하게 말하면 함수에 파라미터로 들어가는 함수이
javascript는 비동기적으로 실행되는가? js는 특정 코드의 실행이 끝나는걸 기다리지 않고 다음 코드를 실행한다. setTimeout을 기다리지 않고 console.log('3')이 먼저 실행되기 때문에. 위 코드는 1 -> 3 -> 2 순서로 콘솔에 찍힌다. 그렇다면 js는 비동기적 실행되는 언어이구나 라는 생각을 하게된다. Javascript는 동기적으로 실행된다. JavaScript (JS)는 기본적으로 동기적으로 실행되는 언어이다. 즉, 코드가 순차적으로 실행되며, 한 작업이 완료될 때까지 다음 작업이 실행되지 않는다. Node.js 관련 글을 보다보면, "js는 싱글 스레드로 작동하기 때문에 대규모 프로젝트에는 어울리지 않는다"라는 글들을 종종 본다. 싱글 스레드라.. 싱글 스레드 운영체제 수업시간에 많이 들었던 단어이다. 싱글스레드는 하나의 프로세스에서 하나의 스레드를 실행하므로, **이는 Node.js 애플리