본문 바로가기

분류 전체보기

(40)
[TypeScript] 중첩된 객체의 값을 타입으로 만들고 싶을 때 중첩된 객체에서 값만 뽑아서 타입으로 만들 수 있을까?🤔      const ENDPOINTS = { AUTH: { SIGN_UP: 'POST /auth/sign-up', SIGN_IN: 'POST /auth/sign-in' }} 만약 이런 형태의 객체가 있다고 해봅시다. 이 객체의 값을 사용하려면 ENDPOINTS.AUTH.SIGN_UP 으로 접근할 수 있습니다. 제가 하고 싶은 것은 이렇게 중첩된 객체에서 value만 모아서 하나의 타입으로 사용하는 것입니다. 수동으로 type Endpoint = 'POST /auth/sign-up' | 'POST /auth/sign-in' | ... 로 선언할 수도 있겠지만, 이 객체의 몸집이 훨씬 더 크다고 할 때는 꽤나 귀찮고 더러운 코드가 될 ..
NestJS에서 createMock으로 단위 테스트 간단하게 작성하는 방법 단위 테스트를 더 간단하게 작성할 수 있는 방법이 없을까...? 🤔   단위 테스트(Unit Test)를 작성하다보면 가장 답답한 부분은 역시 의존성들을 모의(mocking)하는 것입니다.백엔드에서 단위 테스트를 하면 좋을만한 것은 역시 서비스 레이어일 것입니다.저는 NestJS에서 외부 API를 호출하여 알림을 전송하는 서비스(NotificationService)를 만들었습니다.이 서비스의 함수들을 테스트하려면 외부 API를 실제로 연결하지 않고, 마치 연결한 것처럼 모킹하는 과정이 필요했습니다.비즈니스 로직 & 테스트 코드 1. 비즈니스 로직 NotificationService는 ConfigService, HttpService, LoggerService 세 개의 의존성을 가지고 있습니다. 디스코드 ..
세션 기반 인증 vs 토큰 기반 인증, 그리고 쿠키🍪 세션? 토큰? 쿠키? 인증 방식에 대해 이야기할 때 헷갈리는 개념들을 정리해보고자 합니다. HTTP는 무상태!우선 HTTP 프로토콜이 무상태(stateless)라는 것을 이해해야 합니다.HTTP 프로토콜로 웹을 통해 통신해야 할 때, 우리가 보내는 각각의 요청은 독립적입니다.요청이 끝나면 서버는 클라이언트의 정보를 잊어버리고, 요청을 보낼 때마다 클라이언트가 누군지 알려줘야 합니다. 서버에게 요청을 보낼 때 클라이언트가 누군지 알려주는 방식으로 대표적으로 세션과 토큰이 있는 것입니다.세션 인증 방식과 토큰 인증 방식의 로그인 방법에 대해 이야기 해보겠습니다. 세션(session)세션 인증 방식으로 로그인을 하는 과정은 다음과 같습니다.클라이언트는 사용자 인증 정보(예를 들면 유저명, 비밀번호)를 담아서 ..
[TypeORM] bigint가 string으로 변환될 때 문제 상황  TypeORM 공식 문서에서도 나와있듯이, 엔티티를 만들 때 bigint로 컬럼 타입을 지정하면 엔티티로 변환할 때는 string으로 변환됩니다. (PostgreSQL 기준)하지만 이 값을 사용할 때마다 변환하는 로직을 넣기는 귀찮으니, 엔티티로 변환한 시점에 이미 number 라면 사용하기 편할 것 같습니다.Javascript에서 표현할 수 있는 "안전한" 정수의 범위는 -9,007,199,254,740,991 ~ 9,007,199,254,740,991 입니다.하지만 PostgreSQL bigint의 범위는 -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807로 더 크기 때문에 string으로 변환하는 것으로 보입니다.totalAmount 값..
[TypeORM] 왜 엔티티 클래스 프로퍼티를 private으로 할 수 없을까? 문제 상황 TypeORM 사용 중 Entity 클래스의 프로퍼티를 private으로 변경했더니 이런 에러가 발생했습니다. "Property "id" was not found in "Expense". Make sure your query is correct."처음에는 프로퍼티 이름 앞에 언더스코어를 붙여서 매핑이 안 되는 건가 했는데, 프로퍼티를 public으로 해야만 데이터베이스와 객체가 자동으로 매핑되는 것이었습니다.JPA를 사용할 때는 엔티티의 모든 멤버 변수를 private으로 선언하고 getter & setter를 두어 캡슐화를 하여, 엔티티에 비즈니스 로직을 담은 public 메서드를 두어 서비스에서 호출하는 것이 도메인 주도 설계의 정석(?)이라고 알고 있습니다... TypeORM에서도 이와 ..
클린코드 - 6장 🔖 6장 : 객체와 자료 구조읽은 날짜 : 2024.09.04지은이 : 로버트 C. 마틴출판사 : 인사이트 기억하고 싶은 내용자료 추상화변수를 private으로 선언하더라도 각 값마다 getter, setter를 제공한다면 구현을 외부로 노출하는 것이다.클래스는 추상 인터페이스를 제공해서 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 한다. 자료 구조 vs 객체1. 자료 구조자료를 공개하고 아무 메서드도 제공하지 않는다.public class Square { public Point topLeft; public double side;}public class Rectangle { public Point topLeft; public double height; public doub..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 6장 🔖 6장 : 키-값 저장소 설계읽은 날짜 : 2024.09.04지은이 : 알렉스 쉬출판사 : 인사이트 기억하고 싶은 내용키-값 저장소비 관계형 데이터베이스고유 식별자를 키로 가져야 하고, 값은 키를 통해서만 접근할 수 있다.키는 짧을수록 좋고, 값은 무엇이든 된다.e.g. AWS DynamoDB, Redis, Cassandra, BigTable 단일 서버 키-값 저장소가장 직관적인 방법은 키-값 전부를 메모리에 해시 테이블로 저장하는 것.메모리의 한계를 해결하기 위해 아래와 같은 방법이 있지만, 서버 한 대로 부족할 때가 도래한다.데이터 압축자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장 분산 키-값 저장소키-값 쌍을 여러 서버에 분산시킨다.분산 시스템을 설계할 때 CAP 정리를 이해해야 한..
Boyer-Moore 과반수 투표 알고리즘 Boyer-Moore 과반수 투표 알고리즘(Boyer-Moore majority vote algorithm)주어진 후보자 목록에서 과반수를 차지하는 후보를 찾는 알고리즘입니다.배열 내 과반수에 해당하는 원소가 항상 존재한다고 가정하면, 결과값은 항상 과반수 원소가 됩니다.핵심 아이디어는 주어진 후보자 목록에서 두 가지의 서로 다른 후보를 지정하고, 이들을 서로 상쇄시켜 가며 최종 후보를 결정하는 것입니다.시간 복잡도는 O(N), 공간 복잡도는 O(1) 입니다. 동작 방식 입력 시퀀스 요소 m과 카운터 c를 0으로 초기화한다.입력 시퀀스에서 각각의 요소 x에 대해서c == 0이면 m = x, c = 1 대입한다.m == x이면 c = c + 1 대입한다.m != x이면 c = c - 1 대입한다.m을 반환..