전체 글 291

[NestJS] Dependency Injection과 NestJS

최근들어 비교적 삶이 한가해져서, 미루기만 했던 지식들을 정리하는 시간을 가지기로 했다. 이번 포스트에서는 DI (Dependency Injection)과 NestJS에서 해당 기능을 사용하는 방법에 대해서 정리해 볼려고 한다. Dependency Injection 이란? 정의부터 알기 전에, 각 단어에 대해서 알아보자. Dependency는 의존성, Injection은 주입 이라는 단어이다. 각 단어에 대해서도 간단히 정리하자. 의존성 의존 관계를 가지는 것이다. 아래 TS 코드로 확인해 보자. class Human { meal = new Meal(); } class Meal {} 위 코드에서 Human 클래스는 Head 클래스를 내부에서 사용하게 되므로, Human 클래스는 Meal 클래스에 의존 관..

CORS 정리하기

얼마전에 제작한 웹사이트에서 다른 사이트에 axios 요청을 보낼 때 마다 "axios has been blocked by CORS policy" 에러가 계속 떠서 난감했던 적이 있다. 찾아보니 CORS에 관한 문제였는데, MDN을 보고 간단히 정리해 보려고 한다. MDN에 설명이 잘 되어 있드라. 정의 교차 출처 리소스 공유 (Corss-Origin Resouece Sharing)의 약자이다. 이게 생긴 배경부터 정리하면, A.com 사이트에서 B.com에 있는 데이터를 요청할 때 두 개의 사이트는 다른 도메인을 가지고 있으므로, 정상적으로 A.com 사이트에서 B.com 사이트에 데이터를 요청할 수가 없다. 이는 아래 그림으로 잘 설명이 되어 있다. domain-a 사이트에서 domain-a의 웹서버..

개발 지식/웹 2022.10.24

로그인 인증 부수기

최근들어 유저의 인증 로직 관련해서 보완해야 할 점이 보여서 수정 중, 이참에 로그인 인증 관련해서 한번 정리해 보고자 글을 작성한다. 배경 지식 먼저 인증과 인가에 대해서 구분을 하자. 인증(Authentication)은 클라이언트가 주장하는 사용자가 맞는가를 검증하는 과정이다. 인가(Authorization)은 인증 이후에 하는 작업으로, 인증된 사용자가 접근할 수 있는 자원의 확인 절차이다. 예를 들자면 로그인 자체는 인증에 해당된다. 내가 이 서비스의 회원이다는 것을 서버에 요청하고, 이를 확인하는 것이 인증이다. 인증 이후에 내가 게시물을 작성한다면, 나와 관리자를 제외한 다른 유저는 내 게시물을 수정하거나 삭제할 수 없다. 이것이 인가이다. 다음으로 HTTP의 비연결성과 무상태성에 대해서 정리..

개발 지식/웹 2022.10.23

로컬 환경에서 외부 요청 받기

요즘 서버리스 프레임워크로 간단한 웹서버를 만들고 있다. 슬랙과 연동해야 하는 작업이 있는데, 슬랙에서 사용자의 요청을 웹 서버에서 인식하기 위해서는 외부로 노출된 주소와 포트가 필요하다. 그래야 연동을 할 수 있다. 서버는 있는데 외부로 노출을 시키지 못하면, 아무것도 할 수가 없기 때문이다. 로컬에서 외부로 주소를 내보낼 때는 포트포워딩을 통해서 보내야 하지만, 개인 공유기가 아닌 곳에서는 포트포워딩을 하기가 거의 불가능하다. 그래서 디버깅 하기 매우 힘든데, 로컬 환경을 외부로 노출 시켜주는 매우 좋은 툴이 있었다. 이걸 왜 지금 알았을까;; ngrok 사용하기 일단 이 프로그램을 사용하면 로컬의 특정 포트를 외부로 노출할 수 있다. https://ngrok.com/ ngrok - Online in..

IT 이야기 2022.10.20

Python 코딩테스트 준비하기

파이썬 코딩테스트도 준비해야 해서 vscode로 코딩테스트에 최적화된 환경을 만들어 볼려고 한다. 앞에서 작성한 JS 코딩테스트 준비 과정이랑 많이 유사하다. https://tre2man.tistory.com/314 JS 코딩테스트 준비하기 최근에 코딩테스트를 보면서 알고리즘이 말도 안되게 부족하다는 것을 많이 느꼈다. 그래서 외부 에디터를 사용할 수 있는 환경이라는 상황에서 코딩 결과물을 빠르게 확인할 수 있는 환경을 tre2man.tistory.com Python 코딩테스트 환경 꾸미기 코딩테스트는 역시 빠르게 결과물을 내는 것이다. 여기서도 nodemon을 사용할 것이다. 아니 잠깐, nodemon은 nodejs에서 사용하는 프로그램 아닌가요? 할 수가 있는데, npm으로 관리되는 프로그램이라 파이..

