diff --git a/src/main/java/com/hackathon/tomolow/domain/transaction/service/MarketTransactionService.java b/src/main/java/com/hackathon/tomolow/domain/transaction/service/MarketTransactionService.java index 38fb6d8..28dcc06 100644 --- a/src/main/java/com/hackathon/tomolow/domain/transaction/service/MarketTransactionService.java +++ b/src/main/java/com/hackathon/tomolow/domain/transaction/service/MarketTransactionService.java @@ -130,6 +130,7 @@ public void marketSell(Long marketId, OrderRequestDto orderRequestDto) { BigDecimal totalPrice = price.multiply(BigDecimal.valueOf(quantity)); user.addCashBalance(totalPrice); user.subtractInvestmentBalance(totalPrice); + if (userMarketHolding.getQuantity() <= 0) userMarketHoldingRepository.delete(userMarketHolding); // 4. 체결 내역 DB에 저장 Transaction transaction = diff --git a/src/main/java/com/hackathon/tomolow/domain/transaction/service/MatchService.java b/src/main/java/com/hackathon/tomolow/domain/transaction/service/MatchService.java index a005310..3292d94 100644 --- a/src/main/java/com/hackathon/tomolow/domain/transaction/service/MatchService.java +++ b/src/main/java/com/hackathon/tomolow/domain/transaction/service/MatchService.java @@ -142,7 +142,8 @@ private void executeBuy(String marketId, String orderId, BigDecimal tradePrice, log.info("매수 체결 - orderId : " + orderId); } - private void executeSell(String marketId, String orderId, BigDecimal tradePrice, int quantity) { + @Transactional + public void executeSell(String marketId, String orderId, BigDecimal tradePrice, int quantity) { Market market = marketRepository .findById(Long.valueOf(marketId)) @@ -190,6 +191,7 @@ private void executeSell(String marketId, String orderId, BigDecimal tradePrice, // 4. 잔여 수량 갱신 orderRedisService.updateOrRemove(orderId, marketId, TradeType.SELL, quantity); + if (holding.getQuantity() <= 0) userMarketHoldingRepository.delete(holding); // 5. 체결 내역 DB에 저장 Transaction transaction = diff --git a/src/main/java/com/hackathon/tomolow/domain/userGroupStockHolding/service/UserGroupMarketHoldingService.java b/src/main/java/com/hackathon/tomolow/domain/userGroupStockHolding/service/UserGroupMarketHoldingService.java index 0a7472f..3014fb7 100644 --- a/src/main/java/com/hackathon/tomolow/domain/userGroupStockHolding/service/UserGroupMarketHoldingService.java +++ b/src/main/java/com/hackathon/tomolow/domain/userGroupStockHolding/service/UserGroupMarketHoldingService.java @@ -6,6 +6,7 @@ import java.util.List; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.hackathon.tomolow.domain.ticker.service.PriceQueryService; import com.hackathon.tomolow.domain.userGroup.entity.UserGroup; @@ -27,19 +28,24 @@ public class UserGroupMarketHoldingService { private final GroupOrderInfoService groupOrderInfoService; /** 마켓별로 사용자의 PnL 계산 */ + @Transactional public UserGroupMarketHoldingPnLDto getPnLByUserGroupAndMarket(UserGroup userGroup) { // 1. 사용자가 해당 그룹 내에서 소유하고 있는 마켓 조회 List userGroupMarketHoldings = userGroupMarketHoldingRepository.findByUserGroup_Id(userGroup.getId()); - if (userGroupMarketHoldings.isEmpty()) { + if (userGroupMarketHoldings.isEmpty()) return UserGroupMarketHoldingPnLDto.builder().pnLDtos(List.of()).build(); - } // 2. 마켓별로 손익금액과 손익률 계산 List pnLDtos = new ArrayList<>(); for (UserGroupMarketHolding holding : userGroupMarketHoldings) { + if (holding.getQuantity() <= 0) { + userGroupMarketHoldingRepository.delete(holding); + continue; + } + // 2-1. 해당 마켓의 평균 매수가 / 실시간 가격 조회 BigDecimal avgPrice = holding.getAvgPrice(); BigDecimal lastTradePrice = null; diff --git a/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/MarketGroupOrderService.java b/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/MarketGroupOrderService.java index 8508977..afd6a42 100644 --- a/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/MarketGroupOrderService.java +++ b/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/MarketGroupOrderService.java @@ -123,6 +123,8 @@ public void marketSell( BigDecimal totalPrice = price.multiply(BigDecimal.valueOf(quantity)); userGroup.addCash(totalPrice); userGroup.subtractInvestment(totalPrice); + if (userGroupMarketHolding.getQuantity() <= 0) + userGroupMarketHoldingRepository.delete(userGroupMarketHolding); // 5. 체결 내역 DB에 저장 UserGroupTransaction transaction = diff --git a/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/UserGroupOrderMatchService.java b/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/UserGroupOrderMatchService.java index 38a7184..fd03554 100644 --- a/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/UserGroupOrderMatchService.java +++ b/src/main/java/com/hackathon/tomolow/domain/userGroupTransaction/service/UserGroupOrderMatchService.java @@ -126,7 +126,8 @@ private void executeBuy( log.info("그룹 매수 체결 - orderId : " + orderId); } - private void executeSell( + @Transactional + public void executeSell( String marketId, String groupId, String orderId, BigDecimal tradePrice, int quantity) { Market market = marketRepository @@ -167,6 +168,7 @@ private void executeSell( // 4. 잔여 수량 갱신 groupOrderRedisService.updateOrRemove(orderId, marketId, TradeType.SELL, quantity, groupId); + if (holding.getQuantity() <= 0) userGroupMarketHoldingRepository.delete(holding); // 5. 체결 내역 DB에 저장 UserGroupTransaction transaction =