분류 전체보기 (13) 썸네일형 리스트형 반복 일정의 복잡한 업데이트: 삭제 후 생성 vs 직접 업데이트 플래너 앱을 개발하면서 가장 복잡했던 기능 중 하나가 바로 반복 일정 업데이트였습니다. Google Calendar나 Outlook을 사용해보신 분들이라면 익숙하실 "이 일정만", "이 일정 이후부터", "관련된 모든 일정"과 같은 선택지들을 구현하는 과정에서 많은 고민과 시행착오를 겪었습니다. 이번 글에서는 일정 시스템에서 Create, Delete, Update 각각에 필요한 API 설계부터 복잡한 반복 일정 업데이트 로직까지 차근차근 정리해보겠습니다.기본적인 일정 API 설계Create API - 새로운 일정 생성가장 기본적인 일정 생성 API부터 살펴보겠습니다.POST / events;단일 일정과 반복 일정 모두 같은 엔드포인트를 사용합니다. 요청 바디에 recurring 필드가 있으면 반복 일정.. NestJS에서 Google Cloud Storage 사용법 웹 애플리케이션을 개발하다 보면 사용자가 업로드한 파일을 저장해야 하는 경우가 자주 있습니다. 특히 프로필 이미지나 컨텐츠 이미지 등을 다룰 때는 안정적이고 확장 가능한 저장소가 필요합니다. Google Cloud Storage(GCS)는 이런 요구사항을 만족시켜주는 훌륭한 클라우드 저장소 서비스입니다. 이번 글에서는 NestJS에서 Google Cloud Storage를 활용해 파일 업로드 기능을 구현하는 방법을 정리해보겠습니다.Google Cloud Storage란 무엇인가?Google Cloud Storage는 구글에서 제공하는 객체 저장소 서비스입니다. 다음과 같은 장점들이 있습니다:확장성: 용량 제한 없이 파일을 저장할 수 있습니다.내구성: 99.999999999%(11개의 9) 내구성을 제공합.. 왜 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를 통해 해당 사용자가 누구인지 식별합니다. 이 방식의 장점은 서버가 인증.. Docker를 왜 사용할까? Docker를 왜 사용할까?개발 환경이 잘 돌아가고 있다고 생각했는데, 팀원이 내 코드를 실행했더니 오류가 난다. “내 컴퓨터에서는 잘 되는데요?”라는 말이 나오는 순간, 우리는 무엇이 문제인지 하나하나 찾아야 한다. 이럴 때 유용한 기술이 바로 Docker(도커) 이다. 이 글에서는 Docker가 정확히 어떤 기술인지보다는, 왜 사용하는지, 그리고 어떤 문제를 해결해주는지를 중심으로 정리해보고자 한다.환경 차이에서 오는 문제어떤 프로그램이 잘 동작하려면, 단순히 코드만 있으면 되는 게 아니다. 운영체제, 언어 버전, 라이브러리 설치 여부 등도 모두 영향을 미친다. 이걸 통틀어 우리는 실행 환경이라고 부른다. 문제는 개발자마다 환경이 조금씩 다르다는 것이다. 같은 코드를 실행하더라도 누구는 에러가 나고,.. 데이터베이스에서 인덱스(Index)는 어떻게 작동할까? 데이터베이스에서 인덱스(Index)는 어떻게 작동할까?데이터베이스에서 데이터를 다루다 보면, 어느 순간부터 조회 속도가 점점 느려지는 걸 체감하게 된다. 단 몇 개의 데이터일 땐 문제가 없었는데, 수천~수백만 건이 넘어가면 SELECT 한 줄에도 시간이 오래 걸릴 수 있다. 이 문제를 해결하기 위해 등장한 기술이 바로 인덱스(Index) 이다. 이 글에서는 인덱스가 무엇인지, 왜 필요한지, 내부적으로 어떤 방식으로 동작하는지에 대해 간단히 정리해보고자 한다.인덱스(Index)란?인덱스는 쉽게 말하면 책의 목차와 같다. 책에서 '자료구조'라는 키워드를 찾고 싶을 때, 책의 첫 장부터 모든 페이지를 다 넘기진 않는다. 대신 맨 앞에 있는 목차나 맨 뒤의 색인을 참고해 해당 키워드가 몇 페이지에 있는지 확인하.. Percaptron(퍼셉트론)에서 딥러닝까지: 인공신경망의 구조적 기초 딥러닝과 머신러닝 차이는? (feat. Perceptron)두 기술은 모두 데이터로부터 패턴을 학습하고 예측을 수행한다는 공통점을 가지지만, 내부 구조와 학습 방식에는 뚜렷한 차이가 존재한다. 이 글에서는 머신러닝과 딥러닝의 차이를 설명하고, 딥러닝의 뿌리라고 할 수 있는 퍼셉트론(Perceptron)에 대해 함께 살펴보고자 한다.머신러닝(Machine Learning)이란머신러닝은 명시적인 프로그래밍 없이도 데이터를 통해 패턴을 학습하고, 그 결과를 바탕으로 새로운 데이터에 대해 예측하거나 분류하는 기술이다. 주어진 데이터에서 통계적 규칙을 추출하여 모델을 학습시키며, 이를 통해 자동화된 의사결정을 가능하게 한다. 머신러닝은 크게 지도 학습(Supervised Learning), 비지도 학습(Unsup.. 이전 1 2 다음