Redis 기반 랭킹 및 동시성 처리 시스템 구축이번 주차에서 얻어가고 싶은 것실시간 데이터 처리와 동시성 제어가 동시에 요구되는 환경에서 Redis가 얼마나 유용하게 사용될 수 있는지를 체험해보고자 한다.특히 Sorted Set 자료구조를 활용해 랭킹 시스템과 선착순 쿠폰 시스템을 구성하면서, 동시에 발생하는 업데이트 요청을 어떻게 안정적으로 처리할 수 있을지를 고민하고 싶다.또한, 기존의 DB 기반 락 처리 방식에서 Redis로 개선했을 때 성능과 구조적 이점이 어떻게 달라지는지도 꼭 확인해보고 싶다. 과제 요구사항실시간 판매량 기반 상품 랭킹 시스템 구축Sorted Set을 활용한 랭킹 갱신 및 조회 로직 설계기존의 낙관적 락 + 분산락 쿠폰 발급 로직을 Redis 기반으로 개선Redis 기반 동..
데이터베이스 락 기반 동시성 제어이번 주차에서 얻어가고 싶은 것동시성 문제가 발생하는 원인을 깊이 이해하고, 그에 대한 효과적인 대응 전략으로서의 DB 락 기반 제어 방식을 익히고 싶다.단순히 "동시성 제어가 필요하다"는 수준을 넘어서, 어떤 방식이 언제 적절한지 구체적으로 판단하고 설계할 수 있는 능력을 키우고 싶다. 과제 요구사항동시성 문제 식별(포인트 충전/사용, 쿠폰 발급, 주문 재고 처리 등)DB 락 전략(낙관적 락, 비관적 락)의 적용 비교테스트 환경에서 동시 요청을 시뮬레이션하여 실제 문제 재현 및 해결 문제 상황(1) 선착순 쿠폰 발급 과정에서 동시성 문제가 발생했다. 재고가 남아 있음에도 불구하고 중복 발급되거나, 재고보다 많은 쿠폰이 발급되는 문제가 발생했다. 주문 시 상품 재고 차감에..
데이터베이스 설계이번 주차에서 얻어가고 싶은 것데이터베이스를 어떻게 활용해야 '잘' 활용하는 것인지 알고싶다.여태는 단순히 DB를 사용해왔다면 이제는 효율적인 방안을 활용하고, 다양한 상황에서의 대응 전략을 유연하게 가져갈 수 있는 방법들을 배우고 싶다. 과제 요구사항Infrastructure Layer 작성기능별 통합 테스트 작성(Testcontainers 활용)쿠폰 발급 경쟁 조건 테스트외부 메시지 전송 실패 시 fallback 처리 검증) 문제 상황(1) testcontainers 활용 시 DB 생성 오류가 발생했다. 테스트 DB의 특정 테이블이 올바르게 생성되고 삭제되지 않는 문제다.(2) 선착순 쿠폰 발급 시 race condition으로 인해 올바르게 재고 처리가 되지 않는 문제가 발생했다.(..
클린 아키텍처이번 주차에서 얻어가고 싶은 것가장 흔하고 장벽이 낮은 레이어드 아키텍처에서 벗어나 다차원 채널, 복잡한 구조에서 빛을 발할 수 있는 헥사고날 아키텍처, 클린코드 아키텍처에 대해 알아보고 모두 적용할 수는 없겠지만 개념을 조금씩 적용해보는 것을 목표로 한다. 과제 요구사항이번 주차 과제 요구사항은 다음과 같았다. 일부 기능에 대한 비즈니스 로직과 단위 테스트를 구현한다.이때, 이커머스 서비스의 핵심인 주문/결제 기능은 클린 아키텍처를 적용한다. 문제 상황여태 레이어드 아키텍처만 고려하고 적용해온 입장에서 클린 아키텍처를 적용하라니, 어디서부터 시작해야할 지 막막했다. 또 차라리 전부 클린 아키텍처를 적용하는 것이 목표였다면 BP를 참고해 구조를 설계했겠지만, 핵심 기능 외에 레이어드 아키텍처..
TDD (Test Driven Development)테스트 주도 개발, 테스트 작성 후 구현 코드를 작성하는 방식이다. TDD는 학생때부터 계속해서 들어오고 이론은 알고 있지만, 실천해보진 못한 개발 방법론 중 하나였다. 1주차 과제를 통해 TDD로 개발을 진행했고, 왜 TDD를 사용하는지 조금이나마 알게 되었다. 배운 개념들과 기록들은 차차 블로그로 남길 예정이다. 그리고 테스트 더블, TDD의 원칙 등을 알 수 있던 소중한 시간이었다. 과제 요구사항핵심 요구사항을 간단하게 적자면 아래와 같다. 포인트 충전 서비스를 개발한다.기본 기능을 구현한다. (포인트 충전, 포인트 사용, 포인트 조회, 포인트 내역 조회)단위 테스트를 먼저 작성해야 한다. (TDD)동시에 여러 건의 포인트 충전, 이용 요청이 들어..
1. 요구사항 분석 및 목표 설정 지난 2주차에 대한 공통 피드백에 주어졌고, 요구사항 또한 추가되어 구현 단계에서 고려해야 할 요소들이 많아졌다. 그렇다고 뭔가 엄청난 것을 더해야 하는 것은 아니었지만, 지난 2주차도 만만치 않게 느껴졌던지라 이번 주차에서도 주의해야 할 점들에 대해 유의해서 살펴보았다. 그리고 지난 주차에서 아쉬웠던 점들을 열거하자면 다음과 같다. 처음 구현 단계에서 곧바로 클래스를 분리하지 못한 점 테스트 코드를 다양화하지 못한 점 예외 처리에 대해 좀 더 깊게 고민해 보지 못한 점 그래서 이번에는 좀 더 신경써서 위의 것들을 고려하면서도 발전된 형태로 실행해보기 위해 아래의 자그마한 목표들을 설정하였다. 처음부터 OOP 원칙을 준수하며 프로그램 구현하기: 메서드, 클래스의 역할을 ..
지난 10월 19일부터 우아한테크코스 프리코스에 참여하고 있다. 첫 주차는 시험기간 및 과제, 여러 일과 겹쳐 회고를 남기지 못했는데, 이번 2주차와 남은 3, 4주차는 돌아보는 시간을 가지며 소중한 기억들을 기록하고자 한다! 1. 요구사항 분석 및 목표 설정 지난 1주차가 Java 환경 설정, 기본적인 프로그램 구현과 git, 컨벤션을 준수하는 것이 목적이었다면, 이번 주차의 목적은 메서드가 한 가지 일만 하도록 하게 하는 등의 좀 더 객체지향 프로그래밍을 유도하는 요구사항 등이 추가되었다. 개인적으로는 클래스를 분리하여 프로그래밍을 하는 것이 오랜만이고 자바도 오랜만에 사용하다 보니 첫 주차에는 무엇보다도 적응하는 데에 목적을 두고 기본적인 프로그래밍 구현, 메서드 분리에 신경을 써서 과제를 수행했다..
NestJS 개발 환경 세팅새로운 프로젝트 만들기$ npm i -g @nestjs/cli$ nest new project-name위와 같이 package.json을 비롯하여 여러 파일이 생성된다.src 하위에는 여러 파일로 나뉘어져 있고 app.controller.ts의 경우 app.controller.ts를 테스트하는 파일이다.controller: express에서의 router와 유사한 개념 - 라우팅service: express에서의 service와 유사한 개념 - 비즈니스 로직// app.controller.tsimport { Controller, Get } from '@nestjs/common';import { AppService } from './app.service';@Controller()..