14. Redis를 사용한 세션 관리 및 캐싱2025.05.2114. Redis를 사용한 세션 관리 및 캐싱Nest.js2025.05.2114. Redis를 사용한 세션 관리 및 캐싱Nest.js새로운 프로젝트를 준비하면서 인증 방식부터 다시 고민하게 되었다. 이전 프로젝트에서는 JWT를 사용해 유저 인증과 상태 관리를 처리했지만, 이번에는 Redis를 활용한 세션 방식으로 전환하기로 결정했다. 이 방식은 유저 상태를 서버에서 직접 관리할 수 있어 보안 측면에서도 유리하고, 필…
비즈니스 로직은 어디에 있어야 할까2025.01.30비즈니스 로직은 어디에 있어야 할까Nest.js번역 및 정리#object-oriented2025.01.30비즈니스 로직은 어디에 있어야 할까Nest.js번역 및 정리#object-orientedNest.js에서 컨트롤러와 각각의 프로바이더는 분명한 책임을 갖는다. 하지만 막상 서버를 개발하다 보면, 이 책임들을 깊이 고민하지 않은 채 코드를 작성하게 되고, 그 결과 클래스들이 서로의 영역을 침범하는 상황이 반복된다. 나 역시 컨트롤러에 비즈니스 로직이 섞이거나, 서비스가 지나…
라이브러리를 죽여버릴 수야 없겠지만2024.12.07라이브러리를 죽여버릴 수야 없겠지만Nest.jsError Case#jest#configmodule#testing2024.12.07라이브러리를 죽여버릴 수야 없겠지만Nest.jsError Case#jest#configmodule#testing상황 Nest.js 서버에서 jest를 사용한 테스트 코드를 작성하고 있었다. 평소에는 아래와 같이 ConfigService를 모의하여 configService.get으로 환경 변수를 처리했다. 그런데 이런 방식이 마음에 들지 않았다. 가장 큰 이유는 필요한 문자열이 하드코딩 되어있어…
13. Jest 테스트 구성2024.12.0713. Jest 테스트 구성Nest.js#test#jest2024.12.0713. Jest 테스트 구성Nest.js#test#jest이 포스트를 시작하기에 앞서 한 가지 분명히 밝혀두고 싶은 점이 있다. 나는 컨트롤러(혹은 GraphQL 기준으로는 리졸버) 와 레포지토리 클래스에 대한 테스트를 거의 작성하지 않는다. 이유는 단순하다. 애플리케이션에서 가장 많은 비즈니스 규칙이 응집되어 있는 곳은 서비스 계층이며, 테…
12. GraphQL로 요청 처리2024.11.1412. GraphQL로 요청 처리Nest.js#graphql2024.11.1412. GraphQL로 요청 처리Nest.js#graphqlGraphQL은 페이스북에서 개발한 데이터 쿼리 언어이자 런타임으로, 기존 REST API가 가진 구조적 한계를 보완하기 위해 등장했다. 전통적인 REST API에서는 각 엔드포인트마다 반환되는 데이터 구조가 고정되어 있고, 동일한 리소스에 대해 서로 다른 작업을 수행하기 위해 HTTP…
11. webSocketGateway를 사용한 알림 기능2024.11.1111. webSocketGateway를 사용한 알림 기능Nest.js2024.11.1111. webSocketGateway를 사용한 알림 기능Nest.js웹소켓은 클라이언트와 서버 간에 지속적인 연결을 유지함으로써 실시간 양방향 통신을 가능하게 하는 프로토콜이다. 일반적인 HTTP 요청이 요청–응답 단위로 연결을 맺고 끊는 방식이라면, 웹소켓은 한 번 연결을 맺은 뒤 그 연결을 계속 유지하며 데이터를 주고받는다. 이 덕분에 알림, 채팅과…
10. 소셜 로그인 구현2024.11.1010. 소셜 로그인 구현Nest.js2024.11.1010. 소셜 로그인 구현Nest.js현대 웹 애플리케이션에서는 사용자 편의성과 전환율을 높이기 위해 소셜 로그인 기능이 사실상 필수 요소가 되어가고 있다. 별도의 회원가입 절차 없이 구글이나 카카오처럼 이미 익숙한 플랫폼 계정을 통해 로그인할 수 있다는 점은, 사용자의 진입 장벽을 크게 낮춰준다. OpenID Connec…
09. lexical order를 활용한 무한 깊이의 댓글 기능2024.10.1609. lexical order를 활용한 무한 깊이의 댓글 기능Nest.js2024.10.1609. lexical order를 활용한 무한 깊이의 댓글 기능Nest.js모든 것을 재귀적으로 구현한 댓글 기능에서 이어집니다 lexical order, 혹은 lexicographic order라고도 불리는 사전적 정렬은 문자열을 유니코드 기준으로 오름차순 정렬하는 방식을 의미한다. 다른 언어에서는 어떨지 모르겠지만, 적어도 자바스크립트에서는 배열의 sort…
모든 것을 재귀적으로 구현한 댓글 기능2024.10.15모든 것을 재귀적으로 구현한 댓글 기능Nest.jsTypescriptReactNext.js2024.10.15모든 것을 재귀적으로 구현한 댓글 기능Nest.jsTypescriptReactNext.js내가 개인적으로 사용하는 독후감 기록 및 공유 서비스가 하나 있다. 이름은 onef다. 홍보에는 거의 신경 쓰지 않았기 때문에 실제 사용자는 나와 몇몇 후배들 정도에 불과하다. 하지만 전혀 문제는 없다. 이 서비스는 사용자 수를 늘리기 위한 제품이라기보다는, 구현해보고 싶은 기능을 부담…
08. Swagger를 사용한 백엔드 문서화2024.08.1708. Swagger를 사용한 백엔드 문서화Nest.js#swagger2024.08.1708. Swagger를 사용한 백엔드 문서화Nest.js#swaggerExpress.js에서 OpenAPI를 사용해 Swagger 문서를 설정할 때는, 설정 파일과 스키마를 하나하나 직접 정의해가며 꽤 많은 작업을 해야 했다. 반면 Nest.js에서는 @nestjs/swagger 라이브러리를 사용하면, 비교적 적은 설정만으로도 Swagger UI를 빠르게…
07. Middleware와 토큰 재발급2024.08.0107. Middleware와 토큰 재발급Nest.js2024.08.0107. Middleware와 토큰 재발급Nest.js미들웨어에 대해 알아보기 전에, 한 가지 짚고 넘어가야 할 개념이 있다. Nest.js 서버로 들어온 요청은 단순히 컨트롤러로 바로 전달되지 않는다. 앞서 살펴본 가드나 파이프뿐만 아니라, 미들웨어와 인터셉터 등을 거쳐 단계적으로 처리된 뒤 컨트롤러에 도달한다. 그리고 컨트롤러에서 처리…
06. Guard와 유저 인증2024.08.0106. Guard와 유저 인증Nest.js2024.08.0106. Guard와 유저 인증Nest.jsGuards Nest.js의 가드(Guard)는 요청이 특정 조건을 만족하는지 판단하여, 해당 요청을 실제로 처리할지 여부를 결정하는 역할을 한다. 주로 인증(Authentication)과 인가(Authorization), 혹은 그 외의 사전 조건 검증을 구현하는 데 사용된다. 가드는…
05. JWT와 유저 기능2024.08.0105. JWT와 유저 기능Nest.js2024.08.0105. JWT와 유저 기능Nest.js유저 인증 기능을 구현하는 방식에는 여러 가지가 있지만, 그중에서도 나는 JWT 토큰을 발급해 쿠키로 내려주는 방식을 선호한다. 이유는 여럿 있겠지만, 가장 큰 이유는 클라이언트 측에서 별도의 처리를 거의 하지 않아도 된다는 점이다. 토큰 저장 방식이나 갱신 전략에 대해 프론트엔드가 신…
04. 파이프를 사용한 유효성 검사2024.06.2704. 파이프를 사용한 유효성 검사Nest.js2024.06.2704. 파이프를 사용한 유효성 검사Nest.jsNest.js에서 요청 데이터를 어떻게 다루느냐는 애플리케이션의 안정성과 직결된다. 클라이언트로부터 전달되는 데이터는 항상 신뢰할 수 없으며, 타입이 다르거나, 누락되었거나, 의도하지 않은 값이 포함되어 있을 가능성을 전제로 처리해야 한다. 이러한 문제를 컨트롤러 내부에서 매번 직접 처…
03. 환경변수 설정2024.06.2703. 환경변수 설정Nest.js2024.06.2703. 환경변수 설정Nest.js애플리케이션이 커질수록 환경 변수의 중요성은 점점 더 커진다. 데이터베이스 연결 정보, 외부 API 키, 인증에 사용되는 시크릿 값들은 모두 코드에 직접 포함되어서는 안 되며, 실행 환경에 따라 유연하게 변경될 수 있어야 한다. 특히 개발 환경과 운영 환경이 분리되는 구조에서는 환경 변…
02. 의존성 주입을 통한 모듈 분리2024.06.2702. 의존성 주입을 통한 모듈 분리Nest.js2024.06.2702. 의존성 주입을 통한 모듈 분리Nest.js모듈(Module), 프로바이더(Provider), 그리고 컨트롤러(Controller)는 Nest.js를 구성하는 핵심 요소이다. 모듈은 기능 단위로 코드를 그룹화하는 역할을 하며, 프로바이더는 애플리케이션의 핵심 비즈니스 로직을 담당한다. 컨트롤러는 클라이언트의 요청을 받아 적절한…
01. Nest.js CLI2024.06.2701. Nest.js CLINest.js2024.06.2701. Nest.js CLINest.jsNest.js는 Express를 기반으로 만들어진 백엔드 프레임워크이다. 가장 큰 특징은 강력한 의존성 주입(Dependency Injection) 시스템을 기본으로 제공한다는 점이다. 이를 통해 서비스 간의 의존 관계를 명시적으로 관리할 수 있으며, 코드의 결합도를 낮추고 테스트 가능…