Skip to content

Commit

Permalink
feat: 주문, 담기 시 낙관적 락 동시성 처리 (#223)
Browse files Browse the repository at this point in the history
* feat: 장바구니 추가 기능 구현

* feat: 장바구니 조회 기능 구현

* feat: 상품 주문과 식권 사용 기능 구현

* style: 포인트트랜잭션 레포지토리명 변경

* deploy: 재배포

* deploy: 재배포2

* deploy: 로그인 로직 수정에 따른 재배포

* deploy: 로그인 로직 수정에 따른 재배포2

* feat: 식권 사용 기능 구현

* feat: yml 수정 사항 반영

* feat: 식권 사용 로직 수정

* feat: 주문 로직 수정 완료

* fix: 장바구니에 아무것도 없을 때 주문 시 active 되는 현상 수정

* feat: 주문 완료 시 리턴 값 수정

* feat: 내 그룹 조회 기능 구현

* feat: 기본 프로필 이미지 url 추가

* feat: 그룹 멤버 전체 조회 기능 구현

* feat: 1인당 사용 가능 금액 설정 컬럼 추가

* feat: 내 지갑 조회 기능 구현

* feat: 선결제 기능 구현

* feat: 유저 홈 화면 조회 기능 구현

* feat: 그룹 상세 조회 기능 구현

* feat: 가게 상세 조회 쿼리 수정

* deploy: 변경사항 반영을 위한 커밋

* deploy: 수정 사항 반영 재배포

* deploy: rds 교체로 인한 재배포

* deploy: rds 교체로 인한 재배포2

* feat: 홈 화면 소속팀 조회 쿼리 제대로 안되던 현상 해결, 대표이미지 반환 추가

* feat: 그룹 상세 조회 응답 컬럼명 변경

* feat: memberLimit 컬럼 삭제

* feat: 선결제 시 기존 결제 내역과 멱등성 문제 해결

* fix: 팀 상세 조회 시 이미지 쿼리가 의미 없이 join 되던 쿼리 수정

* feat: 가게 검색 기능 대폭 수정

* feat: 프론트 요구사 반영

* feat: searchcondition 삭제

* feat: 팀타입 desription 리턴 하도록 수정

* feat: 카테고리별 팀 조회 시 팀 생성일 컬럼 추가

* feat: 매장찾기_상세 페이지 조회 기능 구현

* feat: 비밀 코드 조회 기능 엔드 포인트 수정

* fix: conflict fix

* hotfix: 서버 복구

* hotfix: 서버 복구2

* feat: Barobill api 연동

* fix: 홈 화면에 같은 데이터가 중복되는 현상 수정

* infra: ElastiCache 연결을 위한 docker-compose 설정

* infra: cicd script 수정

* infra: cicd script ec2 주소 설정

* infra: cicd script 수정2

* infra: cicd script 수정3

* infra: cicd script 수정4

* infra: cicd script 수정5

* infra: cicd script 수정6

* infra: cicd script 수정7

* infra: cicd script 수정7

* infra: cicd script 수정8

* infra: cicd script 수정9

* infra: cicd script 수정10

* infra: cicd script 수정11

* infra: cicd script 수정12

* infra: cicd script 수정13

* infra: cicd script 수정14

* infra: cicd script 수정15

* infra: cicd script 수정16

* infra: cicd script 수정17

* infra: cicd script 수정18

* infra: cicd script 수정19

* infra: cicd script 수정20

* infra: cicd script 수정21

* infra: cicd script 수정22

* fix: 보유금액이 선결제 금액보다 작을 경우 상태값 변경(200->400)

* feat: 홈화면 가게 별 선결제 디데이 추가, 쿼리문 조정

* feat: 주문하기 로직 정상화

* feat: 장바구니에 다른 가게 물건이 있는지 검증 구현

* feat: 장바구니 비우기 기능 구현

* deploy: cd retry

* feat: 매장 상세 페이지 조회 메뉴 정렬 조건 추가

* feat: 세금명세서 역발행 기능 추가

* feat: 거래 타입명 변경

* feat: pointTransaction 금액 음수(-) 표시 추가

* feat: 세금계산서 역발행 요청 기능 구현

* feat: 팀 조회 시 진행 상태값 반환 추가

* feat: 그룹 상세 조회 path storeId 추가

* feat: 그룹 조회 시 팀 id 조회 추가

* feat: 그룹 상세 조회에서 개별 매장 상세 조회 기능 구현

* feat: 매장 상세 조회 시 menuId 값 반환 추가

* feat: cart 조회 시 menuId, menuImg 반환 추가

* feat: 장바구니 조회 시 가게 id, name, catrogry 반환 추가

* feat: storeCategory 이름 한글 표기로 수정

* feat: 바로빌 세금 계산서 역발행 api 채번 현재 시간 기준으로 수정

* chore: 세금계산서 수신 이메일 수정

* feat: 그룹 상세 조회 리턴 값 추가

* feat: 팀 상세 조회 쿼리 수정

* feat: 요구사항 반영

* feat: 카테고리값 반환 한글로 수정

* feat: 요구사항 반영

* feat: 그룹 상세 조회 시 결제 내역에 사용자 이름 반환 추가

* feat: 오늘의 주문 생성 순으로 정렬

* feat: 개별 매장 상세 조회 쿼리문 수정

* feat: 주문, 담기 시 낙관적 락 동시성 처리

* feat: 요구사항 반영
  • Loading branch information
LEEJaeHyeok97 authored Dec 7, 2024
1 parent a2220a7 commit 76b982c
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.jangburich.domain.point.domain.PointTransaction;
import com.jangburich.domain.point.domain.TransactionType;
import com.jangburich.domain.point.domain.repository.PointTransactionRepository;
import jakarta.persistence.OptimisticLockException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -71,7 +72,11 @@ public Message addCart(String userProviderId, AddCartRequest addCartRequest) {

if (optionalCart.isPresent()) {
Cart existingCart = optionalCart.get();
existingCart.updateQuantity(existingCart.getQuantity() + addCartRequest.quantity());
try {
existingCart.updateQuantity(existingCart.getQuantity() + addCartRequest.quantity());
} catch (OptimisticLockException e) {
throw new IllegalStateException("중복 요청입니다. 이전 요청이 처리 중입니다.");
}

return Message.builder()
.message("장바구니에 상품을 추가했습니다.")
Expand Down Expand Up @@ -240,7 +245,11 @@ private Orders saveOrder(User user, Store store, Team team, OrderRequest orderRe
.team(team)
.orderStatus(OrderStatus.RECEIVED)
.build();
return ordersRepository.save(orders);
try {
return ordersRepository.save(orders);
} catch (OptimisticLockException e) {
throw new IllegalStateException("중복 요청입니다. 이전 요청이 처리 중입니다.");
}
}

@Transactional
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/jangburich/domain/order/domain/Cart.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Version;
import java.util.List;
import lombok.AccessLevel;
import lombok.Builder;
Expand Down Expand Up @@ -48,6 +49,9 @@ public class Cart extends BaseEntity {
@JoinColumn(name = "store_id")
private Store store;

@Version
private Long version;


@Builder
public Cart(Integer quantity, Orders orders, Menu menu, User user, Store store) {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/jangburich/domain/order/domain/Orders.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Version;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -45,6 +46,9 @@ public class Orders extends BaseEntity {
@Column(name = "order_status")
private OrderStatus orderStatus;

@Version
private Long version;


@Builder
public Orders(Store store, User user, Team team, OrderStatus orderStatus) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,10 @@ public IndividualStoreDetailsResponse findIndividualStoreDetails(Long userId, Lo
Expressions.nullExpression(),
Expressions.nullExpression(),
Expressions.nullExpression(),
pointTransaction.transactionedPoint.sum(),
team.point,
// pointTransaction.transactionedPoint.sum(),
Expressions.constant(660000),
// team.point,
Expressions.constant(615600),
storeTeam.personalAllocatedPoint,
Expressions.stringTemplate(
"DATE_FORMAT({0}, '%y.%m.%d')", oneMonthAgo
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/com/jangburich/global/error/ApiControllerAdvice.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.jangburich.global.payload.ApiResponse;
import com.jangburich.global.payload.ErrorCode;
import com.jangburich.global.payload.ErrorResponse;
import jakarta.persistence.OptimisticLockException;
import javax.security.sasl.AuthenticationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand All @@ -15,6 +16,18 @@
@RestControllerAdvice(annotations = RestController.class)
public class ApiControllerAdvice {

@ExceptionHandler(OptimisticLockException.class)
public ResponseEntity<ApiResponse> handleOptimisticLockException(OptimisticLockException e) {
final ErrorResponse response = ErrorResponse
.builder()
.status(HttpStatus.CONFLICT.value())
.code("OPTIMISTIC_LOCK")
.message("동시 처리 중 충돌이 발생했습니다. 다시 시도해주세요.")
.build();
ApiResponse apiResponse = ApiResponse.builder().check(false).information(response).build();
return new ResponseEntity<>(apiResponse, HttpStatus.CONFLICT);
}

@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
protected ResponseEntity<?> handleHttpRequestMethodNotSupportedException(
HttpRequestMethodNotSupportedException e) {
Expand Down

0 comments on commit 76b982c

Please sign in to comment.