분류 전체보기 25

[캐시] 10만 건 돌려보니까 보이더라(인덱스, 캐시 실전 적용기)

인덱스, 캐시 그래서 언제 어떻게 사용하는 거야? 10만 건 상품 데이터로 EXPLAIN 찍고, 부하테스트 돌려보니까 보이더라 TL;DR 복합 인덱스 하나로 읽은 행이 5,000 → 20으로 줄고, 실행 시간이 76~231배 개선됐다. Redis 캐시만 쓰면 네트워크 왕복이 병목. 로컬 캐시(Caffeine)를 앞에 두니 목록 조회 p95가 10.71ms → 7.08ms로 떨어졌다. "캐시 쓰면 빨라진다"는 감이 아니라, EXPLAIN과 부하테스트로 숫자로 증명하는 게 중요했다. 인덱스가 뭘까? ..

Skill 2026.03.12

[동시성] 비관적 락 하나로 다 해결한 줄 알았다

비관적 락 하나로 다 해결한 줄 알았다(도메인 순수성과 성능 사이에서 락전략) 비관적 락 하나로 락을 정복한 줄 알았습니다.. TL;DR동시성 전략은 하나로 통일하는 게 아니라, 도메인 특성에 따라 달라야 한다.좋아요 → Atomic Update / 쿠폰 → 비관적 락 / 재고 → 비관적 락 으로 결정한 이유그런데 도메인 아키텍처에 집착하면, 더 가벼운 도구를 놓칠 수도 있다. 비관적 락이면 되는 거 아니야? 이전까지 비관적락과 낙관적락을 비교하는 포스팅을 할정도로 저는 꽤 자신감이 있었습니다. 재고 차감? SELECT ... FOR UPDATE로 줄 세우면 끝. 쿠폰 이중 사용? 마찬가지로 비관적 ..

Skill 2026.03.06

[DIP]도메인서비스(Domain Service) 가 서비스(Service)와 뭐가 다른데?

이커머스 프로젝트에서 브랜드 도메인을 구현하다가 문득 이런 생각이 들었습니다." DDD 구현중인데 이 @Transactional, 도메인에 있어도 되는 거 맞아?" 발단: 어노테이션 하나에서 시작된 의문 브랜드 CRUD를 구현하고 나서, 코드를 보고 있었습니다. 겉보기에는 아무 문제 없었습니다. 테스트도 다 통과하고, API도 잘 동작했습니다. // Domain Service@Transactionalclass BrandService( private val brandRepository: BrandRepository,) { fun createBrand(name: String, description: String?): Brand { val brand = Brand(name = nam..

Skill 2026.02.27

[루프백] 2주차 WIL(What I Learned)

