전체 글 132

NestJS

NestJS NodeJS에 Decorator와 Reflection 기능을 기반으로 작동하는 서버 사이드 프레임워크다. IoC, DI를 채용한 객체 지향 프로그래밍으로 프로젝트 유지 보수성이 뛰어나며 모듈과 컴포넌트 기반의 코드 작성으로 재사용성과 복잡한 프로젝트 폴더 관리에 용이하다. 타입스크립트가 기본 언어지만 바벨을 사용해 자바스크립트로 작성 가능하다. 내부적으로 Express 또는 Fastify 프레임워크를 Rapping 한다. 기본적으로 Express를 사용하는데 이는 범용적 측면과 미들웨어 호환성을 고려한 이유다. Express와 Nest Express는 미니멀 리스트다. Nest와 다르게 웹 프레임워크가 기본적으로 제공해야 할 대부분의 기능을 사용자가 직접 구현해야 한다. 장점으로는 특정 아키..

서버/Nest 2022.11.19

TypeScript 인터페이스와 타입의 차이

interface와 type을 무지성으로 사용하다 둘의 차이가 궁금해졌다. 사용 interface와 type의 기본적인 사용법은 다음과 같다. interface IPost { title: string; content: string; author: number; createdAt: string; } type TPost = { title: string; content: string; author: number; createdAt: string; } const postInterface: IPost = { title: "게시글 제목", content: "게시글 본문", author: 1, createdAt: new Date().toISOString(), }; const postType: TPost = { tit..

트랜잭션 격리 수준에 따른 문제점

평소 트랜잭션을 사용하면서 ACID 특징 정도만 알고 있었는데 격리도 수준에 따라 나누어지고 수준에 따라 발생할 수 있는 문제점들이 있다니 서버 개발자는 공부할 게 정말 많은 거 같다. 데이터베이스는 공부를 하면 할수록 매우 생소한 개념들이 나온다. 하지만 몇 번 읽어보면 이해가 가서 재밌다 트랜잭션 격리 수준은 트랜잭션 격리가 성공하는 정도의 측정값을 의미한다. 다른 말로 트랜잭션들의 고립의 정도를 나타내며 서로 다른 트랜잭션끼리 변경된 데이터를 볼 수 있도록 허용 여부를 결정해야 한다. ACID 특성 중 격리성(Isolation)이 완벽히 보장되려면 거의 순차적으로 실행되어야 하는데 이렇게 되면 성능이 매우 저하된다. 격리성은 격리 수준을 4단계로 나누어 격리성을 보장한다. 격리 수준 커밋 되지 않은..

데이터베이스 2022.11.14

TypeScript any unknown

any any는 어떠한 타입도 할당받을 수 있는 타입이다. 컴파일 과정에서 타입 검사가 되지 않으며 any를 사용하는 타입스크립트는 소위 애니스크립트라고도 불린다. 사용자로부터 받은 데이터 또는 외부 라이브러리 사용 시 응답 값이 동적일 경우 종종 사용한다. 타입스크립트는 데이터의 자료형을 명시해 타입 안정성을 보장받기 위해 사용 하는데 any를 사용한다면 자바스크립트와 다를 게 없으므로 최대한 지양해야 한다. 넘버 타입의 사용 가능한 toFixed 메서드를 문자열 타입에 사용하려고 하니 에러가 출력된다. 이처럼 변수에 올바른 자료형을 명시한다면 코드 작성 단계에서 에러를 발견할 수 있다. any 타입을 할당하게 되면 컴파일러는 language라는 변수가 모든 자료형이 될 수 있다고 추론한다. 이런 경우..

AWS IAM

AWS IAM 평소 구글링을 통해 무지성으로 사용해온 IAM에 대해 포스팅한다. IAM(Identity and Access Management)은 AWS 서비스와 리소스에 대한 액세스를 안전하게 관리할 수 있는 서비스다. AWS 사용자 또는 그룹을 만들고 관리하며 AWS 리소스에 대한 액세스를 허용/거부할 수 있다. AWS 서비스 전반적으로 언제, 어디서, 누가, 어떻게, 뭘 할 수 있는지 육하원칙의 왜를 제외한 모든 접근을 컨트롤할 수 있다. 모든 접근은 정책을 통해 관리되며 사용자 또는 역할에 부여할 수 있다. 특징 AWS 어카운트, 리소스, 사용자의 권한을 제어할 수 있으며 서비스 사용을 위해 인증 정보를 부여 사용자의 생성과 관리 계정의 보안 설정을 담당하며 일정 시간마다 패스워드가 변경되도록 하..

클라우드 2022.11.10

TypeScript 사용 이유와 컴파일 과정

TypeScript 사용 이유 타입스크립트를 사용하면 왜 두 번 다시 자바스크립트로 돌아갈 수 없는지에 대해 포스팅한다. 백이나 프론트나 자바스크립트 관련 채용 공고를 조금만 보아도 자바스크립트를 메인으로 사용하는 회사는 거의 없다. 올해 초 개발 공부 시작 당시 타입스크립트가 우대사항인 기업들이 있었는데 요즘은 우대가 아닌 필수다. 특징 1.정적 타입의 컴파일 언어 인터프리터 언어인 자바스크립트와 다르게 타입스크립트는 컴파일 언어이다. 컴파일이란 타입스크립트 코드를 자바스크립트 코드로 변환되는 과정을 의미한다. 자바스크립트는 런타임 단계 즉 노드나 브라우저를 통해 코드를 실행을 해봐야 에러가 있는지 없는지 알 수 있다. 반면 타입스크립트는 컴파일 단계 즉 코드 작성 단계에서 에러를 감지할 수 있다. 2..

동기와 비동기 블로킹과 논 블로킹

자바스크립트는 싱글 스레드 기반 언어다. 이론적으로 여러 작업을 동시에 처리할 수 없으며 하나의 콜 스택과 실행 컨텍스트를 가진다. 한 번에 하나의 코드만 실행할 수 있으며 만약 브라우저에서 사용자의 요청을 모두 동기 방식으로 처리하면 어떨까. 하나의 작업이 실행되어 완료되는 시점까지 다른 그 어떤 작업도 실행될 수 없으므로 말이 안 된다. 자바스크립트가 싱글 스레드임에도 논 블로킹 비동기 작업이 가능한 이유는 이벤트 루프다. 이벤트 루프와 밀접하게 연관돼있는 동기와 비동기 블로킹과 논 블로킹을 포스팅해보자! 동기와 비동기 블로킹과 논 블로킹 보통 동기/블로킹 & 비동기 논/ 블로킹으로 많이 알려져있지만 각각의 단어가 의미하는 내용이 다르므로 명확히 짚고넘어간다. 동기/비동기: 프로세스 실행 순서 보장에..

네트워크 2022.11.02

MySQL 옵티마이저

MySQL 옵티마이저 Real MySQL 서적에 나오는 일부분으로 조만간 알라딘으로 달려간다!!!! 데이터베이스의 두뇌와 같은 역할로 쿼리의 실행 계획을 생성하는 관계형 데이터베이스 내부 핵심 엔진이다. 쿼리의 결과는 같지만 우리가 모르게 내부적으로 결과를 만들어내는 방법은 매우 다양하다. 옵티마이저는 이러한 다양한 방법 중 어떤 방법이 최적이고 최소한의 비용으로 실행될지 결정한다. 쿼리가 최적으로 실행되기 위해 테이블별로 어떤 데이터가 어떠한 형태로 저장돼있는지를 참조하고 참조한 데이터를 기반으로 최적의 실행 계획을 수립한다. 쿼리 실행 절차 MySQL 서버에서 쿼리가 실행되는 과정은 크게 3단계로 구분된다. SQL 파싱(파스 트리) SQL 쿼리문을 쪼개어 MySQL Server가 이해할 수 있는 수준..

데이터베이스 2022.11.01

TypeScript const assertion

TypeScript const assertion 상수를 쉽게 관리하고 가독성을 높이기 위해 제공하는 타입스크립트 기능이다. 타입 추론의 범위를 좁히거나 서로 연관된 상수들을 하나의 네임스페이스로 관리해야 할 경우 유용하게 사용 가능하다. 그동안 무지성으로 as 키워드를 붙여 사용하곤 했었는데 이번 기회에 확실히 이해하게 되었다! 리터럴 타입 리터럴 타입이란 변하지 않는 데이터를 의미한다. 타입스크립트는 원시 타입(string, number 등) 외에 특정 값을 타입으로 지정할 수 있다. 변수 let을 선언 후 문자열을 할당하면 타입스크립트는 string이라는 문자열로 타입을 추론한다. 리터럴을 이용해 타입 지정 후 지정한 타입의 다른 값을 입력할 경우 컴파일 에러가 발생한다. 원인은 let은 재할당이 가..

ExpressJS typedi

ExpressJS typedi 의존성 주입(Dependency Injection)은 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉이며 코드를 구조화하는데 사용되는 패턴이다. 생성자를 통해 클래스와 함수의 의존성을 주입하는 방식으로 모듈 안에서 클래스를 불러오거나 새로 생성하는 걸 피할 수 있으며 객체 지향적 아키텍처 설계를 통해 유지 보수성을 높일 수 있다. 의존성: 함수, 클래스 등이 내부에 다른 함수, 클래스를 사용 주입: 함수, 클래스 등이 내부에 사용하는 다른 함수, 클래스를 내부에서 생성하는 게 아닌 외부에서 생성하여 넣어줌 의존성 다음은 User 클래스가 Attack이라는 클래스에 의존하고 있는 코드다. class Attack { public normalAttack() {} } class..

서버/Express 2022.11.01