[졸프] ML 추천 최적화를 위한 user_book_read 통합 & 벡터 생성 트리거 구현

순두누나·2025년 8월 6일

졸업프로젝트

목록 보기
11/21

1. 현재 구조

  • 회원가입 설문에서 유저가 “재밌게 읽은 책”을 입력
  • 데이터는 user_preference_book_id 테이블에 저장됨
user_preference_id BIGINT
preferred_book_id  INT

ML 팀에서 추천 벡터 생성을 위해 user_book_read 테이블을 참고하고 있음
→ 따라서 설문 데이터가 이 테이블에 있어야 벡터 생성이 가능

2. ML 요청

  • ML은 유저가 읽은 책 기록(user_book_read)을 기반으로 벡터를 학습하고 추천 생성
  • 설문 응답을 별도 테이블(user_preference_book_id)에 두면 ML이 데이터를 활용하기 번거로움

따라서 회원가입 설문 결과도 user_book_read에 넣어달라는 요청이 들어옴.

3. 선택지

A안. 기존 테이블 삭제하고 user_book_read로 통합

  • 장점
    - 데이터 중복 관리 필요 없음
    - ML에서 바로 활용 가능

  • 단점
    - 설문 데이터와 실제 읽은 책을 구분하기 어려움
    - 과거 데이터 마이그레이션 필요

B안. 기존 테이블 유지 + 백엔드에서 user_book_read에 동시 insert

  • 장점
    - 설문 통계나 별도 처리 시 user_preference_book_id 유지 가능
    - ML도 바로 활용 가능

  • 단점
    - 데이터 중복 관리 필요
    - 설문 데이터를 두 테이블에 모두 저장해야 함

나는 ML 추천 기능이 최우선이고, 해당 설문 조사 데이터를 쓸 곳은 없기 때문에 A안을 선택했다.

4. 진행 방법

1. DB 마이그레이션

INSERT INTO user_book_read (user_id, book_id, source, created_at)
SELECT up.user_id, up.preferred_book_id, 'SURVEY', NOW()
FROM user_preference_book_id up;

‼️ 여기서 마이그레이션이란?
: 데이터베이스에서 데이터를 옮기거나, 스키마를 변경하는 작업.
테이블 구조를 바꿀 때, 데이터를 다른 테이블로 이동할 때,컬럼 추가/삭제/이름 변경 등 스키마 변경를 할 때 사용된다.

2. 테이블 삭제

DROP TABLE user_preference_book_id;

3. 백엔드 코드 수정

  • 설문 제출 시 user_book_read에 바로 insert
  • source 컬럼으로 설문과 실제 기록 구분

이상 이렇게 DB 관련 리팩토링은 마무리했다..

그리고 다음으로 해야할 일

우선은 유저 벡터 생성 API 호출을 진행해야한다.

요구사항 정리

  • 벡터 생성 시점
    1. 회원가입 질문(취향 설문) 완료 시
    2. user_book_read에 도서가 새로 추가될 때 (설문 포함, 이후 독서 기록 포함)

  • 호출할 API

POST /api/users/{user_id}/generate-vector
성공: { "message": "유저 벡터 생성 완료" }
실패: { "message": "벡터 생성 실패" }
  • DB 저장
    ML 서버에서 벡터 생성 후, user_embedding 테이블에 user_id 기준으로 갱신

이 부분부터는 아래 글에서 진행했다.
유저 벡터 생성 자동 호출 구현 + RestTemplate Apache 오류 해결

profile
순두의 누나입니다

0개의 댓글