[SQL/캡스톤디자인] 데이터베이스 과제 3주차
데이터베이스3주차
3주차에선 두 DB간 데이터 일관성 유지 및 동기화 방식에 대해 연구했다. 두 개의 DB를 병행하면 한쪽에 데이터 변경이 발생했을 때, 다른 한쪽과 “데이터 불일치” 가 생길 수 있다. 사용자 가입 시 MySQL에 사용자 레코드는 생성이 완료 되었지만, MongoDB에 로그 삽입이 실패하면 처리의 관한 문제가 생길 수 있습니다.관계형db와 nosqldb를 두 개를 동시에 다룰 때 부분 실패 상황을 고려해야 한다. MySQL과 Mongodb는 서로의 db를 공유하지 않기 때문에 한쪽 작업 성공 이후 다른 한쪽이 실패해도 자동으로 롤백되진 않는다. 이러한 부분 오류가 누적되면 데이터 적합성 관리가 상당히 곤란할 수 있으므로, 미리 대책을 찾아놔야 한다. 우선, 어떤 데이터를 어느 DB에서 MAINDB으로 다룰지 명확히 명시해야한다. 예를들면 userid는 MySQL에 MAINDB로 설계해두고, mongodb에서는 참조용으로만 사용하던지, 전혀 저장하지 않는식이라던지, 이렇게 한다면 db의 데이터 변경이 발생했을 때 다른 db의 오류를 최소화 할 수 있다.만약 한 이벤트에 두 DB 모두 변경이 필요한 경우 동기화기법을 고려해야 한다. 중요한 작업을 주DB에서 수행하고 커밋후, 부가 작업은 별도로 수행한다.를 들어 회원 가입 API에서 트랜잭션으로 MySQL에 사용자 정보를 저장한 뒤, 성공하면 MongoDB에 “가입” 이벤트 로그를 기록한다. 만약 mongodb에서 기록이 실패하더라도, MYSQL의 연결엔 영향이 없으므로, 사용자 가입은 완료시키고, 로그에 실패 예외처리로 하거나 재시도하도록 처리를 할 수 있다. 메인기능과 로그/피드백 기능을 느슨하게 연결하는 loosecoupling 기법인것인데, 이렇게 되면 일관성을 보장 할 수 있다. 이벤트 메이징 큐 활용 기법이라고 해서, 일관된 동기화를 위해 이벤트 기반 비동기 처리를 도입할 수 있다. 예를들자면, kafka나 rabbitMQ같은 메이지 큐를 사용해, 애플리케이션이 중요한 이벤트를 발생시킬때마다 메시지에 큐를 발행합니다. 별도 리스너 서비스를 두 개 운영하여, 하나는 Mysql에 관련 db를 저장하고 다른 db에는 로그/분석데이터를 저장하도록 합니다. 이러면 본체는 비동기로 두 작업을 분리하고, 궁극적으로 일관성이 보장되게 됩니다. 메이징 방식은 한쪽 db가 실패하더라도 db가 남아있어 재처리 시도가 가능하고, 두db간 직접적인 락이나, 공유없이 데이터 일관성을 유지할수 있다. 다만, 구현이 복잡하여 연구가 필요해 보인다. 실무적으로는 이벤트 메시징 큐 활용기법이 많이 활용된다고 알려져있는데, 구현의 난이도가 높기에, 많은 연구가 필요할것으로 보이며, 프론트앤드와 백앤드가 완성된다면 연동으로 많은 테스트를 해봐야 할것으로 보인다. 핵심 데이터 저장과 로그/피드백 저장을 완전히 분리하여, 레벨에서 처리 순서를 조율하는것이고, mysql에서는 본 업무 데이터만 저장시킨 후, mongodb의 작업은 큐를 통해 비동기로 처리시키거나, 실패한다면 리트라이 로직으로 두는 것이 일방적으로 보인다. 일일관성은 유지되지만, 로그/피드백 시스템 구상상 약간의 지연이나 일부의 누락정도는 큰 문제가 되지 않는 경우가 많다.. 사용자 활동 로그가 일부 누락 되더라도, 서비스 기본기능에는 영향이 없고, 분석에 약간의 오차만 발생한다면 현실적으로 보인다.또, db의 연결성의 대한 의문은 주기적 일관성을 체크하여 보정하는 절차를 만들 수 있을것입니다. 일정주기마다 mysql과 mongodb를 크로스체크 하여, mongodb에 존재하지만, Mysql에 존재하지 않는 user_id의 로그가 발생하면, 정리하거나 생성하는 식의 적합성 점검을 수행하면 될것으로 보인다. –> 구현과정에서의 어려움 Python에서 Flask를 이용하여 Mysql과 Mongodb를 사용하려면, 각 db의 대한 연결과 ORM/ODM 패턴을 올바르게 구성해야된다고 나와있다.Flask는 다행히도, 확장으로 제공하기에 다루는데 큰 문제는 없으나, db구성의 파일을 서로 나눠놔야하는것의 번거로움이 보인다.
-> AI피드백 데이터 저장 및 관리 AI 기반 학습 피드백이란 사용자의 학습 행동 데이터를 분석하여 제공하는 맞춤형 정보를 말한다. 예를 들어 학습 상태 진단, 부족한 부분에 대한 재학습 추천, 개인화된 격려 메시지 등이 해당함. 이러한 피드백 데이터는 사용자별로 구조화된 지표와 비정형 정보가 혼합될 수 있다. 저장 전략을 설계할 때는 실시간 조회의 빈도, 데이터 구조의 복잡성, 갱신 주기를 고려해야 한다. 정형화된 지표는 MySQL에 테이블로 저장하기 적합하며, 집계를 하거나 JOIN하여 활용하기 간편함. 단, 유동적이나 복잡한 분석은 어려워 Mongodb에 사용하는 것이 유연하다. 사용자의 대한 여러 지표화 추천내역을 하나의 문서의 형태로 저장하게 되면 객체 형태로 직관적으로 관리할 수 있다. 스키마가 고정되지 않아 분석 항목을 추가/변경하기도 용이함. 혼합으로는 핵심 정보는 Mysql에 개인피드백은 Mongodb에 저장하는 것을 의미, 예를들자면, 총 학습 진도율, 레벨 간단한 지표는 MySQL의 user칼럼에 넣는 방법이 있고, 칼럼을 따로 추가하여 관리하는것도 좋음. 반면 세부 분석결과는 ai_feedback같은 컬렉션을 만들어 저장하여 보관하는 것이 정보를 유연하게 사용하는것과 같을 것이다.