일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- type challenge
- Node.js
- javascript
- dp
- typescript
- 백준
- 소켓
- HTTP
- 프로그래머스
- 가천대
- HTTP 완벽 가이드
- Crawling
- Algorithm
- 프로그래머스 레벨 2
- 크롤링
- 타입스크립트
- 자바스크립트
- 알고리즘
- 문자열
- 그래프
- TCP
- Nestjs
- BFS
- ip
- 쉬운 문제
- 타입 챌린지
- 수학
- socket
- 레벨 1
- dfs
- Today
- Total
목록전체 글 (499)
kakasoo
1. 뇌는 가소성이 있어서 인류가 환경에 쉽게 적응하게 도움을 줬다. 뇌의 가소성이 얼마나 뛰어나냐면, 뇌는 이전에 없던 경험이나 감각 등을 정리하기 위해 새로운 영역을 할당하기도 하고, 반대로 기존에 있던 부위가 사고로 인해 절단되는 등 소실되면 그 부분을 담당한 뇌 영역을 다른 영역에 편입시켜, 다른 감각을 더 발달시킨다고 한다. 이런 특성 덕에 시각 장애인이 촉각이나 청각을 통해 사물을 쉽게 인지할 수 있는 것이며, 반대로 후천적으로 장애를 가진 사람 역시도 선천적 장애자와 마찬가지로 낯선 환경에 적응할 수 있는 것이다. 이런 가소성 덕분에 인간은 매우 상이한 환경들 속에서도 자리를 잡고 살아갈 수 있게 되었다고 하는데, 어떻게 보면 이것이 인간만의 독특한 생존 전략일 수 있겠다. 다만 이런 가소성..
싱글턴 패턴은 한 클래스의 인스턴스가 하나만 존재하도록 강제하는 패턴이다. 이런 패턴은 동일한 기능을 하는 여러 인스턴스가 생성되는 것을 막아 메모리 낭비를 줄이기 위해 사용된다. 간혹 우리가 데스크탑의 파일을 여러 번 클릭할 때, 파일이 한 번만 열리는 경우가 있는데 이런 게 싱글턴이다. 다른 객체지향 언어에서는 이걸 구현하기 위해 여러 줄의 코드를 작성하지만, node.js에서는 한 줄로도 된다. export default new (class singleton {})(); node.js에서는 이처럼, 파일에서 다른 파일로 내보낼 때 이미 생성된 인스턴스를 내보내기만 하면 된다. 이러면 어느 파일에서 부르든 동일한 객체를 가져오기 때문에 싱글턴과 동일한 효과를 낼 수 있다. 하지만 자바스크립트는 클래스..
// package.json의 일부 { "dependencies": { "@nestjs/common": "^9.2.1", "@nestjs/testing": "^9.2.1", "typescript": "^4.9.4" }, "devDependencies": { "@types/jest": "^29.2.5", "@types/node": "^18.11.18", "jest": "^29.3.1", "ts-jest": "^29.0.3" }, } 최소한의 라이브러리로 위와 같이 install을 진행했다. NestJS 라이브러리를 만들 것이기 때문에 @nestjs/common과 @nestjs/testing을 install 하였고, typescript를 쓰기 위해 typescript library와 각종 타입, 테스트를 위..
const users = await this .createQueryBuilder('user') .withDeleted() .where('user.id = :userId', { userId }) .andWhere((qb) => { // 지금까지 결제한 횟수를 알기 위해 OrderInfo 라는 Entity를 카운트한다. const subQuery = qb .subQuery() .select('COUNT(*)') .from(OrderInfoEntity, 'oi') .where('oi.userId = :userId', { userId }) .getQuery(); return `${subQuery}
결과는 상황적인 것이고, 우연과 행운이 결합되어 있는 복잡한 현상일 뿐이다. 한 사람의 탁월함 덕에 항상 비즈니스 성과가 좋게 나오는 것은 아니며, 어떤 때는 시장의 상황 때문에, 또 어떤 때는 리더가 아닌, 더군다나 눈에 띄지 않는 누군가의 노력 덕에좋은 성과를 낼 수도 있다. 그래서 가장 중요한 것은 지속력일 수도 있겠다. 통찰력, 흔히 우리가 인사이트라고 일컫는 것보다는, 시장 상황이나 부하, 동료들의 영향을 받지 않는 요소가 장기적으로는 유리한 성질이다. 물론 네 가지 성질은 모두 중요하다. 네 가지 중 하나라도 없다면 리더로 성장하기란 어렵다. 기발한 의견을 제시하면서도 혼자만의 아이디어로 간직하는 사람, 결단은 뛰어나지만 통찰력이 부족한 사람, 의심없이 끝까지 밀고 갈 수 없는 사람 등은, 각..
docker run -it redis install 하는 과정에서 wget 과 같은 커맨드 명령어를 사용해야 한다면, 그 전에 설치할 것들이 생겨난다. 그리고 그런 준비물들을 하나씩 설치하다보면 각각의 프로그램의 의존성으로 인해 에러가 발생하게 된다. 도커는 가상의 환경에 격리하여, 각각의 프로그램을 설치하기 때문에 이런 문제가 발생하지 않는다. 이 가상의 환경을 컨테이너라고 한다. 도커 및 용어 정리 도커란 컨테이너를 사용하여 응용 프로그램을 더 쉽게 만들고 배포하고 사용할 수 있도록 설계된 도구이며, 컨테이너 기반의 오픈소스 가상화 플랫폼이자 생태계. 컨테이너는 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 해주는 소프트웨어의 ..
TAKE으로 데이터를 n개만 조회하기 const [user] = await this.userRepository.find({ take: 1, }); const user = await this.userRepository.findOne(); Repository Pattern에서는 데이터 조회를 위해 find, findOne의 메서드를 지원한다. find는 배열을, findOne은 조건이 일치하는 첫번째 행을 가져온다는 점에서 차이가 있다. 하지만 findOne은 조금 심각한(?) 문제가 있기 때문에 가급적 익숙하지 않다면 사용을 피하는 게 낫다. 따라서 find를 사용하되 take 프로퍼티 값으로 1을 준 후 구조분해할당으로 값을 받는 편이 더 안전하다. findOne에는 어떤 문제가 있는가? TypeORM의..
유저의 배송지 테이블에 address(주소), addressDetail(상세 주소), userId(유저의 아이디) 칼럼이 존재한다. 다만 주소와 상세 주소를 각기 나눠서가 아니라, 하나로 합친 텍스트로 조회를 하고 싶다. 이럴 경우에 사용하는 것이 CONCAT 함수다. SELECT ab. "userId" AS "userId", CONCAT(oi.address, oi. "addressDetail") FROM address_book AS ab; 이 쿼리의 결과는 유저의 아이디와 합쳐진 주소 문자로 이루어진 두 칼럼을 반환한다. CONCAT 함수는 개수 제한 없이 파라미터를 받아, 파라미터를 모두 합친 문자열로 바꿔준다. 그래서 위처럼 두 개의 칼럼보다 더 많은 칼럼을 받을 수 있고, 또한 칼럼이 아닌 단순 ..
테라폼의 기본 개념 요약 resource : 실제로 생성할 인프라 자원으로, 보안그룹이나 EC2 등의 인스턴스를 의미 provider : 테라폼으로 정의할 인트라 스트럭쳐 프로바이더를 의미한다. Azure AWS NCP GCP heroku https://registry.terraform.io/browse/providers output : 인프라를 프로비저닝한 후 생성된 자원을 output으로 뽑는데, 뽑은 이후 remote state에서 활용 backend : output을 저장하는 공간으로, 리소스 최신 상태를 외부에 저장하며, 대표적으로는 AWS S3 remote state : VPC, IAM 등 공용 서비스를 다른 서비스에서 참조할 수 있게 최신 테라폼 상태를 저장한 것. module : 공통적으로..
다대 다 관계를 표현하기 위해서는 연결 테이블이 필요하다. spreadsheet나 excel 등 바둑판 형태의 테이블들을 이용해서 관계도를 표현한다고 해보자. 서로 연결된 대상끼리는 한 쪽이 다른 한 쪽의 행 id를 가짐으로써 관계를 표현할 수 있다. 그런데 두 대상이 서로가 서로를 다수 가질 수 있다면 테이블에서는 이걸 어떻게 표현해야 할까? 정답은 두 시트 사이에 새로운 시트를 하나 두고, 그 시트에게 두 시트의 id만을 가지게 하는 것이다. 두 시트를 가지고는 이 관계를 논리적으로 표현할 수가 없기 때문에 가운데에 이 표현을 도울 테이블을 하나 둔다. 이러한 테이블을 연결 테이블 ( Junction Table ) 이라고 부르는데, 이를 TypeORM로는 이렇게 표현한다. import { Entity..
export interface Type extends Function { new (...args: any[]): T; } NestJS Swagger Library에는 위와 같은 interface가 정의되어 있다. 이 타입은 신기하게도 내부에 new 키워드를 사용하고 있으며, 전개연산자와 제너릭을 모두 쓰고 있다. 이 인터페이스를 어떻게 해석하면 좋을까? 단계를 나눠서 차례대로 설명하면 아래처럼 표현할 수 있다. // NOTE 1 interface MyType extends Function { keyName: 'kakasooFunction'; } 임시로 MyType이라는 interface를 만들었다. 이 인터페이스는 Function 이라는 인터페이스를 확장하여 keyName이라는 프로퍼티를 가지고 있다. ..
특별한 Column Decorator import { ApiProperty } from '@nestjs/swagger'; import { DeleteDateColumn, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'; import { CreateAtEntity } from './create-at.entity'; export class CommonEntity extends CreateAtEntity { @PrimaryGeneratedColumn() id: number; @UpdateDateColumn() updatedAt: Date; @DeleteDateColumn({ nullable: true }) deletedAt: Date; } TypeORM에..