본문 바로가기
개발/Spring

[Spring data mongodb] 몽고DB에서 시퀀스를 이용하기

by 상용최 2021. 4. 29.
반응형

Sequence로 이용할 Document를 하나 정의한다.

@Document
class DatabaseSequence(
  @field:Id var id: String,
  var seq: Long
) {
}

Sequence를 생성하는 Creator를 정의한다.

@Component
class SequenceCreator(
    private var mongoTemplate: MongoTemplate
) {

    fun create(sequenceName: String): Long {
        val counter: DatabaseSequence = mongoTemplate.findAndModify(
            query(where("_id").`is`(sequenceName)),
            Update().inc("seq", 1), options().returnNew(true).upsert(true),
            DatabaseSequence::class.java
        )

        return counter.seq
    }
}

사용 예

@RestController
class PostController(
        private val postService: PostService
        , private val sequenceCreator: SequenceCreator
) {

    @PostMapping("/task")
    fun createTask(@RequestBody @Valid taskRequest:TaskRequest): PostCreatedResponse {
        val taskNumber = sequenceCreator.create("taskSeq")
        val task = taskRequest.convertToPostEntity(taskNumber)
        val postId = postService.create(task).toString()

        return PostCreatedResponse(postId, taskNumber)
    }
}

생성하고자 하는 시퀀스의 이름을 넘겨서 시퀀스를 받아온다.

반응형

댓글