Загружаем каталог…
Загружаем каталог…
계속 추가되어 수정 될 예정입니다. 결제 승인 시각이 9시간 어긋난 문제 현재 결제는 토스페이먼츠 API를 사용하고 있습니다. 토스페이먼츠에서 결제 승인 결과를 전달받을 때 승인 시각도 함께 전달되는데, 이 값을 저장하는 과정에서 9시간의 시차가 발생하는 문제가 있었습니다. 문제 및 원인 토스는 승인 시각을 +09:00 오프셋과 함께 전달합니다. ( 14:38:18+09:00 ) 이를 OffsetDateTime 으로 역직렬화하면 동일한 순간을 UTC 기준으로 표현한 05:38:18Z 로 표현될 수 있습니다. 문제는 DB에 LocalDateTime 으로 저장하기 위해 toLocalDateTime() 을 사용하면서 발생했습니다. toLocalDateTime() 은 시간대를 변환하지 않고 오프셋만 제거하기 때문에, 05:38:18Z 가 05:38:18 로 변환되어 실제 승인 시각보다 9시간 이른 값이 저장되었습니다. 해결 오프셋을 단순히 제거하는 대신, 해당 시각이 나타내는 동일한 순간을 서버의 시간대 기준 LocalDateTime 으로 변환하도록 수정했습니다. LocalDateTime.ofInstant( approvedAt.toInstant(), ZoneId.systemDefault() ) 이렇게 하면 14:38:18+09:00 을 단순히 14:38:18 로 자르는 것이 아니라, 해당 시각이 나타내는 순간을 서버 시간대에 맞춰 변환한 후 저장할 수 있습니다. 재고 차감 시의 문제 상품의 변경은 크게 상품 정보 변경과 재고 변경으로 나누었습니다. 상품명, 브랜드, 가격과 같은 상품 정보는 일반적인 엔티티 변경 감지를 통해 수정하고, 재고는 빈번하게 변경되며 동시성 제어가 필요하기 때문에 별도의 UPDATE 쿼리로 분리했습니다. UPDATE product SET stock_quantity = stock_quantity - :quantity WHERE id = :productId AND stock_quantity >= :quantity 이렇게 하면 애플리케이션에서 재고를 조회한 후 차감한 값을 다시 저장하지 않고, DB의 현재 재고를 기준으로 재고 확인과 차감을 하나의 UPDATE에서 처리할 수 있습니다. 이를 통해 재고가 동시에 변경되더라도 재고 부족 여부와 차감을 원자적으로 처리할 수 있습니다. 문제 발생 하지만, 상품 정보를 엔티티의 변경 감지로 수정하는 과정에서 재고 변경이 동시에 발생하면 최신 재고 값이 덮어써지는 문제가 발생했습니다. 이는 Hibernate가 UPDATE를 수행할 때 모든 컬럼을 포함하는 기본 정책 때문입니다. The default UPDATE statement containing all columns 따라서, 상품 정보를 변경하기 위해 조회한 시점의 stockQuantity 도 UPDATE에 포함되고, 이 사이에 다른 트랜잭션이 재고를 변경하면 이전에 조회한 구버전 재고 값으로 다시 덮어쓸 수 있습니다. 해결 이를 해결하는 방법으로 두 가지를 고려했습니다. @DynamicUpdate 사용 변경된 필드만 UPDATE하도록 하여, 상품 정보만 변경할 경우 stockQuantity 를 UPDATE 대상에서 제외합니다. @Column(updatable = false) 사용 엔티티 변경 감지를 통한 UPDATE에서 stockQuantity 를 제외합니다. @DynamicUpdate 도 문제를 해결할 수 있지만, 현재는 재고를 동시성 제어가 가능한 별도의 UPDATE 쿼리로만 변경하도록 분리했기 때문에 @Column(updatable = false) 를 선택했습니다. 이를 통해 상품 정보 변경으로는 재고가 수정되지 않도록 하고, 재고는 별도의 조건부 UPDATE를 통해서만 변경되도록 했습니다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
E-commerce MSA 프로젝트 개발기 - 트러블 슈팅 모음. 계속 추가되어 수정 될 예정입니다. 결제 승인 시각이 9시간 어긋난 문제 현재 결제는 토스페이먼츠 API를 사용하고 있습니다. 토스페이먼츠에서 결제 승인 결과를 전달받을 때 승인 시각도 함께 전달되는데, 이 값을 저장하는 과정에서 9시간의 시차가 발생하는 문제가 있었습니다. 문제 및 원인 토스는 승인 시각을 +09:00 오프셋과 함께 전달합니다. ( 14:38:18+09:00 ) 이를 OffsetDateTime 으로 역직렬화하면 동일한 순간을 UTC 기준으로 표현한 05:38:18Z 로 표현될 수 있습니다. 문제는 DB에 LocalDateTime 으로 저장하기 위해 toLocalDateTime() 을 사용하면서 발생했습니다.…