Spring은 의존성 주입과 AOP와 같은 기능을 통해 더 많은 의존성을 제공하고 설정과 구성이 상대적으로 간단하기에 사용했습니다.
Spring vs Micronaut
Micronaut는 클라우드 네이티브 애플리케이션 개발에 특화되어 있으며 Spring보다 빠르게 시작되고 더 낮은 메모리 사용을 제공하나, spring은 더 많은 기능과 확장성을 제공하며 더 큰 커뮤니티를 갖고 있습니다.
Spring 프레임워크는 다양한 기능, 강력한 의존성 관리, AOP, 풍부한 데이터 액세스 지원, 활발한 커뮤니티와 같은 장점을 가지고 있습니다.
다른 프레임워크들은 특정 분야에서 뛰어날 수 있지만, Spring은 전체적으로 균형 잡힌 기능과 유연성을 제공
하는 것이 특징입니다
무엇보다 팀원 모두가 Spring Boot에 경험이 있고 이를 선호하기에 사용했습니다.
spring-boot-starter-web
을 사용하면 Spring MVC와 Tomcat을 포함한 웹 개발에 필요한 모든 종속성을 한 번에 추가할 수 있습니다.GitHub Actions
GitHub 리포지토리와 밀접하게 통합되어 이벤트 기반 워크플로우를 쉽게 설정할 수 있고, 코드와 CI/CD를 한 곳에서 관리할 수 있어 별도의 도구로 전환할 필요가 없기에 선택하였습니다.
Elasticsearch
Elasticsearch의 정의/도입이유는?
Elasticsearch는 실시간 검색 및 분석을 위한 오픈 소스 분산 검색 엔진입니다.
기존 검색 개선을 위해서 코드의 복잡도가 증가하는 문제를 Elasticsearch 기술 도입으로 높은 성능과 인덱싱 자동화 구축이 가능했습니다.
MySQL의 fulltext index가 아닌 Elasticsearch를 사용한 이유는?
Elasticsearch의 응답속도가 MySQL full-text index에 비해 안정적으로 측정되었으며, Elasticsearch는 튜닝을 통한 성능 개선 고점도 높아 선택하였습니다. 또한 Logstash, Kibana 를 통해 파이프라인을 구축하여 데이터 동기화, 데이터 분석 등 부가 기능들을 쉽게 활용 할 수 있습니다.
logstash를 통해 MySQL에서 Elasticsearch로 데이터를 가져오는 것으로 보이는데, 변경된 데이터를 실시간으로 가져올 수 있는가?
현재 logstash가 1초에 한번 MySql의 DB변경사항을 업데이트하도록 설정되어 있으나, 성능상 문제로 약 7초에 한번 업데이트되고 있습니다. 추후 다른 개선안으로 Kafka를 통한 실시간 연동을 찾아볼 예정입니다.
MySQL
대량 데이터 처리와 유연성이 높아 데이터 조작과 검색이 용이합니다. 높은 안정성 때문에 다른 데이터베이스 옵션 대신 선택했습니다.
Kafka
Kafka의 정의는?
Kafka는 분산형 스트리밍 플랫폼으로, 대규모 데이터를 안정적으로 처리하는데 사용됩니다. 카프카는 서버와 서버 사이를 중개하는 메시지 큐 역할을 합니다.
Kafka와 같이 실행되는 zookeeper에 대해 알고 있는가?
Zookeeper은 Kafka 브로커들의 상태 관리, 클러스터 메타데이터 저장, 클러스터 내 노드 간 동기화 유지, 파티션의 리더 선출 및 재선출, 시스템의 고가용성 보장, 그리고 트랜잭션 상태 관리 등의 역활을 합니다.
이를 통해 Kafka 클러스터는 안정적이고 효율적으로 운영됩니다
Kafka를 통해 Producer로 응답을 다시 받는 구조는 일반적이지 않아(비효율적으로?) 보이는데 그렇게 한 이유는?
서버 부하를 줄이려는 관점에서 Kafka를 도입하여 책나눔 기능을 다른 서버로 분리하였으나, 성공여부를 응답으로 받아야 하는 책나눔 서비스에는 Kafka를 사용하는 것이 적합하지 않음을 프로젝트 후반부에 알게 되었습니다. 문제를 인지하고 있으나 수정은 하지 못한 상태입니다.(??)
Kafka 말고 다른 메시징 시스템은 고려해보았는가?
RabbitMQ, ActiveMQ등 다른 메시지 시스템도 있으나, 대규모 데이터 처리에 있어 가장 유리한 Kafka를 선택하였습니다.
Redis
DB락을 써도 동시성이 해결될 것으로 보이는데 굳이 Redis 분산락을 사용한 이유는?
저희 프로젝트에서는 DB락을 사용해도 문제가 없으나, 추후 분산 DB로의 확장까지 고려하여 Redis분산락을 사용하기로 결정하였습니다.
Redis 말고 다른 분산락 방법들도 있는데 고려해보았나?
zookeeper로도 분산락을 걸 수 있는데 in-memory 방식인 Redis가 속도가 더 빨라 적합하다 생각하였습니다.
AWS 인프라