2025년 April 21일
  1. 개발 히스토리
  2. [Backend] Provider 활성화

[Backend] Provider 활성화

Provider 상태

스키마 구현

class ProviderStatusRequest(BaseModel):
    provider_id : int

class ProviderStatusResponse(BaseModel):
    message : str

입력으로는 Provider의 고유 ID를 받습니다.
그리고 간단한 메세지를 반환합니다.

CRUD 코드

def change_provider_status(db: Session, provider_id: int):
    provider = db.query(Provider).filter(Provider.id == provider_id).first()
    print(f"provider_Status : {provider.status}")
    if provider.status == 'Active':
        provider.status = 'Deactive'
    elif provider.status == 'Deactive':
        provider.status = 'Active'
    db.commit()
    db.refresh(provider)

Provider의 ID를 기반으로 해당되는 Provider를 찾습니다.
이후 기존 Status가 Activate일 경우 Deactivate로 전환하고,
반대로 Deactivate 상태일 경우 Activate로 전환합니다.

엔드포인트

@langchain_router.post("/changeProviderStatus", response_model = ProviderStatusResponse)
async def change_provider_status_endpoint(request : ProviderStatusRequest, db : Session = Depends(get_db)):
    provider_id = request.provider_id
    try:
        change_provider_status(db = db, provider_id = provider_id)
        return JSONResponse(content={"message" : "Provider Status 전환 성공"})
    except Exception as e:
        print(f"Provider Status 전환 에러 : {e}")
        return JSONResponse(content={"message" : "Provider Status 전환 실패"})

테스트

메세지 출력 성공

실제 DB에도 정상적으로 변화가 반영됩니다.

파일 업로드 기능 개선

현재 파일 업로드 기능이 개발 환경에서는 정상적으로 작동하지만,
막상 운영 환경으로 옮기면 계속 오류가 발생하는 문제가 있습니다.
또한 개발 환경에서도 ‘SAVED FILES’라는 디렉터리 하나에,
모든 사용자가 업로드한 데이터들이 전부 저장되기 때문에 상당히 디렉터리 구조가 복잡해집니다.

디렉터리 위치

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
UPLOAD_FOLDER = os.path.join(BASE_DIR, "file", "upload")

기존 코드는 미리 만들어놓은 Saved Files라는 폴더를,
파이썬에서 인식하도록 설정했습니다.
이는 절대 경로 기준이었기 때문에 운영 환경이 개발 환경과 조금이라도 다르다면 오류로 이어집니다.
그렇기 때문에 폴더명이나 디렉터리 구조가 조금 다르더라도 정상적으로 동작하도록 CORE 설정을 변경했습니다.

Saved Files라는 디렉터리 안에 전부 저장하는 것이 아니라
File이라는 상위 폴더 아래에 Upload라는 폴더를 따로 생성하도록 합니다.
이는 추후 META LLM MSP에서 직접 파일을 생성해서 제공할 때,
‘업로드된 파일’과 ‘생성된 파일’을 구분하기 위함입니다.

Main 설정

import os
from core.config import UPLOAD_FOLDER

if __name__ == "__main__":
    os.makedirs(UPLOAD_FOLDER, exist_ok=True)
    uvicorn.run(app, host="0.0.0.0", port=5000)

개발 환경에서는 미리 만들어놓은 디렉터리 구조가 제대로 존재하지만,
운영 환경에서는 그렇지 않기 때문에 오류가 발생했을 가능성도 있습니다.
그렇기 때문에 운영 환경이 실행될 때에도 파일 저장 경로가 설정되어있지 않다면 직접 생성하도록 설정합니다.

파일 구조 변경

save_dir = config.UPLOAD_FOLDER
        user_dir = os.path.join(save_dir, user_email, 'document')
        os.makedirs(user_dir, exist_ok=True)

        file_name, file_path = "", ""
        for file in files:
            random_number = generate_verification_code()
            file_name = f"{project_id}_{random_number}_{file.filename}"  # 파일명에 project_id와 랜덤번호 추가
            file_path = os.path.join(user_dir, file_name)  # 사용자 폴더에 저장할 경로

            with open(file_path, "wb") as f:
                content = await file.read()  # 파일 내용 읽기
                f.write(content)  # 파일 내용 저장

        file_id = upload_file(db=db, project = project_id, email=user_email, url=file_path, name=file_name)
        file_content = get_file_chain(db=db, id = file_id, file_path=file_path)

UPLOAD라는 디렉터리 아래에 사용자별로 파일을 보관할 수 있는 폴더를 생성합니다.
그리고 ‘document’라는 이름의 하위 폴더를 하나 더 생성하도록 합니다.
document 하위 폴더를 굳이 생성한 이유는,
이후에는 문서 파일 뿐만 아니라 이미지나 영상 등의 파일도 다룰 것이기 때문입니다.

실제 디렉터리 구조입니다.

Leave a Reply

Your email address will not be published. Required fields are marked *

연관 글
BCT NEWS
인기 글
워드프레스 보안
워드프레스 모음
워드프레스 유지보수
워드프레스 제작 팁