com.mongodb.MongoCommandException: Command failed with error 20 (IllegalOperation): 'Transaction numbers are only allowed on a replica set member or mongos' on server 127.0.0.1:27017. The full response is {"ok": 0.0, "errmsg": "Transaction numbers are only allowed on a replica set member or mongos", "code": 20, "codeName": "IllegalOperation"}
spring boot 와 mongodb를 사용하고 있는데 @Transactional
어노테이션을 쓰니 위와같은 에러가 발생한다.
에러에서 확인할 수 있듯, replica set
에서만 동작이 가능하다는 의미다.
디버그 모드로 로그를 찍고, 서버 연결시 수초마다 한번씩 다음과 같이 로그가 찍히는데 type=STANDALONE
이라는 로그를 확인할 수 있다.
2025-05-29T17:18:31.092+09:00 DEBUG 46252 --- [127.0.0.1:27017] org.mongodb.driver.cluster : Updating cluster description to {type=STANDALONE, servers=[{address=127.0.0.1:27017, type=STANDALONE, roundTripTime=13.6 ms, state=CONNECTED}]
2025-05-29T17:18:31.093+09:00 DEBUG 46252 --- [127.0.0.1:27017] org.mongodb.driver.cluster : Checking status of 127.0.0.1:27017
해당 타입을 replica set
으로 동작하도록 변경해보자!
일단 나는 MongoDB를 homebrew
으로 설치했었었다.
그리고 설정파일은 /opt/homebrew/etc/mongod.conf
경로에 있었다.
설정파일 하위에 다음과 같이 레플리카 설정을 추가하자.
replication:
replSetName: rs0
그리고 mongodb를 재시작 해주자.
리스트를 확인하고 mongodb 에 해당하는 서비스를 재시작
brew services list
brew services restart mongodb-communitiy
그리고 다시 로그 확인해봤는데 뭔가 이상하다.
type=REPLICA_SET
이 되긴 했는데, 내부 설정이 TYPE=REPLICA_SET_GHOST
라고 되어있고 여전히 동작하지 않는다.
찾아보니 최초에 한번 초기화작업을 해줘야한다고 한다.
mongosh 접속해서 설정해주자.
// mongosh 접속 (없으면 설치)
mongosh
// 상태값 확인
rs.status()
// 초기화
rs.initiate()
이제 헐레벌떡 로그확인 하러 가자
성공~