Skip to content

Commit 6e0d280

Browse files
author
EpicFn
committed
feat : 데이터 순서 보장을 위해 version 추가
1 parent befdbd8 commit 6e0d280

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

src/main/java/org/tuna/zoopzoop/backend/domain/dashboard/entity/Graph.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import jakarta.persistence.CascadeType;
44
import jakarta.persistence.Entity;
55
import jakarta.persistence.OneToMany;
6+
import jakarta.persistence.Version;
67
import lombok.Getter;
78
import lombok.Setter;
89
import org.tuna.zoopzoop.backend.global.jpa.entity.BaseEntity;
@@ -14,6 +15,10 @@
1415
@Setter
1516
@Entity
1617
public class Graph extends BaseEntity {
18+
19+
@Version
20+
private Long version;
21+
1722
@OneToMany(mappedBy = "graph", cascade = CascadeType.ALL, orphanRemoval = true)
1823
private List<Node> nodes = new ArrayList<>();
1924

src/main/java/org/tuna/zoopzoop/backend/domain/dashboard/extraComponent/GraphUpdateConsumer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.RequiredArgsConstructor;
55
import lombok.extern.slf4j.Slf4j;
66
import org.springframework.amqp.rabbit.annotation.RabbitListener;
7+
import org.springframework.orm.ObjectOptimisticLockingFailureException;
78
import org.springframework.stereotype.Component;
89
import org.tuna.zoopzoop.backend.domain.dashboard.dto.BodyForReactFlow;
910
import org.tuna.zoopzoop.backend.domain.dashboard.dto.GraphUpdateMessage;
@@ -23,6 +24,12 @@ public void handleGraphUpdate(GraphUpdateMessage message) {
2324
BodyForReactFlow dto = objectMapper.readValue(message.requestBody(), BodyForReactFlow.class);
2425
dashboardService.updateGraph(message.dashboardId(), dto);
2526
log.info("Successfully updated graph for dashboardId: {}", message.dashboardId());
27+
} catch (ObjectOptimisticLockingFailureException e) {
28+
// Optimistic Lock 충돌 발생!
29+
// 내가 처리하려던 메시지는 이미 구버전 데이터에 대한 요청이었음.
30+
// 따라서 이 메시지는 무시하고 정상 처리된 것으로 간주.
31+
log.warn("Stale update attempt for dashboardId: {}. A newer version already exists. Discarding message.", message.dashboardId());
32+
// 예외를 다시 던지지 않으므로, 메시지는 큐에서 정상적으로 제거(ACK)됩니다.
2633
} catch (Exception e) {
2734
// 실제 운영에서는 메시지를 재시도하거나, 실패 큐(Dead Letter Queue)로 보내는 등의
2835
// 정교한 에러 처리 로직이 필요합니다.

0 commit comments

Comments
 (0)