개발할때 제일 많이 사용하는 언어는 Typescript다. Typescript로 Server를 만들려면 Node.js 런타임을 사용해서 구축을 해야하는데 Node.js는 싱글 스레드 기반이다.싱글스레드가 그냥 스레드 하나만 있는것만 알지만 어떻게 동작이되는지 자세히 알
개요 TDD로 개발을 하려다 어떤 식으로 Test Code를 짜내야할지 생각하다 그냥 하던대로 Test Code를 짜놓으면 되는건지 싶어서 정리를하게 되었다. 채용공고들을 보면 많은 회사들이 TDD 개발을 하는 것 같다. 퇴사한 회사도 마찬가지로 TDD 개발을 해왔
TypeORM이나 GORM, Sequelize 등의 ORM을 사용하면서 그냥 DB Query와의 차이가 있을건데 생각을 하지 않고 사용하다가 궁금해서 정리하게 됐다.ORM이 그냥 Query보다는 사용하기 쉬운건 알겠고, ORM보다는 Query가 더 성능이 빠른다. 이런
Node.js를 사용하면서 그냥 싱글스레드 기반의 비동기 처리 방식을 사용한다. 이렇게만 알고 왜 비동기 처리 방식을 하는지는 생각을 안해봤다.그래도 개발자고 Node.js를 사용해서 Server를 만드는데 모르는건 좀 모순인거 같다는 생각이 들어서 정리를 해보게 됐다
개요 기존에 Databse 정규화와 비정규화를 알고 있었다. 하지만 그게 어떻게 사용이 되고 왜 사용하는지 잘 몰랐고, 이직을 준비하면서 알아야할 거 같아서 정리를 하기로 한다. (정규화와 비정규화 둘을 나눠서 정리를 하려한다.) ⚙️ Database 정규화란?
하나의 연산이 끝나야 그 다음 코드가 실행되는 방식이다. 모든 작업이 순차적으로 진행되고, 어떤 작업이 실행중이라면 다음 작업은 대기를 해야한다. (요청을 보낸 후 응답을 받음)동기식 처리 모델은 직렬적으로 Task를 수행한다. 즉, Task는 순차적으로 실행이 되면서
프로세스란 실행중에 있는 프로그램으로 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)다. 스케줄링의 대상이 되는 작업(Task) 과 같은 의미로 쓴다.프로세스 내부에는 최소 하나의 Thread를 가지고 있는데, 실제로는 Thread 단위로 스케줄링을
회사에서 다른 개발자분과 협업하는 도중에 Path Parameter와 Query String의 차이점에 대해서 질문을 받았는데, 제대로 설명을 못 해드려서 정리를 해야겠다는 생각이 들었다.여태 안다고 생각했지만 그냥 이렇게 쓰니까 썼던 것 같다는 생각이 들어서 정리를
HTTP는 Hyper Text Transfer Protocol의 약자로 서버와 클라이언트 모델을 따라 데이터를 주고 받기 위한 프로토콜이다.즉, HTTP는 인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약으로, 80번 포트를 사용하고 있다. 따라서 HTTP는 서버가 8
자료를 논리적으로 정의된 규칙에 의해 효율적으로 관리하는 방법자료구조의 종류는 자료형의 따라서 분류하는 단순 구조, 선형 구조, 비선형 구조, 파일 구조가 있다.단순 구조 자료구조는 정수, 실수, 문자, 문자열과 같은 컴퓨터가 기본적으로 제공하는 자료형을 뜻한다.정수
문제를 해결하기 위한 일련의 절차를 공식화한 형태로 표기한 것으로, 좋은 알고리즘을 만들기 위해서는 다음과 같은 조건을 충족해야한다.입력외부에서 제공되는 자료가 0개 이상 존재한다.출력적어도 2개 이상의 서로 다른 결과를 내어야 한다. 즉, 모든 입력에 하나의 출력이
Promise는 Javascript에서 비동기 처리에 사용되는 객체로 내용은 실행이 되었지만 결과를 아직 반환하지 않은 객체이다.Promise는 3가지의 상태가 있다.Pending (대기)Fulfilled (이행)Rejected (실패)비동기 처리가 완료되지 않았으면
Closure는 Javascript 고유 개념이 아니라 함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서 사용되는 중요한 특성이다. (Erlang, Scala, Haskell, Lisp)위에서 말하는 함수는 반한된 내부함수를 의미하고, 그 함수가 선언될 때 렉시컬
Node.js에서 Module은 필요한 함수들의 집합 을 의미한다. Module은 크게 2가지로 분류를 할 수 있는데, 다음과 같다.core module (built-in module)local module사용하고자 하는 Modle을 불러오는 방법은 아래와 같다.첫번째
단위 테스트는 테스트 가능한 가장 작은 단위로 나누어 예상대로 실행되는지 확인 하는 테스트다.정확하게 정해진 단위는 없다.일반적으로 메소드, 클래스 단위로 진행한다.더 작은 단위로 나눌수록 복잡성이 낮아지고 테스트하기 수월하다.즉, 단위 테스트를 최대한 간단하고 디버깅
정규표현식은 특정한 규칙을 가진 문자열의 집합을 표하는데 사용하는 형식 언어다. 문자열을 처리하는 방법 중 하나로, 특정 조건의 문자를 검색하거나 치환하는 과정을 매우 간편하게 처리할 수 있도록 해주는 수단이다.정규표현식은 패턴을 사용해서 문자열을 처리한다. 기본 원리
호이스팅 (Hoisting) 이란 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 번위의 최상단에 선언하는 것을 말한다. 자바스크립트 함수는 실행되기 전에 함수 안에 필요한 변수값들을 모두 모아 유효 범위 최상단에 선언한다.자바스크립트 Parser가 함수 실행
소스 코드를 컴파일한 후 기계어를 CPU/메모리를 통해 읽어서 실행하는 방식으로 동작하는 언어다. 컴파일을 하기 때문에 규모가 큰 프로그램이라면 컴파일 시간이 오래 걸릴 수 있다.하지만 컴파일 후의 기계어를 통하여 프로그램을 실행하기 때문에 실행 시간은 빠르다. 예시
웹 서버란 HTTP 프로토콜을 기반으로 클라이언트가 웹 브라우저에서 어떠한 요청을 하면 그 요청을 받아 정적 컨텐츠를 제공하는 서버다.정적 컨텐츠란 단순 HTMl 문서, CSS, 이미지, 파일 등 즉시 응답 가능한 컨텐츠다.이때 웹 서버가 정적 컨텐츠가 아닌 동적 컨텐
배열은 정적 자료구조로, 배열을 만들기 위해서는 미리 크기를 정해놓게 된다. 이렇게 정해놓으면 그 크기만큼 연속된 메모리 주소를 할당 받게 된다.연속된 메모리 주소를 할당 받고 있기 때문에 데이터가 Index라는 것을 갖게된다. Index는 array\[0] 이런 식으
gRPC는 Google에서 개발한 어디서나 실행할 수 있는 오픈소스 고성능 RPC 프레임워크다. RPC는 Remote Procedure Call의 줄임말로 원격 프로시저 호출이라고 한다.RPC는 별도의 원격 제어를 위한 코딩없이 다른 주소공간에서 함수나 프로시저를 실행
소프트웨어 개발 방법론 중 하나로 반복적이고 점직전인 개발 방법을 통해서 개발을 진행하는 것을 의미한다. 개발 초기에 고객의 요구 사항을 반영해서 빠르게 개발하고 그 과정에서 지속적으로 피드백을 받아 개발을 진행한다.각 단계는 계획 및 분석 -> 설계 -> 개발 ->
애플리케이션 개발함에 있어서 성능, 생산성, 안정성 모두 뛰어난 애플리케이션을 만들기 위해서는 애플리케이션 설계를 잘하는 것이 중요하다.어떻게 하면 더 나은 애플리케이션을 잘 설계할 수 있는지에 대해 고민하여 얻은 여러 결과물 중 하나가 DDD (Domain-Drive
FireBase는 2014년도에 구글에서 인수한 모바일, 웹 어플리케이션 개발 플랫폼이다.FireBase는 이 모든 플랫폼을 프로젝트에 구축할 때, 자동으로 만들어준다. 서버를 구축하기 위해서 리눅스 명령어를 입력할 필요가 없고, 도메인을 구입할 필요도 없다. 개발하는
SQL을 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제, 검색을 할 수 있다. 관계형 데이터베이스에서는 핵심적인 두 가지 특징이 있는데 다음과 같다.데이터는 정해진 데이터 스키마에 따라서 테이블에 저장된다.데이터는 관계를 통해 여러 테이블에 분산된다.데이터는 테이
디자인 패턴은 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결책이다. 이는 코드에서 반복되는 디자인 문제들을 해결하기 위해 맞춤화 할 수 있는 미리 만들어진 청사진과 비슷하다.쉽게 풀어보자면 개발 방법 중 구조적인 문제 해결에 목적을 두고, 알고리
Class는 ES6에서 JavaScript 생태계에서 공식적으로 도입되었다. Class는 객체지향 프로그래밍의 그 자체이다.객체지향 프로그래밍은 커다란 문제를 Class로 나누고, Class간의 관게를 추가하면서 코드 중복을 최소화하는 개발 방식이다. 클래스 간의 관계
Redis는 key, value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템(DBMS) 이다. 데이터 베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소다.데이터 베이스는 데이터를 물리 디
Nest.JS로 개발하면서 OOP로 구조가 짜여 있었다. 이렇게 프레임워크에서 만들어주지 않고, Express.JS로 OOP를 개발하던 와중에 너무 어렵기도하고, 이해가 안되는 부분이 한 두개가 아니라서 정리를 해보려고한다.우선 구글링을 통해서 알았던 OOP의 장/단점
SQS는 Simple Queue Service의 약자로, 내구력 있고 가용성이 뛰어난 보안 호스팅 대기열을 제공하며 이를 통해서 분산 소프트에어 시스템과 구성 요소를 통합 및 분리할 수 있다.서버들끼리 사용할 수 있는 메시지 큐를 제공하는 서비스로, 해야할 일을 나중에
VPC는 Virtual Private Cloud의 약자로, AWS에서 다른 고객과 완벽하게 논리적으로 격리된 네트워크 공간을 제공하여 프로비저닝하여 가상 네트워크에서 AWS 리소스를 만드는데 사용하는 리소스다.IP 주소 범위 선택, 서브넷 생성, 라우팅 테이블 및 네트
Message Queue는 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중 하나로, 메시지 지향 미들웨어 (Message Oriented Middleware: MOM) 를 구현한 시스템을 의미한다.메시지 지향 미들웨어란? 비동기 메시지를 사용하는
이직한 회사에서 REST API나 gRPC를 사용해서 클라이언트와 통신을 하는 것이 아니라, GraphQL을 이용해서 통신을 한다.GraphQL을 찍먹도 아닌 핥아보기만 한 나는 공부를 시작하고 작은 어플리케이션을 만들어보면서 궁금한 점들이 생겨서 해당 내용들을 정리를
Elastic Beanstalk은 Go, Java, .NET, Node.js, PHP, Python 및 Ruby에서 개발된 어플리케이션을 지원한다.어플리케이션을 배포할 때, Elastic Beanstalk가 선택된 지원 가능 플랫폼 버전을 구축하고, Amazon EC2
CodeDeploy는 AWS에서 제공하는 배포 자동화 서비스다. CodeDeploy는 애플리케이션 코드의 변경 사항을 여러 개의 서버 인스턴스에 자동으로 배포할 수 있도록 도와준다.CodeDeploy를 사용하면 소프트웨어 배포 프로세스를 자동화하고, 배포 중에 발생할
"??" 는 변수가 null 또는 undefined인 경우 대체 값을 지정하는데 사용하는 논리 연산자이다.이 연산자는 왼쪽 피연산자가 null 또는 undefined일 때만 오른쪽 피연산자를 반환한다. 그 외의 경우는 왼쪽 피연산자를 반환한다.코드로 예시를 들자면위 예
SQL의 IN 절은 특정 열이나 값이 주어진 목록에 포함되어 있는지를 확인하는 조건절이다. IN 절은 여러 개의 값을 비교할 때 사용되며, 주로 WHERE 절과 함께 사용된다.위 예시를 보면 table_name은 데이터를 가져올 테이블의 이름이고, coulmn_name
forEach는 배열의 각 요소에 더해 주어진 CallBack 함수를 실행한다. 배열을 순회하며, 각 요소를 순차적으로 처리한다.리턴값이 없고, 원본 배열을 변경하지 않는다. break문을 사용해서 중간에 순회를 멈출 수 없다.map은 배열의 각 요소에 대해 주어진 C
Typescript에서 class를 사용할 때, constructor를 사용해서 의존성 주입을 수행한다.의존성 주입은 class가 다른 class나 객체를 사용할 때, 해당 의존성을 class 외부에서 주입하여 결합도를 낮추고 유연한 코드를 작성하는 방법이다.이때, 의
reduce는 Javascript 배열의 메서드 중 하나로, 배열의 각 요소들을 순회하면서 누적값을 계산하는 기능을 제공한다.reduce 메서드는 배열을 순회하면서 요소들을 하나씩 처리하여 누적된 값을 반환한다.callback: 각 요소를 처리하는 함수로, 4개의 매개
Object.assign()은 Javascript에서 객체를 병합하거나 복사할 때 사용되는 메서드다. 이 메서드를 사용하면 하나 이상의 소스 객체의 속성을 타깃 객체로 복사할 수 있다. 즉, 소스 객체의 속성을 타깃 객체에 병합하거나 덮어쓰는 역할을 수행한다.Objec
git merge와 git rebase는 둘 다 브랜치를 병합하는 데 사용되는 Git 명령어이다. 그러나 두 명령어의 작업 방식과 결과가 다르다.git merge는 현재 브랜치와 다른 브랜치의 변경 사항을 하나로 합치는 병합 작업을 수행한다. 주요 특징은 아래와 같다.
Cloud SQL은 GCP(Google Cloud Platform) 에서 제공하는 완전 관리형 관계형 데이터베이스 서비스다. 이 서비스를 사용하면 MySQL, PostgreSQL 및 SQL Server와 같은 관계형 데이터베이스를 클라우드에서 배포, 관리 및 확장할 수
VARCHAR와 TEXT는 데이터베이스에서 문자열 데이터를 저장하는 데 사용되는 데이터 타입이다. 이 두 타입은 목적과 사용 사례에 따라서 선택이 되며, 성능과 저장 용량 등 여러 측면에서 차이가 있다.VARCHAR는 가변 길이 문자열 데이터 타입이다. 즉, 문자열 길
Docker Container 삭제 동작중인 Container 확인 정지된 Container 확인 Container 삭제 Container 삭제 확인 여러 Container 삭제 모든 Container 삭제 Docker Image 삭제 Image 확인
get과 set은 Class 내에서 속성을 읽고 쓸 때 사용되는 특별한 메서드다. 이런 기능을 사용하면 객체의 속성에 접근하는 동작을 Customize하고 추가 동작을 수행할 수 있다.Getter는 Class 내의 속성 값을 읽을 때 호출되는 메서드로 아래와 같이 정의
Eager Loading은 TypeORM에서 Entity 간의 관계를 로드 하는 방법 중 하나로, 만약에 사용자 User와 그 사용자의 게시물인 Post간의 관계를 보면위와 같이 정의를 하면 자동으로 Eager Loading 설정을 통해 사용자를 검색할 떄, 관련 게시
이번 글에서는 백엔드 개발에서 기본적으로 사용되고 있는 Repository, Service, Controller를 정리해보고자 한다. 일반적으로 다들 이러한 패턴을 사용하니까 사용했던게 커서 정리를 하려고 한다. Repository, Service, Controlle
회사에서는 PostgreSQL로, 개인 연습용 프로젝트는 MySQL로 이렇게 사용하고 있는데, 이 둘의 차이점이 이름만 다르지 실제로 와닿지가 않아서 PostgreSQL을 회사 1년가까이 다니면서 많이 사용했기에시간이 흐른 뒤 차이점을 보면서 정리를 해보려한다.MySQ
개발을하다가 Class에 Constructor가 함수 처럼 밖에서 사용할 때 매개변수처럼 느껴져서 이게 맞는건지 확실히 체감을 못하여 정리를 하게 됐다.constructor는 Class 안에서 아니면 다른 다른 Class에 상속한 경우에는 해당 Class 내부에서 사용
개발을 하면서 Class에 대한 개념을 겉핥기 식으로만 알고 개발을하니 스스로의 문제점들을 발견했다.Constructor가 뭐고 Class를 대체 왜 사용하는지 이런 것들이 궁금해서 예전에 정리했던 것들을 잊은 채 아무것도 몰랐던 그때로 돌아가 한번 다시 알아보려고 한
Express로 개발하면서 TypeScript로 OOP 개발을 하고 있다. 하면서 이 둘은 잘 맞는지 의구심이 들어서 정리를 하게 되었다. Class도 알겠고, OOP도 알겠는데 JavaScript에서는 어떻게 해야할지 감이 잘 잡히지 않았다.JavaScript도 객체
Nest.JS로 개발하면서 OOP로 코딩을 했던 거 같은데 짜여져 있는 틀 말고 Express.JS로 OOP를 개발하던 와중에 너무 어렵기도하고, 이해가 안되는 부분이 한 두개가 아니라서 정리를 해보려고한다.우선 구글링을 통해서 알았던 OOP의 장/단점 중 장점인 캡슐
사이드 프로젝트를 하면서 Express를 사용하고 있다. 저번에 회사에서 개발할 때 Nest.js를 쓰면서 Strategy를 구현하고 이것이 Middleware랑 비슷하다고 생각했다.Nest.js에서는 Strategy를 구현하면 어떻게 동작하게 되는지 이해가 갔지만 E
npm은 Node Package Manager의 약자로 Node.js를 설치할 때 자동으로 설치되는 기본 패키지 관리자이다. 여기서 크게 두 가지의 역할을 수행한다.온라인 플랫폼 역할을 한다. 사람들이 노드 패키지를 만들고, 업로드하며 공유할 수 있는 공간으로 누구든지
많은 사용자가 접속해도 감당하기 위한 작업을 따로 하지 않아도 된다.저장할 수 있는 파일 수의 제한이 없다.최소 1바이트에서 5TB의 데이터를 저장하고 서비스 할 수 있다.파일에 인증을 붙여서 무단으로 액세스를 못하게 할 수 있다.HTTP와 BitTorrent 프로토콜
사이드 프로젝트를 하다가 Oauth라는 것을 알게 됐다. 소셜 로그인 기능 구현 전에 Oauth 개념에 대해서 알아보기 위해서 공부를 하고 넘어가려고 한다.Oauth1은 알려진 보안 이슈에 대해서 Oauth1 말고 Oauth2를 소개하려고 한다.Oauth란 사용자가
개발을 하다가 Repository와 Service의 차이점에 대해서 궁금점이 생겨서 알아보게 되었다. 기존에 내가 알기로는 Repository는 DB와 직접적으로 작업되는 로직이고 Service는 Business Logic이라는데,, 코드리뷰를 받아보니 너무 이렇게 하
양방향 통신 (Full - Duplex)데이터 송수신을 동시에 처리할 수 있는 통신 방법클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받을 수 있다.통상적인 HTTP 통신은 Client가 요청을 보내는 경우에만 Server가 응답을 하는 단방향 통신이다.실시간 네
회사에서 개발을 할 때 우리의 개발은 MSA로 진행이 된다. 입사 초반에는 MSA가 뭔지, 왜 굳이 이렇게 나눈건지 신경쓸 일 없이 얼른 코드를 짜서 배포하느라 바빴다.이번에 개발을하고, 서버팀 규모도 커지면서 공통적인 코드가 많아진 느낌이라 오히려 MSA가 독인 거
사이드 프로젝트 개발을 하다가 Cookie, Session도 있는데 왜 굳이 JWT를 사용하는지 이걸 사용하면 어떻게 동작을 하는지 궁금해졌다.여태 회사에서도 혼자서도 개발할 때 다 쓰니까 JWT를 썼던 거 같은데 이제 조금 개발에 대해서 알아야하는게 많아지다 보니 궁
회사에 점점 더 프로젝트에 참여하는 인원들이 증가하고, 회사에서 새로운 개발문화 gitFlow를 도입하면서 서로 작업한 코드를 PR을 올리게 됐다.현재 회사에서 프로젝트는 nestJS를 사용하고 있다. 하지만 PR을 올리고 코드리뷰를 하면서 eslint와 같은 이슈들이
최근에 회사에서 갑작스러운 트래픽으로 서버가 다운됐었다😢 상황을 정리하자면 현재 회사는 Elastic Beanstalk(이하 EB)을 사용하고 있고, EB를 사용해서 ALB, EC2, Auto Scaling을 하고 있다.그런데 여기서 Auto Scaling 하는 과정
Dockerfile로 Node.js 어플리케이션을 말아서 docker-compose를 사용해 DB도 같이 띄우려고 docker-compose up --build 명령어를 실행하는 도중에err: exec: "docker-credential-desktop" 라는 에러가 발
Spring Boot를 이용해서 Spring Security 실습을 하는 도중 JWT 발급 관련해서 아래와 같은 에러가 발생했다.Unable to determine a suitable MAC or Signature algorithm for the specified ke