선착순 퀴즈 프로젝트에 MongoDB 적용기

개발하는 구황작물·2024년 3월 18일
0

최근 개인 프로젝트로 선착순 퀴즈 프로젝트에 MongoDB를 사용하게 되었다.

그래서 시작하는 MongoDB 적용기.

MongoDB란

간단하게 설명하자면 BSON(JSON의 이진 형식) 형식으로 데이터를 저장하는 NoSQL 이다.

스키마로 데이터 유형을 표준화 하는 RDBMS와 달리 MongoDB는 유연한 스키마로 비정형 데이터를 저장하는데 사용된다.

MongoDB를 사용하게 된 이유

처음에는 사용자가 퀴즈에 답변을 제출하다 오류가 나면 롤백을 해야 한다는 생각에 Mysql만을 사용하기로 하였다.

그러나 퀴즈의 유형에는 단답형/객관식/서술형/True-False 등등 여러 유형의 문제가 있는데 이를 RDBMS에 저장하기에는 제약이 있어 MongoDB를 사용하기로 결정하였다.

SpringBoot에 MongoDB 설정

  1. dependency
dependencies {
	implementation "org.springframework.boot:spring-boot-starter-data-mongodb"

}
  1. application.yml
spring:
  data:
    mongodb:
      url: mongodb://admin:password@localhost:27018?authSource=admin
      host: localhost
      port: 27018
      database: dbname
      username: admin
      password: password
      replica-set: rs0 //transaction 을 사용했기 때문에 추가
      authentication-database: admin
  1. MongoDBConfig
@Slf4j
@Configuration
@EnableMongoRepositories(
        basePackages = {"com.quiz.domain.*.mongo"}) // (1) MongoDB만 사용한다면 basePackages를 명시하지 않아도 된다.
@EnableTransactionManagement // (2) MongoDB 트랜잭션
public class MongoDBConfig extends AbstractMongoClientConfiguration {
    @Value("${spring.data.mongodb.url}")
    private String connectionString;

    @Value("${spring.data.mongodb.database}")
    private String databaseName;

    @Bean // (3) 컨테이너에 트랜잭션을 직접 등록시켜줘야 함
    public MongoTransactionManager transactionManager(MongoDatabaseFactory mongoDatabaseFactory) {
        return new MongoTransactionManager(mongoDatabaseFactory);
    }

    @Override
    public MongoClient mongoClient() {
        String url = this.connectionString;
        ConnectionString connectionString = new ConnectionString(this.connectionString);
        MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
                .applyToConnectionPoolSettings(builder -> builder.maxConnectionIdleTime(10, TimeUnit.SECONDS)) //최대 유휴 시간
                .applyConnectionString(connectionString)
                .build();

        return MongoClients.create(mongoClientSettings);
    }

    @Override
    protected String getDatabaseName() {
        return databaseName;
    }


    @Bean //MongoTemplate 설정
    public MongoOperations mongoTemplate() {
        return new MongoTemplate(mongoClient(), databaseName);
    }
}
  • (1) : basePackages를 명시한 이유는 현재 프로젝트에서 Mysql도 같이 사용하고 있어 MongoDB 를 사용하고 있는 Repository를 명시해주어야 했기 때문이다. MongoDB만 사용 중이라면 basePackages를 명시하지 않아도 된다.
  • (2), (3) : MongoDB 트랜잭션을 사용하기 위해 추가하였다.

MongoDB는 버전 4.0 부터 트랜잭션 적용이 가능해졌다.

SpringBoot는 자동으로 등록된 라이브러리를 보고 해당하는 트랜잭션(JDBCTransactionManager, JPATransactionManager...)을 컨테이너에 자동으로 등록해준다.

그러나 MongoDB는 트랜잭션이 선택이라 우리가 직접적으로 등록해주어야 한다.

또한 트랜잭션을 사용하려면 추가적으로 MongoDB에 Replica set를 설정해주어야 한다. (점점 일이 커진다)

(설정 방법은 추후에 포스팅하겠다.)

  1. QuestionMongoTemplate
@RequiredArgsConstructor
@Component
public class QuestionsMongoTemplate {

    private final MongoTemplate mongoTemplate;

	...

}

MongoTemplate는 세밀한 쿼리문을 작성할 때 사용하면 편하다.

  1. MongoRepository
public interface QuestionsRepository extends MongoRepository<Questions, String> {
	...
}

MongoRepository는 단순한 CRUD 사용시 편리하게 사용시 적합하다.

profile
어쩌다보니 개발하게 된 구황작물

0개의 댓글