분류 전체보기53 재고가 마이너스가 된 날, 트랜잭션 격리 수준을 배웠습니다 재고가 마이너스가 된 날, 트랜잭션 격리 수준을 배웠습니다—동시 요청이 겹치며 벌어진 사고에서 출발해 격리 수준의 개념과 실전 대처를 정리한 글입니다. 같은 상품을 동시에 주문하면 벌어지는 일작은 커머스 서비스의 백엔드를 맡고 있던 재작년 겨울, 한정 수량 이벤트를 열었던 날의 이야기입니다. 오픈 3분 만에 재고 테이블을 확인했더니 어떤 상품의 qty 컬럼이 -1을 가리키고 있었습니다. 처음엔 눈을 의심했죠. 재고가 음수라니, 물리적으로 존재할 수 없는 값이 데이터베이스에 버젓이 앉아 있었으니까요.당시 재고 차감 코드는 부끄러울 만큼 순진했습니다. 대략 이런 모양이었습니다.// 재고를 조회 후 애플리케이션에서 판정int stock = repo.findQtyById(productId);if (stock >.. 2026. 7. 4. CORS 에러의 진짜 원인 CORS 에러의 진짜 원인을, 하루를 통째로 날린 삽질 끝에 이해한 대로 풀어 쓴 글입니다. 브라우저는 왜 내 요청을 막았는가 CORS 에러를 처음 만나면 대부분 서버가 요청을 거부했다고 오해합니다. 저도 그랬죠. 그런데 사실은 정반대에 가깝습니다. 요청은 서버에 잘 도착했고, 서버는 응답까지 정상적으로 돌려줬는데, 그 응답을 받아 본 브라우저가 "이건 규칙 위반이야"라며 자바스크립트에게 넘겨주지 않는 상황이 CORS 에러입니다. 즉 에러를 내는 주체는 서버가 아니라 브라우저입니다.왜 이런 장치가 있을까요. 브라우저에는 same-origin policy, 즉 "같은 출처끼리만 자유롭게 통신하라"는 기본 원칙이 있습니다. 여기서 출처(origin)는 프로토콜·도메인·포트 세 가지가 모두 같아야 같은 것으로.. 2026. 7. 4. JWT 인증의 구조와, 내가 빠졌던 함정 JWT 인증의 구조와, 내가 빠졌던 함정을 실제 "멀쩡히 쓰다 갑자기 로그아웃되는" 버그를 겪으며 이해한 대로 정리한 글입니다. JWT는 어떻게 로그인을 기억하는가 전통적인 세션 방식은 서버가 "누가 로그인했는지"를 직접 기억합니다. 로그인하면 서버 메모리나 저장소에 세션을 남기고, 브라우저에는 그 세션을 가리키는 열쇠만 쥐여 주죠. 반면 JWT는 접근을 뒤집습니다. 서버가 아무것도 기억하지 않는 대신, "이 사람은 누구이고 무엇을 할 수 있다"는 정보를 토큰 자체에 적어 클라이언트에게 통째로 건네줍니다. 요청이 올 때마다 서버는 그 토큰이 위조되지 않았는지만 검증하면 되죠. 이 토큰은 점 두 개로 나뉜 세 조각으로 되어 있습니다.헤더(header) — 어떤 알고리즘으로 서명했는지 같은 메타 정보가 들어.. 2026. 7. 4. 디바운스와 스로틀, 언제 무엇을 써야 하는가 디바운스와 스로틀, 언제 무엇을 쓸 지 검색창 하나 때문에 서버를 잡아먹을 뻔했던 경험에서 출발해 두 기법의 차이와 실전 선택 기준을 정리합니다. 자동완성 검색창이 서버를 두드려 팬 날 처음 자동완성 검색창을 만들었을 때, 저는 아주 순진하게 짰습니다. 입력창의 onChange에 그대로 API 호출을 붙였죠. 한 글자 칠 때마다 서버로 검색어를 보내고 결과를 받아 목록을 그리는 방식이었습니다. 로컬에서는 완벽해 보였습니다. "제이든"을 치면 관련 결과가 착착 떴으니까요.문제는 배포 다음 날 드러났습니다. 백엔드를 맡은 동료가 "검색 API 호출이 왜 이렇게 많아요?"라고 물어왔죠. 대시보드를 열어 보니 검색 엔드포인트의 초당 요청 수가 평소의 몇 배로 튀어 있었습니다. 원인은 명백했습니다. "제이든"이.. 2026. 7. 3. [프로그래머스] <기능개발> 99클럽 스터디-14 + 작업량 문제 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자연수입.. 2024. 4. 11. [Docker] Docker란 무엇이고 왜 쓸까? 도커(docker)란? 도커는 애플리케이션을 컨테이너(container)라는 격리된 환경에서 실행할 수 있도록 해주는 오픈 소스 가상화 기술 가상화 기술은 이전부터 사용했지만(Virtual Machine 등), docker의 장점이 있다. 격리 시켜야 하는 이유? 하나의 물리적 시스템 안에서 여러 애플리케이션을 구동하면, 충돌이 일어나거나 관리 어려움(하나의 애플리케이션의 에러로 다른 시스템까지 영향) 배포 환경을 옮길 때에도 서버에 이전 서버와 같이 모든 환경 세팅을 새로 해야하는 번거러움 존재(도커로 이식성 증가) 도커 vs Virtual Machine(VM, 가상머신) 오른쪽 VM의 경우, 격리시키고자 하는 App을 위해 게스트 OS를 각각 올려 리소스를 할당한다. 그러나, 얼마만큼의 리소스를 할당.. 2024. 4. 2. 이전 1 2 3 4 5 6 7 8 9 다음