기술 선택 이유

dasd412·2023년 12월 30일
0

cotella

목록 보기
5/9

데이터베이스 선택하기

RDBMS vs NoSQL vs VectorDB

선택지로는 RDBMS, Vector DB, NoSQL이 있겠습니다.

DB가 사용되는 기능은 다음과 같습니다. CRUD의 약자로 표기합니다.
1. 사용자 OAuth 인증 (C,R)
2. 면접 질문 데이터 생성/갱신/삭제 (C,U,D)
3. 면접 질문 출제 시에 조회 (R)
4. 사용자 답변 작성 (C)
5. LLM 연관 질문 생성 (C,R)
6. 인성 면접 답변 첨삭 (C,R)

유사도 기반 검색과 최신 정보가 필요 없으므로 Vector DB는 아닙니다.

그럼 이제 RDBMS와 NoSQL에 대해 비교해봐야겠습니다.

먼저, 필요한 데이터들은 전부 문자열입니다. 딱히 비정형 데이터가 필요 없습니다.

특히, 사용자 인증이나 면접 데이터 저장에서는 엄격한 트랜잭션 처리가 필요합니다.

또한 사용해본 MySQL과 MongoDB를 비교했을 때,
MySQL 경험이 더 많고 친숙합니다.

따라서 전반적으로는 RDBMS가 더 나은 선택이라고 판단했습니다.

단, 혹시나 대규모 분산 트래픽이 생길 경우엔 (ㅎㅎ?) NoSQL 도입도 고려해봐야 할 것 같습니다.

왜냐하면 NoSQL이 RDBMS보다 Scale-out에 있어서 더 편리하다고 알고 있기 때문입니다.

결론

  1. 처음에는 MySQL 선택!
  2. 대용량 트래픽으로 고도화가 필요한 경우에 NoSQL도 도입 검토

엔진 선택 (InnoDB, MyISAM)

MySQL에서는 테이블마다 다른 스토리지 엔진을 사용할 수 있습니다.

사용자와 직접적으로 관련된 테이블인 user, answer 등은 트랜잭션과 무결성이 중요하기 때문에 InnoDB를 사용합니다. 읽기보다 갱신, 생성등이 많은 테이블도 InnoDB를 사용하려 합니다.

MyISAM은 갱신 작업이 느린 대신, 조회 속도가 빠르고 트랜잭션을 제공하지 않는 특징을 갖고 있습니다.
그래서 회사 정보, 면접 주제, 면접 질문 등 조회만 일어나는 테이블은 MyISAM 엔진을 활용합니다.

참고 자료

https://velog.io/@yangsijun528/MySQL-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%97%94%EC%A7%84


Java 17과 Maven 선택

이 프로젝트는 LLM을 Spring과 같이 사용해야 합니다.

대표적인 두 가지 LLM - Java 오픈 소스를 조사해보았습니다.
1. openai java (https://github.com/TheoKanning/openai-java)
2. langchain java (https://github.com/HamaWhiteGG/langchain-java)

이 중에서 langchain java는 자바 17이상, 메이븐 3.8.6 버전을 추천합니다.

초기 단계에서는 openai java로만 LLM 호출을 해도 충분하지만, 혹시나 벡터 db나 LLM agent 같은 도구가 필요하면 langchain을 사용하는게 편리할 것 같습니다. 혹시 langchain java가 필요할 수도 있을 것 같아 자바 17과 메이븐을 선택하기로 했습니다.

JPA vs MyBatis

JPA를 사용하기로 결정했습니다.
첫 번째 이유는 친숙함입니다. 둘 다 사용해본 적 있지만, JPA 사용 경험이 더 많습니다.

두 번째는 테스트 작성이 편리하기 때문입니다. JPA는 테이블을 자동으로 만들어주는데, H2와 같이 활용하면 @DataJpaTest 어노테이션을 활용해 테스트하기 편리합니다.

마지막으로 JPA는 기본 CRUD와 페이징 등 기본적으로 제공해주는 게 많아 비즈니스 로직에 더 집중할 수 있게 됩니다.

참고 자료

https://mangkyu.tistory.com/20

https://velog.io/@gkskaks1004/JPA%EC%99%80-MyBatis%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4%EC%84%9C-%EC%9E%A5%EB%8B%A8%EC%A0%90


Redis vs Memcached

먼저 인메모리 DB를 선택한 이유입니다.

  1. LLM 서비스이기 때문에 TPM/RPM을 관리해야 합니다. 소마 프로젝트에서도 한꺼번에 110명이 들어와서 그 당시에 서버 토큰이 부족해졌던 사례가 있었습니다. 따라서 실시간 토큰 상황을 추적하기 위해 인메모리 DB를 사용합니다.

  2. DDOS 공격 예방을 위해서입니다. 오라클 클라우드 프리티어라 클라우드 쪽은 어느 정도 안심입니다만, 문제는 LLM 요청입니다. 악의적으로 LLM 요청을 많이 하면, 그만큼 API 비용이 발생합니다.

  3. 사용자 답변 저장 로직에서 성능 개선의 요소가 보입니다. 매번 사용자 답변을 생성할 때마다 질문과 회차와 연관 관계를 맺습니다. 이 두 요소를 계속 디스크에서 조회하는 것보단, 메모리에서 조회하는게 더 빠르지 않을까 싶었습니다.

결론적으로 Redis를 활용하기로 했습니다.

조사 결과 Redis는 디스크에 데이터를 기록하므로 메모리가 날라가도 데이터를 복구할 수 있으며, 지원되는 데이터 타입이 더 다양하다고 합니다. (단, 메모리를 더 많이 사용한다는 단점이 있습니다.)

참고 자료

https://americanopeople.tistory.com/148


AWS vs Oracle Cloud

비용 이유로 오라클 클라우드를 선택했습니다.
AWS는 프리티어가 만료되었으며, 오라클 클라우드는 프리티어를 갖고 있습니다. 또한 현재 기준으로 오라클 클라우드는 프리티어 기간이 평생입니다.


GitHub Actions vs Jenkins

GitHub Actions를 선택했습니다.

젠킨스는 젠킨스용 서버가 따로 필요한데, 오라클 클라우드 프리티어를 활용해야 하는 상황에서는 애매합니다.

또한 제 프로젝트는 소규모 프로젝트이기 때문에, 설정과 관리가 더 용이한 GitHub Actions가 더 낫다고 생각했습니다.


Jacoco vs sona cloud

Jacoco만 사용하기로 결정했습니다.
CI 할 때 코드 커버리지만 측정하고, 포괄적인 코드 품질 분석은 GitHub Copilot, GPTs 등 요새 인기가 높아지는 AI를 활용하기로 했습니다.


profile
시스템 아키텍쳐 설계에 관심이 많은 백엔드 개발자입니다. (Go/Python/MSA/graphql/Spring)

0개의 댓글