본문 바로가기

분류 전체보기

(267)
[typescript] ts2345 클라우드 강의 마지막 발표를 위해 기존에 aws 기반으로 구성한 뉴스 댓글 수집 파이프라인을 azure 기반으로 마이그레이션 하고 있다. 이 과정에서 뉴스 데이터를 수집할 때 타입 선언으로 정의한 내용이 있어 인터페이스로 변경해보았는데, 다음과 같은 에러가 발생했다. // 인터페이스로 변경한 타입 interface NLListOptions { query: string; ds: string; de: string; news_office_checked?: string; office_type?: string; mynews?: string; }; // 해당 객체를 이용하는 함수 export async function getNewsLinkList( variable_options: NLListOptions, dela..
[graphql] graphql N+1 문제와 prisma ORM의 해결 방식 Query optimization | Prisma Docs Query optimization How Prisma optimizes queries under the hood www.prisma.io graphql은 resolver을 적절히 연결하고, 이를 결합하여 한번의 요청으로 많은 데이터를 가져올 수 있다. 이때 resolver이 동작하는 과정에서 N+1 문제가 발생하므로, 이를 처리하기 위한 적절한 방법이 요구된다. N+1 문제 1번의 쿼리를 이용하여 A 엔티티를 N개 가진 배열을 읽어왔을 때, A엔티티에 대한 연관 관계 B 엔티티를 가져오기 위해 N번의 쿼리를 추가로 수행하는 상황이다. 간단하게 생각하면, 아래처럼 동작하는 상황이 N+1이라고 볼 수 있다. const users = db.user.f..
[데이터베이스] 트랜잭션 https://en.wikipedia.org/wiki/Isolation_(database_systems) 트랜잭션 하나의 논리적 동작을 정상적으로 수행하는데 필요한 DB 연산들을 모아놓은 데이터베이스 시스템 작업의 기본 단위 ACID 원칙 트랜잭션이 가진 4가지 특성 특성 설명 달성 방법 Atomicity (원자성) 트랜잭션 구성 연산은 모두 실행되거나, 하나도 실행되지 않아야 한다. 장애로 인해 연산이 중단되면 트랜잭션 수행 이전으로 작업을 되돌릴 수 있어야 한다. All or Nothing Commit / Rollback Consistency (일관성) 트랜잭션 성공 전·후에 대한 일관성을 유지해야 한다 (완료 시점에 일관된 상태). ex) 계좌 이체 시 총 금액은 일치해야 함 무결성 제약조건 동시성..
[기록] JWT 로그인 & redis Redis https://redis.com/ Remote Dictionary Server의 약자로, key - value 형식의 데이터를 저장하는 NoSQL DBMS의 일종이다. 메모리 기반으로 동작하기 때문에 속도가 매우 빠르다는 것이 장점이다. 우리가 아는 많은 데이터베이스들은 파일시스템에 데이터를 저장한다. CPU는 메모리에 올라온 데이터만 읽을 수 있으므로 특정 데이터를 요구하려면 파일 시스템 → 메모리 → CPU의 과정을 거쳐야 하는데, redis는 파일 시스템 접근이 없으므로 속도가 매우 빠르다. 파일 시스템 상에 백업하는 기능도 지원한다. 다양한 요구사항을 만족할 수 있도록 여러 가지 자료구조도 기본으로 제공한다. https://redis.com/redis-enterprise/data-str..
[오늘의 삽질] local 환경에서의 docker & Error: connect EHOSTUNREACH https://betterstack.com/community/guides/scaling-nodejs/nodejs-errors/#8-ehostunreach EHOSTTURNREACH 에러는 소프트웨어가 네트워크 / 호스트에 대한 경로를 찾지 못해 TCP 연결에 실패했음을 의미한다. 이 에러가 발생하는 경우 방화벽 등에 의해 트래픽이 차단된 것일 수 있으므로 방화벽 시스템이나 인바운드 규칙 등을 살펴보라고 한다. 로컬의 다른 어플리케이션으로는 연결이 되지만, docker 컨테이너 환경에서만 유난히 동작하지 않는 경우 docker 환경 자체에 에러가 발생한 것일 수 있다( 특히 window 환경이라면 ). 컴퓨터 또는 도커 환경을 재부팅해보자. 윈도우: docker desktop을 재시작한다. 다른 환경: s..
[기록, typeorm] ROW NUMBER + 서브쿼리로 대표 댓글 가져오기 ORM이 지원하는 메서드들이 편리하긴 하지만, 쿼리가 조금만 복잡해지면 직접 SQL 문을 작성해야 하는 경우가 많다. 최근 진행되는 팀 프로젝트에서 댓글을 가져오기 위해 TYPEORM이 지원하는 간단한 메서드 수준에서는 처리할 수 없는 동작이 요구되었다. 요구사항은 다음과 같다. 감정 별 대표 댓글 가져오기: 특정 기간(from, to) 내 감정 별로 공감 수가 최대인 댓글 하나씩 가져온다. 요점은 1. 특정 기간 내, 2. 감정 별, 3. 공감 수 최대에 있다. 감정 별로 묶은 후 공감 수에 대한 순위를 따져야 하므로 ROW_NUMBER을 이용해야 하는데, TYPEORM 수준에서 지원되는 기능은 아니므로 querybuilder을 이용하여 SQL문에 가까운 쿼리를 작성할 필요가 있다. 위 요건을 SQL문..
[nest.js & docker] window 환경에서 nest.js에 volume을 연결했지만 동작하지 않는 경우 결론 typescript 4.9 버전 정도부터 감시 옵션이 파일 시스템 기반 감시를 수행하도록 구성되어 있으나, window 환경에서 volume을 지정하면 해당 옵션이 제대로 동작하지 않는 듯 하다. tsconfig.json 파일에 다음 옵션을 추가해보자. "watchOptions": { "watchFile": "fixedPollingInterval" } 최신 버전의 nest.js을 사용하고 있다. docker-compose.yml 파일을 다음과 같이 작성했다. version: '3' services: backend: ports: - 8080:8080 depends_on: - my-redis # redis 동작해야 의미 O build: context: ./server dockerfile: Dockerf..
[CS] DIP / IoC / DI Dependency Inversion Principle: 의존의 역전 원칙. SOLID 원칙 중 하나로, 구체적인 것이 추상화에 의존하는 것을 의미한다. 인터페이스에 의존하는 경우, 이를 구현한 클래스 상에 변동이 발생하더라도 구체적 객체와는 결합도가 낮아 변화가 전파되지 않는다. 추상에 의존 부분에 주목! Inversion of Control: 제어 수준을 역전한다는 의미로, 사용자가 객체의 생명 주기나 코드의 흐름을 직접 관리하는 대신 프레임워크에 제어권을 넘기는 패턴. 프레임워크에 정의된 생명 주기와 동작 방식에 따라 적합한 함수를 프레임워크 수준에서 실행한다. ex) Get / Post 데코레이터를 적용한 controller 메서드 제어 권한이 프로그래머가 아닌 프레임워크에게 있다는 점에 주목! ..