2025년 April 12일
  1. 개발 히스토리
  2. [Backend] 채팅 기능 개선

[Backend] 채팅 기능 개선

채팅 기능

4월 11일,
API나 세션 관련해서 발생하는 문제점들을 중점적으로 수정했습니다.

API 코드 변경

기존 코드는 에이전트 구성과 임베딩을 위해 OpenAI를 활용했습니다.
그렇기 때문에 사용자에게 OpenAI의 API 키가 없을 경우,
Claude와 같은 다른 모델을 사용해도 에러가 발생하는 문제가 있었습니다.
그래서 일반 GPT 호출 상수 및 함수와 임베딩 전용 함수를 분리하여 에러가 발생하지 않도록 수정했습니다.

DB 내부의 공통 API

현재, DB 내 사용자 계정이 아닌 관리자 계정으로 API 하나를 생성했습니다.
이 API는 1번 ID로 저장되어서, 모든 사용자를 위해 공통으로 제공됩니다.
해당 API를 활용하여 답변 생성은 불가능하지만 임베딩과 에이전트 활용이 가능해집니다.

def get_embedding_key(db : Session):
    api = db.query(ApiKey).filter(ApiKey.user_id == 1).first()
    config.EMBEDDING_API = api.api_key
    return config.EMBEDDING_API

기타 작업 내용

채팅 관련 기능 외에 4월 11일 작업한 내용들입니다.

비밀번호 변경 함수

비밀번호 암호화 기능의 추가로 인해,
기존 비밀번호 변경 기능이 동작하지 않는 문제가 있었습니다.

def change_password(db : Session, id : int, current_pw : str, new_pw : str):
    user = db.query(User).filter(User.id == id).first()
    hashed_pw = hash_password(new_pw)
    if user.password.startswith("$2b$"):
        if verify_password(current_pw, user.password):
            user.password = hashed_pw
            db.commit()
            db.refresh(user)
            return "비밀번호가 변경되었습니다!"
        else :
            return "현재 비밀번호가 잘못되었습니다."
    else :
        return "관리자 권한으로 생성된 계정입니다."

그렇기 때문에 비밀번호 변경 코드 또한 백엔드에서 새 비밀번호를 받은 후
해시 암호화한 뒤에 검증하는 방식으로 코드를 수정했습니다.

이렇게 했을 때,
새로 저장되는 비밀번호 또한 암호화를 거친 후 저장됩니다.


사용자 삭제

기존에 사용자 삭제 기능이 관리자 화면에서 제대로 작동하지 않는 문제가 발생했습니다.
현재 유저 삭제 기능 관련 함수들 수정했습니다.

엔드포인트

@user_router.post("/DeleteUser", response_model=DeleteUserResponse)
async def projects_list(request: DeleteUserRequest, db: Session = Depends(get_db)):
    email = request.email
    delete_user(db, email)
    return JSONResponse(content={'message': '삭제 완료.'}, status_code=200)

엔드포인트 함수가 일부 수정됐습니다.

비밀번호 찾기

비밀번호 찾기 기능 구현되었습니다.

스키마

class FindPasswordRequest(BaseModel):
    newPasswordData : str
    email : str

class FindPasswordResponse(BaseModel):
    message : str

Email과 신규 비밀번호를 입력으로 받고,
메세지를 반환합니다.

CRUD 함수

def find_password(db : Session, email : str, new_pw : str):
    user = db.query(User).filter(User.email == email).first()
    hashed_pw = hash_password(new_pw)
    if user.password.startswith("$2b$"):
        user.password = hashed_pw
        db.commit()
        db.refresh(user)
        return "비밀번호가 변경되었습니다!"
    else :
        return "관리자 권한으로 생성된 계정입니다."

기존 change_password 함수를 조금 수정해서 새 함수를 만들었습니다.

엔드포인트

@user_router.post("/FindPassword", response_model=FindPasswordResponse)
async def find_password_endpoint(request: FindPasswordRequest, db: Session = Depends(get_db)):
    email = request.email
    new_pw = request.newPasswordData
    messages = find_password(db = db, email=email, new_pw=new_pw)
    return JSONResponse(content={'message': messages}, status_code=200)

엔드포인트에서도 기존 ChangePassword와 비슷하게 새로 함수를 만들었습니다.

Leave a Reply

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

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