노드의 작동에 전체적으로 단 하나의 스레드만 있는 건 아니다.기본적으로 이벤트 루프 기반의 메인 스레드 하나와,백그라운드 작업을 처리해줄 보조 스레드(기본 값은 4개)가 있다.이 보조 스레드는 libuv 라이브러리를 통해 작동한다.(이건 그냥 내 의견)내 생각에 노드
I/O 작업이 끝날 때까지 해당 스레드 실행 중지 여부에 따라 다름블록킹: I/O 작업이 끝날 때까지 스레드에서 다른 실행을 하지 않음.논 블록킹: I/O 요청만 해놓고 같은 스레드에서 다른 작업을 함. 이후 I/O 처리 완료 신호가 오면 I/O 완료 작업을 스레드에서
요청 처리 파이프라인에서 특정 데이터 처리 작업을 수행https://docs.nestjs.com/pipes이 그림이 파이프의 개념을 잘 나타내 줌.파이프는 이용 사례1\. 변환: 입력 데이터를 원하는 형식으로 변환2\. 유효성 검사: 입력 데이터를 평가해서 유
PR이 커밋 단위로 되는 건줄 알았는데 아니다?PR을 날린 후 새로운 커밋을 push하면 해당 PR에 커밋이 계속 들어감.뭔가 내가 이해하고 있는 것과 다른 양상임.PR 강의 보면서 다시 공부하기https://www.youtube.com/watch?v=uvsz
멘토님께 추천 받은 책
가드는 NestJS에서 인증과 권한 부여와 같은 보안 관련 작업을 수행하기 위해 사용파이프는 요청 데이터의 변환과 유효성 검사에 사용가드는 요청이 컨트롤러가 가기 전에 권한을 체크하고, 권한이 없으면 차단한다. 아예 컨트롤러에 가지 않는다. 가드의 반환 값은 불리언이다
기존개선Object.assign()은 얉은 복사를 수행한다
https://typescript-eslint.io/rules/no-unused-vars/args: "all"이 설정은 모든 함수 매개변수에 대해 사용되지 않는 변수 검사를 활성화합니다. "all" 옵션은 모든 인수가 사용되어야 함을 의미합니다.argsIgno
받을 때는 느슨하게, 보낼 때는 날카롭게400(Bad Request): 클라이언트 오류로 요청 처리할 수 없거나 하지 않을 때401(Unauthorized): 인증되지 않음403(Forbidden): 인증은 됐지만 콘텐츠에 대한 엑세스 권한 없음404(Not Found
멘토님의 한 마디정말.. GET 으로 요청할 경우 body 를 보내지 못하나요? 정확한 근거를 찾아보세요.친절하게 힌트까지 주셨다.https://datatracker.ietf.org/doc/html/rfc9110#name-get
비관적 락충돌이 발생할 것을 비관적으로 가정충돌 방지를 위한 데이터 접근을 엄격하게 제어데이터를 사용하려는 시점에 즉시 락을 걸어 버림락이 유지되는 동안 다른 트랜잭션은 대기해야 함.데드락 발생 위험공유 락데이터 읽을 때 사용트랜잭션은 동시에 데이터 읽을 수 있지만,
의존성 주입 예시의존성 미주입 예시
SQL 표준에서의 네 가지 기본 격리 수준4\. SERIALIZABLE (직렬화 가능)
컨트롤러 코드와 테스트 코드를 동시에 작성하니까 비슷한 코드를 두 번씩 작성하는 느낌입니다. 그래서 만약 다른 함수에서 반복되는 코드가 있다면 작업량이 2배, 4배로 느껴집니다. 그래서 최대한 중복되는 코드를 줄이기 위해 생각해 보게 됩니다.ex) jwt에서 userI
Nest에서 모든 예외를 처리하는 예외 레이어가 내장됨.즉, 애플리케이션 코드에서 예외가 처리되지 않으면 이 예외 레이어에서 계층을 포착해서 예외를 처리한다.즉, try-catch로 예외처리를 하지 않아도 그냥 예외만 발생시키면 기본 내장 필터가 예외를 처리함.이 내장
위와 같은 코드는 jest에서 인식하지 못한다.
사용자, 개발자, 운영자 등 다양한 주체의 관점에 따라 기능을 나눠서 프로그래밍하는 것관점지향프로그래밍(Aspect-Oriented Programming, AOP)은 소프트웨어 개발에서 사용되는 프로그래밍 패러다임의 하나로, 애플리케이션의 핵심적인 기능과 이와 관련되지
FK에 그냥 단순히 다른 테이블의 PK만 number 타입 등등으로 넣으면 끝나는 게 아니였다..??나는 관계형 DB를 1도 모르고 있었다.SQLD 자격증 어떤 게 딴 거지??https://www.youtube.com/watch?v=gjcbqZjlXjM타입으로
애플리케이션을 안전하게 종료하는 프로세스
이벤트를 생성, 전달, 반응하는 시스템을 구성이벤트를 생성하고 발생하는 역할예를 들어 사용자가 버튼을 클릭하면 버튼 클릭 이벤트 생성이벤트를 전달하고 관리하는 중개자 역할이벤트 버스, 메시지 큐, 스트리밍 플랫폼 등Kafka, RabbitMQ이벤트 구독하고 처리하는 역
propagation은 번식이라는 뜻메서드가 트랜잭션 내에서 호출될 때 어떻게 트랜잭션을 처리할지 정의하나의 트랜잭션이 여러 메서드 호출에 걸쳐 있을 때, 각 메스가 기존 트랜잭션을 사용할지 새로운 트랜잭션을 시작할지 다른 트랜잭션 처리할지 결정기본 전파 속성현재 트랜
Graceful shutdown 이란 무엇이며, 언제 사용하나요?Event driven architecture 는 일반적인 개발 방법 (function call) 과 장단점은 어떤 것들이 있나요?이 기능을 구현하면서 DB 와 통신시 어떠한 transaction prop
각 객체 들의 역할 범위가 정의되어 있다면, adjustBalance 라는 임무는 어떤 객체 가 수행 하는게 가장 올바를까요?
멘토님의 한 마디TypeORM 공식 문서 안 보셨죠?질문의 수준에서 티가 난 듯 😂공식문서 읽기 시작!https://typeorm.io/
데이터베이스 상호작용은 데이터 소스를 설정한 후에만 가능함.데이터베이스 연결 설정을 보유하고 있으며,RDBMS에 따라 초기 데이터베이스 연결 또는 연결 풀을 설정함.initialize 메서드로 연결이 설정되고,destory 메서드로 연결 해제 됨.일반적으로 앱의 부트스
ORM은 데이터베이스 테이블과 객체 지향 프로그래밍의 클래스 간에 매핑을 When using an entity constructor its arguments must be optional. Since ORM creates instances of entity classe
릴레이션으로 관련 엔티티의 연결을 쉽게 할 수 있다.@OneToOne@ManyToOne@OneToMany@ManyToMany
엔터티 매니저로 모든 엔터티에 대해서 CRUD 작업 가능엔터티 매니저는 엔터티 레포지토리를 한 곳에 모아 놓은 장소와 같다.데이터소스를 통해 엔터티 매니저에 접근할 수 있음.레포지토리는 엔터티 매니저와 비슷한다. 하지만 이건 제한된 구체적인 (특정) 엔터티에만 작동함.
QueryBuilder is one of the most powerful features of TypeORM - it allows you to build SQL queries using elegant and convenient syntax, execute them an
프로덕션 레벨에서 동기화는 위험함.그래서 마이그레이션을 씀.마이그레이션은 데이터베이스 스키마 업데이트를 위한 단일 파일이다.그리고 스키마 변화가 생기면 이미 존재하는 데이터베이스 구조를 업데이트 할 수 있다.
The most important restriction when working in a transaction is to ALWAYS use the provided instance of entity manager - transactionalEntityManager in
뭐야.. 인덱스 이렇게 간단하게 만들 수 있는 거였어?유니크 인덱스는 데이터 삽입이나 업데이트 시 중복된 값이 있을 경우 에러를 발생시키므로, 애플리케이션 로직에서 이를 적절히 처리해야 합니다.인덱스는 데이터베이스의 저장 공간을 추가로 사용하므로, 필요한 경우에만 사용
특정 엔터티 이벤트를 리슨할 수 있음.근데 데이터베이스에서 리스너를 호출하면 안 됨. 대신 구독자를 사용하기.
이렇게 간단하게 로깅을 걸 수 있었다..?이런 옵션을 선택할 수 있지만,query - logs all queries.error - logs all failed queries and errors.schema - logs the schema build process.war
모델 안에서 메서드를 정의하고, 이 메서드로 CRUD 작업 수행요약하면 데이터베이스와의 상호작용을 모델로 통합하는 것BaseEntity를 상속받으면 내부에 알아서 메서드가 들어간다.액티브 레코드 방식은 레포지토리에서 사용되는 표준적인 메서드가 들어가 있으니까 간단하게
class-validator 대충 쓰기만 했는데, 공식 문서 참고하기!
참고: https://techblog.woowahan.com/7835/우아한 기술 블로그 - 회원시스템 이벤트기반 아키텍처 구축하기우리가 발행해야할 이벤트는 도메인 이벤트로 인해 달성하려는 목적이 아닌 도메인 이벤트 그 자체입니다.
https://docs.nestjs.com/fundamentals/lifecycle-events#lifecycle-sequence
멘토링 시간에 설명 제대로 못함. 다시 한번 정리하기!! 격리 수준이 왜 필요하지? 다중 사용자 환경에서 트랜잭션이 서로 간섭 없이 안전하게 DB에 접근, 수정할 수 있는 정도 동시성과 관련있음. 높은 격리 수준은 일반적으로 더 낮은 동시성을 의미. > 동시성?
DBMS에서 트랜잭션 처리의 신뢰성을 보장하기 위한 필수적인 네 가지 주요 특성지속성 Durability
일반적으로, 요청 생명주기는 다음과 같은 순서로 진행됩니다:Incoming request들어오는 요청Middleware2.1. Globally bound middleware전역적으로 적용된 미들웨어2.2. Module bound middleware모듈에 바인딩된 미들웨
I/O는 느리다.다양한 I/O 소스로부터 발생하는 이벤트를 중앙에서 관리하고, 각 이벤트에 적절한 핸들러를 할당하여 실행하는 방식
반복된 문제에 대한 재사용 가능한 해결책
클라-서버 HTTPS 통신에서 암호화된 데이터를 복호화하는 과정일반적으로 서버의 로드밸런서나 리버스 프록시에서 수행이 장치들이 SSL/TLS 터미네이션 포인트로 작동termination은 종료, 종점이라는 뜻이 있음암호화 및 복호화 과정을 서버가 아닌 서버 앞단에서 처
프록시데코레이터프록시와 데코레이터 사이의 경계어댑터프록시
객체나 클래스 간의 통신과 책임을 관리하는 방법에 초점을 맞춘 소프트웨어 디자인 패턴객체 간의 상호작용과 책임 분배를 효율적으로 설계하는 데 목적이 있으며, 복잡한 흐름이나 명령 구조를 단순화하여 프로그램의 유연성과 재사용성을 높임.행위 패턴은 객체의 역할을 분명히 하
대부분 aws 서비스는 퍼블릭 인터넷에서 접근 가능(S3, 다이나모 디비 등)근데 VPC는 원래 퍼블릭 인터넷에서 접근할 수 없음.단, 예외적으로 EC2는 인터넷 게이트웨이를 통해 외부와 통신할 수 있음.VPC 내부의 EC2가 VPC 외부의 AWS에 접근하려면 인터넷
스케일 업: 성능을 올리는 것 (성능과 비용이 비례하지 않음)(<-> 스케일 다운)스케일 아웃: 동일한 인스턴스를 여러 개 생성(확장) 하는 것(<-> 스케일 인)
ci: continuous integration package-lock.json이나 npm-shrinkwrap.json 에 정확히 명시된 버전으로만 패키지를 설치즉 정확한 의존성을 설치일반적으로 더 빠름(메타데이터 재계산, 버전 호환성 검사 안하기 때문에)package
애플리케이션을 호스팅하는 물리적 서버 역할자동으로 EC2 인스턴스 수를 조정로드 밸러서는 인바운드 트래픽을 EC2 인스턴스들에게 균등하게 분배로드 밸런서에 의해 트래픽이 전송될 EC2 인스턴스자원 상태 모니터링, 정의 임계값 초과 및 미달 시 알람보안 그룹. 인바운드
현재 이미 배포 중인 EC2를 AMI로 생성함그리고 이 AMI로 시작 템플릿 생성보안 그룹 지정(wizard7, 3000포트 열어 놓음)음, 근데 그냥 앞으로는 기본 AMI로 하고 도커에서 pull 받게 스크립트 설정하면 될 듯?애플리케이션 업데이트는 고려하지 않고 정
웹, 앱, 데이터베이스, 캐시가 모두 한 대 서버마스터: 쓰기슬레이브: 읽기(마스터 변경 내역은 슬레이브에 즉시 반영)자주 참조되는 데이터를 메모리 안에 보관즉, DB로 요청을 보내지 않고 캐시 계층에서 데이터 반환대표적으로 memcachedAPI고려 사항캐시 메모리
와이어샤크
진짜 하루 종일 삽질함.근데 덕분에 docker-compose 써보고, docker 명령어 좀 익숙해짐.psql로 cli에서 DB다루고 쿼리 날리는 것도 해봄.typrORM 레플리카 설정으로 자동으로 마스터/슬레이브 쿼리를 나눴다.근데 자꾸 회원가입은 User Crea
일부 솔루션은 동기식입니다. 즉, 모든 서버가 트랜잭션을 커밋할 때까지 데이터 수정 트랜잭션이 커밋된 것으로 간주되지 않습니다. 이렇게 하면 장애 조치로 인해 데이터가 손실되지 않고 로드 밸런싱된 모든 서버가 쿼리되는 서버에 관계없이 일관된 결과를 반환하게 됩니다. 대
opensl로 키 생성 후 파싱핵심은 개인키였음개인키를 만들고 공개키 생성모듈러스 (n): 이것은 RSA 암호에서 사용되는 두 소수의 곱입니다. 이 값은 암호화 및 복호화 과정에서 모듈로 연산의 기준이 되며, 일반적으로 매우 큰 16진수 숫자로 표현됩니다.공개 지수 (
참고할 것https://medium.com/zigbang/nodejs-event-loop%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-16e9290f2b30

구글 필터링ip.addr == 142.250.206.238이 과정 이해하기
https://github.com/pietrzakadrian/bank-server모듈안에 공통적으로 index.ts가 있음.이런 구조는 모듈을 불러올 때 불러오는 위치가 하나로 통합된다는 장점이 있음.띄어쓰기가 필요한 부분은 -로 표현함.
이 코드는 뭘 가로채는 걸까?리퀘스트 객체를 가져와서UserEntity 타입으로 캐스팅한다.그리고 setAuthUser를 하고,다음을 실행한다.우선 <UserEntity>request.user; 이게 뭐지?타입 단언임. 특정 변수가 특정 타입임을 명시적으로 선언.
서비스 중단을 목적으로 표적 서버, 서비스 또는 네트워크에 인터넷 트래픽을 대량으로 보내려고 시도하는 악의적인 사이버 공격계층별 공격 가능동일 소스에 과부하 걸리게 정보를 반복해서 요청방어:레이트 리밋캐싱 전략: 중간에 별도 캐싱 서버WAF: 웹 애플리케이션 방화벽방화
수신 데이터: 테스트 동안 수신된 총 데이터 (120kB, 평균 3.9 kB/s).송신 데이터: 테스트 동안 송신된 총 데이터 (25kB, 평균 821 B/s).요청이 만들어진 시점부터 응답의 첫 바이트가 수신될 때까지의 시간입니다. 네트워크 소켓 대기 시간 및 DNS
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Connectionconnection은 헤더임. 현재 전송 완료 후 네트워크 접속 유지 여부 제어.(연결 관리)만약 전송된 값이 keep-alive면 연결은 지속
복잡성을 다루는 패턴과 기법, 원칙
classbinu2분2분 전DDD: 값 객체타입스크립트에서 타입이 왜 필요한지조금 더 근본적인 이유를 알게된 것 같음.단순히 변수에 타입을 지정하는 목적이 아니었다!원시 타입 값 만으로도 소프트웨어 만들 수 있다.하지만 원시 타입은 지나치게 범용적이다.예를 들어 이메일