TypeDI 내부 구조 분석: typeDI 코드 분석을 통한 의존성 주입(DI)이 되는 과정
·
💻 개발/프레임워크
의존성 주입(DI)에 대해 이론적으로는 알고 있지만, 실제로 내부에서 어떻게 동작하는지 이해하기는 쉽지 않았습니다. 이 글에서는 TypeDI 오픈소스 코드를 직접 분석하며 데코레이터와 컨테이너가 어떻게 의존성을 관리하는지 파헤쳐봅니다. NestJS 팀에서 DI 개념을 TypeDI에서 아이디어를 얻었다고 하여 TypeDI를 분석하게 되었습니다. 소스코드를 10번 이상 직접 따라치며 얻은 내용을 공유합니다. 평소에 당연하게 사용하던 @Injectable(), @Service() 같은 데코레이터들이 실제로는 어떤 원리로 작동하는지 핵심 로직 위주로 설명했습니다. 잘못된 내용이 있다면 댓글 부탁드립니다. 🙇🏻‍♂️ 💡 이 글은 다음과 같은 분들에게 도움이 됩니다.- TypeDI나 NestJS 같은 DI 프..
(공식문서) NestJS 인터셉터
·
💻 개발/프레임워크
관련된 링크  🌠 목차✅ ✅ ✅  인터셉터의 기능 및 역할AOP 기법에서 영감을 얻은 유용한 기능메서드 실행 전/후에 추가 로직을 바인딩 함수에서 반환된 결과 변환함수에서 던져닌 예외를 변환기본 함수 동작 확장특정 조건에 따라 함수를 완전히 재정의(ex:캐싱) 쉽게 말해서 컨트롤러 핸들러 메서드의 전후에 추가적인 로직을 삽입하거나,핸들러의 결과값 또는 예외를 변환하는 등 다양한 작업을 수행할 수 있는 클래스입니다.마치 컨트롤러 핸들러를 감싸는 래퍼(wrapper)와 같은 역할을 합니다. 인터셉터 구현 중 제목 작성인터셉터는 @Inejectable() 데코레이터 주석을 달고 NestInterceptor 인터페이스를 구현하는 클래스입니다. 각 인터셉터는 두 개의 인수를 받는 ExecutionContext와..
(공식문서) NestJS 가드
·
💻 개발/프레임워크
가드는 @Injectable() 데코레이터로 주석이 달린 클래스로,CanActivate 인터페이스를 구현합니다.  관련된 링크: https://docs.nestjs.com/guards   🌠 목차✅ 가드와 미들웨어 차이점✅ 가드 구현 canActivation과 FirebaseTokenGuard✅  가드와 미들웨어 차이점 가드란? 가드에는 단일 책임이 있습니다.역할: 런타임에 존재하는 특정 조건(권한, 역할)에 따라 주어진 요청이 라우트 핸들러에 의해 처리될지 여부를 결정합니다.주로 Controller에서 @AuthGuard, @TokenGuard, @AdminGuard로 사용됩니다. Express에서는 middleware에 의해 처리되었습니다. 미들웨어는 토큰 유효성 검사 및 요청 개체에 속성 첨부 등..
(공식문서) NestJS Pipes와 queryString, Body가 데이터 처리하는 방법
·
💻 개발/프레임워크
파이프는 @Injectable() 데코레이터로 주석이 달린 클래스로, PipeTransform 인터페이스를 구현합니다.   관련된 링크 : https://docs.nestjs.com/pipes  🌠 목차✅ 파이프의 일반적 사례✅ 파이프 바인딩과 적용✅ queryString과 body의 데이터 처리 차이점 파이프의 일반적 사례 transfromation: 입력 데이터를 원하는 형식(예: 문자열에서 정수로)으로 변환합니다.validation: 입력 데이터를 평가하여 유효하면 변경 없이 통과하고, 그렇지 않으며 예외를 던집니다.  두 경우 모두 컨트롤러 경로 핸들러에서 처리 중인 인수에 대해 작동합니다 파이프 작동 방식요청: 클라이언트가 서버로 요청을 보냅니다.파이프 실행: NestJS는 요청 데이터를 파이..
GitHub 라벨 또는 태그로 Azure API Container에 CI/CD 적용하기
·
💻 개발/설정 및 세팅
브랜치를 푸시하거나, 라벨을 붙이거나, 태그를 추가할 경우 GitHub Action을 이용하여 Azure API Container에 자동으로 배포하는 방법을 공유합니다.    저희 팀에서는 변형된 Git flow 전략으로 버전 관리를 하고 있습니다그중 QA 브랜치만 다루도록 하겠습니다.  🌠 목차✅ CI/CD에서 원하는 동작✅ GitHub Action workflow 생성✅ Azure 배포 프로세스의 이해 ⭐️⭐️⭐️✅ 만약 안되는 부분이 있다면✅ 회고 CI/CD에서 원하는 동작QA 브랜치에 PR을 만들고 "QA"라벨을 추가하면 자동 CI/CD가 되도록 구현하려고 한다.   GitHub Action workflow 생성workflow 파일 코드name: Trigger auto deployment for..
(공식문서) NestJS Exception filters
·
💻 개발/프레임워크
Nestjs Exception filters 첫 문장Nest에는 애플레킹션 전체에서 처리되지 않은 모든 예외를 처리하는 예외 계층이 내장 되어 있습니다.애플리케이션 코드에서 처리되지 않은 예외가 발생하면 이 계층에서 이를 포착하여 적절한 사용자 친화적인 응답을 자동 전송합니다.   관련된 링크: https://docs.nestjs.com/exception-filters  🌠 목차✅ NestJS 요청 라이프 사이클✅ Exception filters의 주요목적✅ Exception filters가 에러를 잡을 수 있는 이유✅ 예외 처리 방법들 ✅ Exception filters를 활용한 커스텀 ✅ 필터와 파이프 차이NestJS 요청 라이프 사이클클라이언트의 요청이 컨트롤러에 도달하기까지의 플로우1. 클라이..
백엔드 게시판 DB 스냅샷 구조 vs 히스토리 구조 차이점 및 정리
·
💻 개발/프레임워크
안녕하세요,이번 포스팅에서는 NestJS 개발 중 알게 된 스냅샷과 히스토리 개념에 대해 이야기해보려고 합니다.NestJS 개발 커뮤니티에서 유명한 '삼촌님'의 깃허브 레포지토리를 참고하면서 스냅샷 방식을 도입하게 되었습니다.이전에는 히스토리성 로그 방식의 테이블을 사용했는데요,이번 글에서는 두 방식의 차이점과 각각의 특징, 그리고 도입 예제에 대해 알아보겠습니다. 스냅샷과 히스토리성 테이블의 차이점데이터 저장 방식히스토리 테이블:  변경된 내용만 순차적으로 기록합니다.           "어제 뭐 했더라..." (매일매일 일기 쓰는 느낌)스냅샷: 특정 시점의 전체 상태를 저장합니다.           "자, 여기 내 전재산!" (인생 통장 사진 찍기)조회 성능히스토리 테이블: 최신 상태를 얻기 위해 여..
Azure OpenAI Error - Resource Not Found - Error Code - 404 해결하기
·
💻 개발/설정 및 세팅
회사에서 Azure 크래딧을 받게 되어 openAI를 이용해서 댓글 생성해주는 서비스가 있는데플랫폼을 chatGPT -> Azure openAI로 변경하게 되었다.Azure openAI를 적용한 과정과 404 resource not found 에러를 마주하게 되었는데,해외에서도 비슷한 에러로 질문 글을 작성한 것들을 알게 되었다.하지만 해외 공문 QnA를 봐도 마땅히 도움이 되지 않아서 해결하게 된 포스팅을 작성하게 되었다.     🌠 목차✅ Azure openAI 사용을 위한 권한 신청하기✅ openAI 적용을 위한 Studio 예제 소스코드 보기✅ 404 resource not found 해결하기(feat. 공식문서 보고 하다 개삽질한 경험)  Azure openAI 사용을 위한 권한 신청하기1. ..