✨ WIL은 왜 쓰는 걸까?매주 배운 걸 기록하거나, 돌아보지 않으면 금방 잊히곤 합니다.그래서 루프팩에서는 기술적인 개념 + 내가 느낀 점을 글로 정리해보는 습관을 만들어 갈 거예요.그냥 단순히 회고가 아니라, 아래와 같이 학습하고, 체화한 흐름을 나만의 언어로 써보는 게 핵심이에요.📌 무엇을 중점적으로 학습했는지📌 어떤 것이 특히 헷갈렸는지📌 결국 어떻게 이해하게 됐는지 이번 주에 새로 배운 것 + 이런 고민이 있었어요 1. 소프트웨어 설계 문서 작성 이번 주 과제는 이커머스 프로젝트의 설계 문서 4종을 작성하는 것이었다.파일명 내용01-requirements.md유저 시나리오 기반 기능 정의, 요구사항 명세02-sequence-diagrams.md시퀀스 다이어그램 최소 2개 이상 (Mermai..

Project 2026.02.14

[동시성] 재고는 한개인데 주문이 동시에 들어오면?(비관적 락 vs 낙관적 락)

"재고가 딱 1개 남았는데 두 명이 동시에 주문하면 어떻게 되지?" 이번에 이커머스 프로젝트의 설계를 진행하면서, 주문 생성 흐름을 생각하고 있었습니다. 상품 조회 → 재고 확인 → 재고 차감 → 주문 생성 글로 적으면 단순한 흐름인데, 막상 "동시에 요청이 들어오면?" 의 제대로 답을 하지 못했습니다.재고는 이커머스에서는 상당히 중요한 존재이면서 동시에 외부몰, 자사몰, SCM 등 많은 도메인에 얽혀 있는 복잡한 문제입니다. 재고가 한번 틀어지면 그 틀어진 구간을 바로 잡기가 정말 어렵습니다. 실제로 회사에서 외부몰과 자사몰의 재고 싱크가 어긋나서, CS 팀이 하루 종일 수동으로 주문 취소 처리를 했던 적도 있습니다. 재고 -1이 만들어낸 나비효과가 고객 불만, 보상 비용, 운영 리소스 낭비로 이어지는..

Skill 2026.02.13

[루프백] 1주차 WIL(What I Learned)

✨ WIL은 왜 쓰는 걸까?매주 배운 걸 기록하거나, 돌아보지 않으면 금방 잊히곤 합니다.그래서 루프팩에서는 기술적인 개념 + 내가 느낀 점을 글로 정리해보는 습관을 만들어 갈 거예요.그냥 단순히 회고가 아니라, 아래와 같이 학습하고, 체화한 흐름을 나만의 언어로 써보는 게 핵심이에요.📌 무엇을 중점적으로 학습했는지📌 어떤 것이 특히 헷갈렸는지📌 결국 어떻게 이해하게 됐는지이번 주에 새로 배운 것 + 이런 고민이 있었어요 1. TDD (Test Driven Development) 미루고 미루던 테스트 주도 개발에 대해 학습하고, TDD를 사용해서 프로젝트를 진행했다. ▸ Red/Green/Refactor 사이클테스트 먼저 → 구현 → 리팩토링 단계를 직접 개발해보면서 Claude Code와 함께하..

Project 2026.02.08

이제 더는 안되겠다 TDD 너 일로 나와 (with claude code)

제목 어떠셨나요? 더는 못참겠어서 Claude Code를 앞에 세워 TDD를 불러내 봤습니다! 😂왜 이 글을 쓰게 되었는가?개발자들에게 TDD는 너무 익숙한 단어이면서, 또 저같은 테스트 코드를 멀리하던 개발자에게는 두려운 단어이기도 한 것 같습니다. TDD를 다들 어디서 들어보셨나요? 저는..."요즘은 TDD가 대세래!""좋은 회사는 TDD로 개발한대!""TDD로 개발한 코드가 좋은 코드래!" 라는 말을 수도 없이 들어왔습니다. 그런데 솔직히 이렇게 생각했어요."TDD... 나도 알아! 그런데 급하게 업무가 쏟아지는데 언제 테스트 먼저 짜고 있냐고!" 지금 생각해보면 사실 도피였던 것 같아요. 잘 모르니까, 또 "할 상황이 안 된다"고 핑계를 대고 있었던 거죠. 이번에 루퍼스에서 회원 API(회원가입..

Skill 2026.02.06

[Spring] SimpleDateFormat 사용 시 NumberFormatException 발생 원인

워치 데이터를 서버 DB에 저장하는 API 에서 java.lang.NumberFormatException: multiple points 에러가 발생했다. 문자열로 들어온 데이터를 원하는 날짜 형식에 맞게 저장하는 로직에서 parse 과정을 여러번 반복해야했고, 때문에 static 변수로 SimpleDateFormat 을 사용하고 있었는데, 해당 로직에서 발생한 에러였다. 로그를 열어보니 잘못들어온 데이터가 전혀 없었고 validate 이후에 parse 되기 때문에 이유를 전혀 알수 없었지만, SimpleDateFormat을 static 으로 선언하면 parse 로직에서 간헐적으로 발생한다고 한다.이런...(해당 API 는 parse 과정을 여러번 반복해서 진행하기 때문에 발생한것 같다.) 아래 블로그를 ..

Spring 2023.11.17

[백준]9012_괄호(자료구조/python)

괄호 시간 제한/메모리 제한/제출/정답/맞힌 사람/정답 비율 1 초 128 MB 181847 85035 61208 45.696% 문제 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 ..

Algorithm 2023.09.24

[백준] 9093_단어 뒤집기(자료구조/python)

단어 뒤집기 시간 제한/메모리 제한/제출/정답/맞힌 사람/정답 비율 1 초 128 MB 34351 18097 13642 53.599% 문제 문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다. 입력 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다. 출력 각 테스트 케이스에 대해서, 입력으로 주어진 문장의 단어를 모두 뒤집어 출력한다. 예제 입력 1 2 I am happy today We want to win the first prize 예제..

Algorithm 2023.09.24