📦 Kama Swagger API 문서, 이제 진짜 문서처럼 만들기📝 개요Kama 프로젝트 4단계 작업으로 Swagger 문서 정리를 했다. 그동안 SwaggerConfig가 "Swagger 연습용 API Document"라는 기본값 그대로였고, 각 컨트롤러 태그도 클래스명이 그대로 노출되고 있었어서, 이번 기회에 실제로 쓸 수 있는 API 문서로 다듬었다.단순히 예쁘게 꾸미는 작업이 아니라, 각 API가 실제로 어떤 상황에서 어떤 에러를 던지는지 서비스 코드를 하나씩 확인하면서 정확하게 문서화하는 데 시간을 더 썼다.🤔 설계 결정401(로그인 필요)이랑 403(권한 없음)은 인증이 필요한 API라면 전부 공통으로 발생할 수 있는 응답이라서, API마다 반복해서 적지 않고 SwaggerConfig의..
[Spring Boot] 가상계좌 입금기한 만료 자동 처리 스케줄러 구현기카마 프로젝트에 무통장입금(가상계좌)을 붙인 지는 좀 됐는데, 정작 "입금기한 지나면 어떻게 되는가"는 스코프 밖으로 남겨뒀었다.가상계좌만 발급해두고 아무도 입금을 안 하면, 주문은 영원히 PENDING으로 남고 재고도 계속 묶여있는 상태였던 것.이번에 입금기한 만료 자동 처리 스케줄러를 붙여서 이 구멍을 메웠다.📝 개요목표는 간단하다. vbankDueDate(입금기한)가 지났는데도 여전히 PENDING 상태인 주문을 매시간 스캔해서,자동으로 취소 처리하고 재고를 복구하는 것. 기존에 이미 상품 할인 만료 / 장바구니 만료를 처리하던DiscountScheduler가 있어서, 그 패턴을 그대로 참고했다.🤔 설계 결정새로 짜기 전에..
[Spring Boot] 프로젝트 리네이밍(demo → kama) + 서비스 레이어 중복 제거이번엔 새 기능을 추가하는 대신, 그동안 미뤄뒀던 정리 작업을 했다.프로젝트명이 스프링 이니셜라이저 기본값인 "demo"로 남아있던 걸 실제 이름인 "kama"로 바꾸고, IntelliJ가 예전부터 중복이라고 표시해주던 서비스 코드도 한 번 손봤다.🏷️ 프로젝트 리네이밍: demo → kama"demo"라는 이름은 처음 스프링 부트 프로젝트를 만들 때 대충 설정해 둔 값인데, 시간이 지나면서 그냥 방치하고 있었다.이번에 IntelliJ 패키지에 있는 Refactor 기능으로 자바 패키지명(com.jeeeun.demo → com.jeeeun.kama)부터 정리했다.텍스트 에디터에서 직접 폴더명과 package 문..
🧪 무통장입금 + Webhook, 테스트로 검증하기지난 글에서 무통장입금(가상계좌) + Webhook 기능을 구현하고, 테스트는 다음 단계로 남겨뒀었다. 오늘은 그 남은 숙제(!!!)를 끝내는 날이다. 단위 테스트부터, 실제로 ngrok 터널을 열어 로컬 서버를 인터넷에 노출시키고 포트원 Webhook을 진짜로 받아보는 것까지 — 계획했던 검증을 전부 실행해보았다 후후.📝 오늘 한 일 개요Mockito 기반 단위 테스트 5개 작성 — 주문 생성 로직 2개, Webhook 처리 로직 3개ngrok으로 로컬 8080 포트를 실제 HTTPS 주소로 노출포트원 콘솔에 Webhook URL을 직접 등록하고 실제 호출 테스트까지 성공실제 PG로 가상계좌를 발급하고 입금을 시뮬레이션하는 Postman 테스트는 의..
📦 무통장입금(가상계좌) + Webhook 구현기이커머스 프로젝트 Kama에서 결제수단으로 카드결제만 지원하던 걸 무통장입금(가상계좌)까지 지원하도록 확장했다. 기존에는 결제가 그 자리에서 바로 끝나는 카드결제만 있었고, 주문도 결제 검증이 끝나는 즉시 PAID로 생성됐다. 무통장입금은 "계좌 발급"과 "실제 입금"이 시간적으로 분리돼 있어서, 주문 생성 로직과 함께 결제 상태를 비동기로 알려주는 Webhook까지 같이 붙여야 했다.📝 개요결제 상태가 paid(카드결제 완료) 또는 ready(가상계좌 발급, 입금 전)일 때 모두 정상 처리하도록 주문 생성 로직 확장가상계좌 발급 시점엔 주문을 PENDING으로 생성, 실제 입금 확인은 포트원 Webhook으로 비동기 수신Webhook 수신 시 body..
📦 주문 취소 사유(reason) 파라미터화 구현기이커머스 프로젝트 Kama에서 주문 취소 API를 개선했다. 기존에는 고객이 취소 사유를 입력할 수 없었고, 포트원(PortOne)에 보내는 환불 사유도 "주문 취소"로 고정되어 있었다. 이번 작업에서는 취소 사유를 정형화된 값으로 받아 저장하고, 외부 결제사에도 실제 사유를 전달하도록 개선했다.🌀 개요취소 사유가 남지 않으면 CS 이력 추적이 어렵고, 추후 반품 기능을 구현할 때도 재사용할 수 있는 데이터가 없다. 그래서 이번 기회에 취소 사유를 Order 엔티티에 영구 저장하기로 했다.처음에는 취소 사유를 자유 텍스트(String)로 받으려 했다. 그런데 실제 이커머스 서비스들을 살펴보니, 고객이 직접 사유를 타이핑하게 하는 경우는 드물었다. 대부..