
백엔드
MongoDB와 Transaction
두줄요약
Spring Boot와 MongoDB에서 `@Transactional` 사용 시 단일 인스턴스에서는 트랜잭션 오류가 발생했습니다. 레플리카 셋을 구성하고 primary에 연결해야 정상적으로 롤백과 커밋을 처리할 수 있었습니다.
문제 상황
- Spring Boot와 MongoDB에서
@Transactional적용 시Transaction numbers are only allowed on a replica set member or mongos오류 발생 - 단일 MongoDB 인스턴스가 아니라 레플리카 셋 또는 샤드 클러스터 환경이 필요한 제약 확인
원인 분석
- MongoDB 트랜잭션이 논리적 세션과 oplog 기반 동기화에 의존
- 트랜잭션과 롤백을 위해 복제 구조와 일관성 유지 메커니즘 필요
- 단일 서버 구성에서는 트랜잭션 번호 사용 자체가 제한
해결 방법
- Docker로 MongoDB 레플리카 셋 3노드 구성
- keyfile,
rs.initiate(),rs.add()로 복제 집합 초기화 - Spring Boot에서 primary에 연결하고
MongoTransactionManager등록
성능/운영 포인트
- 작은 규모는 레플리카 셋, 대규모·고성능은 샤드 클러스터 선택 경향
- primary 장애 시 선거로 secondary가 승격되는 구조
- rollback 가능성에 대비한 WriteConcern 조정 필요
