2025년 회고
·
끄적끄적
개발자로서 성장임팩트기술만 좋으면 된다고 믿었다.클린 코드, 리팩토링, TDD, 도메인 주도 설계.좋은 코드를 짜는 것이 개발자의 최고 덕목이라 생각하며 끊임없이 수련했다.그런데 AI 시대가 오면서 그 전제가 흔들렸다.코드를 잘 작성하는 것만으로는 대체 불가능한 가치를 만들 수 없다는 걸 체감했다. 그렇다면 개발자가 진짜 집중해야 할 것은 무엇인가.나는 도메인에 깊이 들어가는 것이라고 결론 내렸다.어떤 문제를 먼저 풀어야 하는지 판단하고, 가장 빠르게 해결하는 방법을 설계하는 능력이 가장 중요하다. 토스 러너스 하이를 기점으로 이 관점을 의식적으로 연습했다.어떻게 하면 임팩트를 키울 수 있을지, 무엇을 먼저 풀어야 할지 계속 고민했다.그 과정에서 내가 먼저 바꾼 건 “바로 구현에 들어가는 습관”이었다.요..
CDN 비용 줄이기 - 브라우저 캐시
·
프로젝트
CDN을 도입했는데 매달 나가는 비용이 부담스럽다고 생각한 적이 있는가? 우리 팀은 브라우저 캐시 설정만으로 연간 100만원 이상의 CDN 비용을 절감했다. 단순히 Cache-Control 헤더를 적절히 설정하는 것만으로도 가능하다.이 글에서는 CDN의 기본 원리부터 시작해서, Cache-Control 헤더에 대한 설명과 브라우저 캐시를 활용해 어떻게 비용을 절감할 수 있는지 실제 경험을 바탕으로 공유하려고 한다. CDNCDN의 필요성한국에 있는 사용자가 미국 서버에 있는 이미지를 요청한다고 생각해보자.사용자의 컴퓨터 → 공유기 → 한국 통신사(ISP) → 해저 케이블 게이트웨이 → 태평양 해저 케이블 → 미국 통신사 → 데이터 센터 라우터 → 최종 서버 등 수십 개의 장비(Router/Switch)를 ..
이론상 10만 QPS를 처리할 수 있는 티켓팅 시스템
·
Redis
티켓팅 시스템요구사항유명인의 내한으로 이벤트를 열게 되었다. 선착순 1,000명에게만 주어지는 기회다.티켓팅 신청을 웹 애플리케이션으로 받으려고 계획 중이며, 요구사항은 아래와 같다. 티켓 수량: 선착순 1,000장제한: 1인 1티켓. 중복 불가.예상 트래픽: 5만 명 동시 접속인프라 제약: 애플리케이션 서버는 필요한 만큼 scale-out 가능목표 응답시간: 1초 이내 동시성 처리? 락?분산 락을 통해 락을 걸었다고 해보자. 혹시 완벽하게 동시성을 제어했다고 안심하고 있는가?티켓 오픈 시간, 수만 명이 몰려올 때 서버에서는 어떤 일이 벌어지게 될까? 대규모 트래픽이 하나의 자원을 획득하기 위해 경쟁하는 상황이 벌어지면, 이는 치명적 병목이 될 수 있다. 아래는 실제로 5만 명이 동시 요청을 보냈을 때의..
자기 입맛에 맞는 NestJS 초기 세팅하기
·
NestJS
NestJS 시작하기"NestJS boilerplate" NestJS를 처음 시작한 사람들은 한 번씩 검색해봤을 법한 키워드일 것이다.근데 막상 코드를 확인해보면 뭐가 뭔지, 다 필요한 건지 헷갈린다.그렇다고 `nest new`만 치고 시작하자니, 허전하다. 선배 개발자가 옆에서 "이것만 세팅하면 돼" 라고 알려주는 느낌으로, 정말 필요한 설정들만 정리해봤다. 기본 설정1. NVM 자동 설정하기만약 노드 버전을 합의하지 않고 프로젝트를 시작했다고 해보자.여러 의존성을 설치하다보면 서로의 노드 버전이 맞지 않아 에러가 발생하게 될 수 있다. 이 문제는 NVM(Node Version Manager)으로 해결할 수 있다.설치하기 (Mac 기준)homebrew를 통해 nvm을 설치하자.$ brew instal..
AOP로 동시성 처리 코드 분리하기
·
Spring
이 글에서는 Spring AOP를 활용해 분산 락 처리 코드를 비즈니스 로직에서 완전히 분리하는 방법을 소개한다. 동시성을 제어를 위해 Lock 인터페이스를 사용할 때, try-finally 블록과 락 관리 코드가 비즈니스 로직을 압도하는 문제를 겪게 된다. Spring의 @Transactional이 트랜잭션 관리를 단순화한 것처럼, DistributedLock Aspect를 만들어 이 문제를 해결할 것이다. 또한, Spring Cache의 검증된 패턴을 참고하여 SpEL 평가기를 만들어 @DistributedLock의 사용성을 확장해볼 것이다. Lock 인터페이스Java/Spring에서 Lock 인터페이스를 직접 사용하면 필연적으로 try-finally 블록을 작성해야 한다.에러가 발생했을 때 락을 해..
Lettuce 분산 락의 오해와 진실 (feat. RedisLockRegistry)
·
Redis
이전 글인 "좋아요 기능으로 알아보는 비관적 락"에서 이어지는 글이다. "Lettuce는 SpinLock만 지원한다"는 잘못된 정보를 바로잡고, Spring RedisLockRegistry의 PubSub Lock 설정으로 Redisson 없이도 효율적인 분산 락을 구현하는 방법을 소개한다. Lettuce에 대한 오해, 당신도 믿고 있는가?구글에 "Redis 분산 락"를 검색하면 수십 개의 블로그가 같은 내용을 반복한다:"Lettuce는 SpinLock 방식이라 Redis에 부하를 준다""그래서 Redisson을 써야 한다""Lettuce로는 PubSub 방식을 구현할 수 없다"이런 주장들이 마치 정설처럼 반복되고 있다. 그리고 이러한 논리를 바탕으로 Redisson 구현체를 추천한다. 하지만, 이는 ..