자동 배포 환경 Github Action으로 이전하기

현재 서버 배포 환경은 Jenkins를 사용해서 하고 있다. 처음에는 내가 직접 인스턴스를 만들어 상세히 커스텀을 할 수 있다는 점이 좋았는데, 이게 시간이 지날수록 서버를 직접 관리해야 한다는 점이 단점으로 크게 다가왔다. 그래서 자동 배포 관련한 기능을 찾아보니, 나의 목적에 잘 맞는 Github Action이라는 서비스가 있어서, Jenkins에 있는 배포 환경을 Github Action으로 이전하기로 했다. Github Action이란 간단히 말하면 테스트, 빌드, 배포 등의 활동들을 Github 내에서 자동으로 설정할 수 있는 도구이다. 그냥 CI/CD 도구 중 하나인데, Github와의 연동성이 매우 좋은 도구라 보면 된다. 거기에 다양한 플러그인 및 확장 프로그램까지 지원하여 꽤 괜찮은 도구..

심심해서 그냥 끄적이는 나의 개발환경

나는 주로 NodeJS 기반의 서버를 개발하는 사람이다. qt, flask, serverless 등의 프레임워크를 사용했지만, 지금 주로 사용하는 것은 NestJS다. 이에 맞게 나의 개발환경은 주로 Typescript를 사용하는 것에 초점이 맞춰져 있다. 여기에 하드웨어는 맥북을 사용하고 있다. 역시 개발은 맥북으로 해야 퍼포먼스가 나는 것 같다. 사실 스타벅스 출입증이 생겨서 카페갈 때 자신감이 생긴다. 여튼 영세한 일반 개발자인 나는, 개발환경 이라도 잘 구축해야 그나마 생산성이 난다고 생각해서 이것저것 주워들은걸로 개발환경을 좀 꾸며놨다. 그래서 그런지 나한테는 그럭저럭 개발할 만한 환경이 되어 있다. MAC 환경 맥북을 개발도구로 쓴다는 것은 좋은 선택임과 동시에, 한글 작업에 강제 억제기를 다..

IT 이야기 2022.10.06

RDS Postgresql 로컬에서 실행하기

RDS에 있는 데이터를 가져와야 하는데, 여러가지 제한 사항 때문에 시간이 많이 걸리는 쿼리를 10억회 이상 날릴 일이 생겼다. 그래서 쿼리 속도 향상을 위해 DB 전체를 로컬로 가져와서, localhost로 쿼리를 날리는 방법을 선택했다. 이를 위해 RDS에 있는 데이터를 로컬에서 처리하기 위한 방법을 기록해 볼려고 한다. 여기서는 pg_dump 명령어를 사용할 것이다. 덤프란? 덤프는 .sql 형식의 파일이며, 데이터베이스의 데이터를 sql 구문으로 출력된 파일을 덤프라고 한다. 이걸 이용해서 데이터를 백업하거나 파일로 저장, 복구할 수 있다. Mac 환경 기준, brew install postgresql 명령어를 통해 psql을 미리 설치해두자. 데이터 가져오기 pg_dump -h [주소] -p [..

서버 인프라/DB 2022.09.27

JSON 데이터 엑셀로 저장하기

최근 Node환경에서 데이터를 받아와 excel로 저장하는 로직을 구현해야 해서 라이브러리를 찾아보니, 압도적으로 많이 사용하는 SheetJS (xlsx) 라이브러리가 있었다. 하지만 해당 라이브러리는 xlsx를 stream을 사용해서 저장할 수 없었기에, stream을 지원하는 exceljs를 사용하기로 했다. 내가 뽑으려는 데이터의 row가 100만개 이상이고, nodejs의 메모리를 초과하기에 충분히 큰 데이터였기에 stream을 지원하는 라이브러리를 사용하게 되었다. Stream을 사용하는 이유 파일을 로컬에 쓰거나 로컬에 있는 파일을 가져올 때, 이는 메모리에 적재가 된다. 만약 메모리 한계보다 더 큰 파일을 처리해야 될 때는 당연히 프로그램이 터진다. NodeJS의 메모리 한계는 1.9GB이고..