본문 바로가기

Web Development

(7)
반복 일정의 복잡한 업데이트: 삭제 후 생성 vs 직접 업데이트 플래너 앱을 개발하면서 가장 복잡했던 기능 중 하나가 바로 반복 일정 업데이트였습니다. Google Calendar나 Outlook을 사용해보신 분들이라면 익숙하실 "이 일정만", "이 일정 이후부터", "관련된 모든 일정"과 같은 선택지들을 구현하는 과정에서 많은 고민과 시행착오를 겪었습니다. 이번 글에서는 일정 시스템에서 Create, Delete, Update 각각에 필요한 API 설계부터 복잡한 반복 일정 업데이트 로직까지 차근차근 정리해보겠습니다.기본적인 일정 API 설계Create API - 새로운 일정 생성가장 기본적인 일정 생성 API부터 살펴보겠습니다.POST / events;단일 일정과 반복 일정 모두 같은 엔드포인트를 사용합니다. 요청 바디에 recurring 필드가 있으면 반복 일정..
왜 Transaction이 필요하고 중요할까? 현재 진행중인 팀 블로그 프로젝트를 진행하면서 가장 중요하게 생각한 부분 중 하나는 데이터 일관성입니다. 특히 팀 초대, 팀원 강퇴, 권한 위임과 같은 복잡한 비즈니스 로직에서는 여러 테이블에 대한 작업이 동시에 이루어지기 때문에, 모든 작업이 성공하거나 모든 작업이 실패해야 합니다. 이런 상황에서 데이터베이스 트랜잭션(Transaction)은 필수적인 개념입니다. 이번 글에서는 트랜잭션이 무엇인지, 왜 사용해야 하는지, 그리고 NestJS에서 어떻게 구현하는지 정리해보겠습니다.Transaction이란 무엇인가?트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위를 의미합니다. 여러 개의 개별 작업들을 하나로 묶어서, 모든 작업이 성공적으로 완료되거나 모든 작업이 취소되도록 보장하는 메커니즘입니다. 트랜잭..
Google OAuth 다중 계정 로그인 문제 해결 프로젝트를 진행하면서 Google OAuth를 구현해놓고 테스트를 하던 중, 다른 Google 계정으로 로그인을 시도해도 계속 이전 계정의 정보가 나오는 문제를 발견하였습니다.어떤 문제였을까?사용자가 Google 계정 A로 로그인한 후 로그아웃을 하고, 다른 Google 계정 B로 로그인을 시도해도 계속 계정 A의 정보가 반환되는 상황이었습니다. 처음에는 프론트의 문제라고 생각했습니다. 하지만 자세히 살펴보니 프론트엔드의 AuthContext와 Cookie는 정상적으로 초기화되고 있었습니다. 문제는 백엔드의 Google OAuth 세션 관리에 있었습니다.해결하기 위해 시도한 것들첫 번째 시도: 프론트엔드에서 더 확실하게 초기화해보자우선 프론트엔드에서 로그아웃 로직을 더 강화해보기로 했습니다.// Auth..
JWT vs 세션, 어떤 로그인 방식을 선택할까? 로그인 후 사용자 인증 관리를 하는 방법으로는 여러 가지가 있지만, 개인적으로 가장 먼저 생각 나는 방식들로는 서버 세션에 로그인 상태 저장, JWT 토큰 인증 방식이 있습니다. 제가 프로젝트에서 사용한 방식은 JWT 토큰 인증 방식입니다. 이 경험에 대해서 이야기하기 전에 간단히 해당 두 가지 방법의 개념에 대해서 소개하겠습니다.서버 세션에 로그인 상태 저장이란?서버 세션(Session) 방식은 사용자가 로그인하면 서버가 해당 사용자에 대한 정보를 메모리나 데이터베이스에 저장하고, 사용자의 브라우저에는 세션 ID가 담긴 쿠키를 전달하는 방식입니다. 이후 사용자는 요청을 보낼 때마다 세션 ID를 함께 전송하고, 서버는 이 세션 ID를 통해 해당 사용자가 누구인지 식별합니다. 이 방식의 장점은 서버가 인증..
Web Socket(웹 소켓)과 HTTP NestJS로 웹 프로젝트를 진행하면서 실시간 채팅 기능을 구현하기 위해 WebSocket(웹 소켓)을 사용하였다. 웹 소켓은 실시간 통신이 필요할 때 사용되는 기술인 것은 알고 있었지만, 프로젝트를 진행하면서 웹 소켓에 대해서 좀 더 이해하고 싶어서 공부를 하게 되었다.Web Socket 개념과 배경Web Socket 이전웹 소켓은 실시간 통신이 필요할 때 사용되는 프로토콜이다. 웹 소켓이 등장하기 전에는 HTTP 프로토콜을 사용하여 인터넷 통신을 하였다. HTTP 통신이란 클라이언트가 요청을 하면 서버가 응답을 하는 반이중 통신 방식이다. 즉, HTTP는 클라이언트의 요청이 있어야만 서버가 클라이언트에게 데이터를 전달할 수 있는 구조이다. 만약 HTTP로 실시간 기능을 구현해야 한다면 어떻게 해야할까..
순환 참조 문제 해결(NestJS) NestJS 프레임워크를 공부하기 위해서 개인 프로젝트 개발에 도전하였다. 가볍게 대중적인 게시판 만들기부터 시작하였다. 이 게시판 개인 프로젝트에서 articles 모듈과, users 모듈 사이에 순환 참조 문제가 발생하여 어떻게 해결할지 고민했던 과거를 공유하고자 글을 작성하게 되었다.기존 프로젝트 모듈 구조개인 프로젝트에서 처음에는 크게 3가지 모듈을 나누어 작업을 하였다. 모듈은 다음과 같은 기능을 한다 :AuthModule : JWT 인증을 위한 모듈. 회원가입, 로그인을 담당함. 회원가입 시에 @Post('/register') 엔드포인트에서 UsersModule에 접근하여 User 객체 생성.UsersModule : 직접적으로 User 객체를 생성. Repository 디자인 패턴을 이용함.A..
비동기 함수(async function), Promise 란? 자바스크립트를 공부하다 보면 비동기함수, Promise 라는 단어를 많이 들어봤을 것이다. 나는 NestJS를 공부하면서 비동기 함수를 접하게 되었는 되었는데, 이때 "백그라운드에서 실행되는 메서드" 라는 간단한 개념만 인지한채로 공부하였다.그러다가 DB에서 데이터를 요청하는 repository 파일에 코드를 작성하던 중 async existsByEmail(email: string): Promise ~ 와 같은 비동기 함수를 많이 접하게 되었다. 이때부터 비동기 함수와 이 함수를 따라다니는 Promise가 무엇인지 제대로 파악할 필요를 느꼈다.비동기란?비동기에 대해 알기 전에 "동기"의 뜻을 먼저 설명하자면, 동기란 프로그램이 직렬적으로 수행되는 과정이라고 보면 된다. 요청이 오면 요청에 대한 응답을 받..