본문으로 건너뛰기

[open-webui] Open WebUI 성능 최적화: 불필요한 DB 중복 조회 제거하기

PR 링크: open-webui/open-webui#23794 상태: Merged | 변경: +None / -None

들어가며

웹 애플리케이션의 성능을 저해하는 가장 흔한 원인 중 하나는 '불필요한 데이터베이스 조회'입니다. 특히 인증(Authentication)이 필요한 API 엔드포인트에서, 이미 Depends(get_verified_user)를 통해 검증된 사용자 객체를 확보했음에도 불구하고, 동일한 데이터를 다시 조회하는 코드는 리소스 낭비입니다. 이번 PR은 open-webui 프로젝트에서 5개의 사용자 관련 엔드포인트에 걸쳐 발생하던 중복 SELECT 쿼리를 제거하여 성능을 최적화했습니다.

코드 분석

backend/open_webui/routers/users.py

기존 코드에서는 get_verified_user를 통해 이미 user 객체를 가져왔음에도, 각 핸들러 내부에서 Users.get_user_by_id를 다시 호출하고 있었습니다.

Before

async def get_user_settings_by_session_user(
    user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)
):
    user = await Users.get_user_by_id(user.id, db=db) # 중복 조회
    if user:
        return user.settings
    else:
        raise HTTPException(...)

After

async def get_user_settings_by_session_user(
    user=Depends(get_verified_user), db: AsyncSession = Depends(get_async_session)
):
    # user 이미 get_verified_user에 의해 로드됨 — 재조회 불필요
    return user.settings

이러한 변경은 GET /user/settings, GET /user/status, GET /user/info 등 여러 엔드포인트에 공통적으로 적용되었습니다. 또한, POST 요청의 경우에도 불필요한 조회 로직을 제거하고, 업데이트 결과에 대한 유효성 검사만 남겨두어 코드를 간결하게 만들었습니다.

왜 이게 좋은가

  1. 지연 시간(Latency) 감소: 각 요청마다 발생하는 불필요한 DB SELECT 쿼리를 제거함으로써, 데이터베이스 부하를 줄이고 API 응답 시간을 마이크로초 단위로 단축했습니다.
  2. 코드 가독성 향상: 불필요한 if-else 분기문을 제거하여 비즈니스 로직의 핵심 흐름을 더 명확하게 파악할 수 있게 되었습니다.
  3. 교훈: 인증 미들웨어(Dependency Injection)가 제공하는 컨텍스트를 최대한 활용해야 합니다. 이미 메모리에 로드된 객체를 다시 DB에서 조회하는 것은 '데이터 일관성'을 위한 것이 아니라면 성능상 큰 손해입니다.

리뷰어 피드백 반영

자동화된 코드 리뷰 과정에서 POST /user/status/update와 같은 업데이트 엔드포인트에서 None 반환 시의 에러 처리가 누락될 수 있다는 지적이 있었습니다. 이에 따라, 단순히 return하는 대신 업데이트 성공 여부를 확인하는 가드(Guard) 로직을 추가하여 API 안정성을 확보했습니다.

updated = await Users.update_user_status_by_id(user.id, form_data, db=db)
if updated:
    return updated
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.USER_NOT_FOUND)

이러한 최적화는 단순한 코드 삭제를 넘어, API의 신뢰성과 성능 사이의 균형을 맞추는 좋은 사례가 됩니다.

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글