TIL - 지정가 매매시, 검증 허점 보완
·
내배캠
1. 지정가 매도 주문 수량 검증 누락 (trade-service)Problem보유 주식 1주로 지정가 매도 주문을 횟수 제한 없이 반복 제출할 수 있었다. 예를 들어 삼성전자(005930) 1주를 보유한 상태에서 지정가 매도 주문을 100번 넣으면 100개의 PENDING 주문이 그대로 DB에 쌓였다. 결국 체결 시점에 1건만 성공하고 나머지 99건은 전부 실패(FAIL) 처리되는 좀비 주문이 발생했다.로그 예시:[주문] 지정가 미체결 저장 — tradeId=9efac9b7 SELL 005930 1주 지정가=273000.0 현재가=271500.0[주문] 지정가 미체결 저장 — tradeId=932ba018 SELL 005930 1주 지정가=273000.0 현재가=271500.0...[주문] 보유 부족 ..
TIL - REQUIRES_NEW 자기 호출 시, 순환 참조 발생
·
내배캠
지정가 PENDING 무제한 요청 가능 + 스케줄러 좀비 SUCCESSProblem보유하지 않은 주식종목으로 SELL 지정가를 반복 전송할 수 있었고, /api/trades/pending 응답에 phantom 6건이 쌓여 있었다. 게다가 가격조건 만족 시 스케줄러가 체결을 시도하면 자산은 변하지 않았는데 trade 만 SUCCESS 로 박히는 좀비 데이터까지 발생했다.Analyze세 가지가 동시에 깨져 있었다.(1) PENDING 진입 시 검증 없음 — validateOrderRequest 는 limitPrice/stockAmount 만 본다. 보유/잔액 검증은 asset-service 호출 시점에 일어나는데, PENDING 분기는 asset-service 를 호출조차 안 하고 DB INSERT 만 한다..
TIL - 지정가 매매 시 트러블 슈팅
·
내배캠
softDelete와 유니크 제약softDelete 적용 시, 보유한 주식을 전량 매도 후, 같은 주식을 다시 살려고 할 때,이미 보유한 주식 id + 계좌 id로 새로운 데이터를 생성하려고 하니 에러가 났다.유니크 제약은 deleted_at 필드나 deleted_by를 확인할 순 없기 때문이다.그래서 매도 시, 보유 주식을 hardDelete 하는 방식으로 바꿨다.WebConfig에 Resolver등록계좌 id를 헤더를 통해 받는데, 막상 WebConfig에 resolver가 등록이 안되어있어서헤더를 보내건 안 보내건 null로 받아지는 문제가 발생했다.그래서 resolver를 등록해서 계좌 id를 헤더로 전달받을 수 있도록 했다.지정가 매매 시, 지정가 매매 내역 생성 후, 생성된 tradeId로 반..
TIL - DB/Redis/Kafka 분산트랜잭션 대응
·
내배캠
코드 리뷰이번에 최종프로젝트를 진행하는 다른 조의 코드를 리뷰해봤다. 분산 트랜잭션 문제를 해결하기 위한 고민들을 엿보며 어떤 기술들을 왜 채택했는 지 알아보았다.Problem기존에는 Match 엔티티의 상태를 바꾸면 됐다.@Transactional public MatchResult changeStatus(ChangeMatchStatusCommand command) { Match match = matchRepository.findByIdAndDeletedAtIsNull(command.matchId()) .orElseThrow(() -> new MatchNotFoundException(command.matchId())); match.changeSta..
TIL - 작업하던 브랜치에서 바로 git pull origin dev를 하면?
·
내배캠
Problem팀원의 변경사항이 dev 브랜치로 merge 됐다.그래서 빨리 변경사항을 내가 작업하던 코드에 반영하고 싶어서로컬에서 작업하던 feature 브랜치에서 바로 git pull origin dev를 했더니..변경된 코드가 엄청 많다고 나오고 충돌이 났다.Analyze이렇게 하게 되면, 다시 dev로 pr을 올리면 같은 내용이 2번 올라가는 구조라서내가 작업하던 브랜치에서 바로 원격의 dev를 pull 받아와서 dev로 pr을 올리면 팀원의 변경사항과 내 변경사항 + 팀원의 변경사항이 충돌이 나게 되는 것이다.Action일단.. 충돌을 해결하고 dev로 병합을 하고 다음엔 어떻게 해야 하는지 배웠다.팀원이 dev로 변경사항을 pr을 올려서 merge를 했을 때, 내가 어떻게 받아오면 되느냐?1. ..
TIL - 프로젝트에 같은 모듈을 중복으로 import 하면?
·
내배캠
Problem모노레포의 멀티모듈 프로젝트에서, 다른 서비스의 빌드가 통과하지 않아서, 내가 맡은 서비스만 빌드를 하고 싶어서프로젝트에 내가 맡은 서비스만 추가로 임포트를 했더니,이미 존재하던 서비스와 충돌해서 gradle 의존성을 하나도 못 가져오는 상황이 발생했다.Analyze사실 다른 서비스의 빌드가 통과하지 않는 이유는 테스트 코드까지 빌드를 같이 했기 때문이다.그래서 루트 디렉터리에서 테스트 코드는 제외하고 빌드를 했으면 되는데 이 명령어를 몰랐다...\gradlew build -x testAction그래서 추가로 임포트한 내가 담당하던 모듈을 제거해야 했다.방법은 File > 프로젝트 구조에서 추가로 임포트 한 모듈을 - 버튼을 눌러서 제거하면 되는데모듈 자체를 바로 제거하려하면 안 돼서내부의 ..