Post

Streamlit 기반 면접 챗봇의 백엔드 구조 살펴보기

개발자 면접 챗봇 프로젝트의 backend/ 디렉토리 구조를 중심으로 사용자 인증, 데이터 연동, RAG 설계 방식을 정리합니다. Streamlit 세션과 함께 작동하는 백엔드 구조를 자세히 들여다봅니다.

Streamlit 기반 면접 챗봇의 백엔드 구조 살펴보기

1. backend/ 디렉토리 구조 소개

Streamlit 앱에서 사용자 입력을 받아 대화형으로 면접을 진행하려면, 그 뒤에서 받쳐주는 백엔드 구조가 중요합니다. 본 프로젝트는 FastAPI나 Django 같은 서버 프레임워크 없이도 충분한 기능을 갖추기 위해 다음과 같이 backend/ 디렉토리를 구성했습니다:

1
2
3
4
5
6
7
8
9
📂 backend/
├── 📂 data/                # 챗봇 학습용 참조 문서 보관
│   └── referance.docx     # 면접 질문 생성을 위한 참조 문서
├── db.py                  # PostgreSQL 테이블 생성 및 DB 연동
├── accounts.py            # 사용자 회원가입 및 로그인 기능
├── config.py              # OpenAI, Pinecone API 키 로딩, DB 설정
├── langchain_chatbot.py   # LangChain 기반 RAG 챗봇 응답 로직
├── pinecone_db.py         # 문서 벡터화 및 Pinecone 삽입/검색 함수
└── utils.py               # 로그인 상태 표시 및 로그아웃 버튼 렌더링 함수

2. 사용자 인증 로직 (accounts.py)

  • 회원가입: bcrypt로 비밀번호를 해싱해 PostgreSQL DB에 저장합니다. 사용자 이름 중복 여부를 먼저 확인한 뒤 삽입합니다.
  • 로그인: 입력받은 비밀번호를 DB에서 불러온 해시값과 비교하고, 성공 시 st.session_state에 사용자 이름을 저장합니다.
  • 세션 기반 인증: 로그인 상태는 Streamlit의 세션 상태(st.session_state['user'])로 관리됩니다.
1
2
3
4
def login(username, password):
    ...
    if bcrypt.checkpw(password.encode(), stored_pw.encode()):
        st.session_state["user"] = username

3. 환경 변수 관리 (config.py)

  • .streamlit/secrets.toml 또는 .env를 통해 API 키와 DB 접속 정보를 분리 관리합니다.
  • get_openai_client() 함수로 OpenAI GPT 인스턴스를 초기화하고,
  • DB_CONFIG 객체로 DB 접속에 필요한 값을 정리해줍니다.
  • 시스템 메시지(SYSTEM_MESSAGE)도 여기에 상수로 보관하여 챗봇 초기화 시 활용합니다.
1
2
3
4
5
6
7
DB_CONFIG = {
    "host": st.secrets['postgres']['POSTGRES_HOST'],
    ...
}

def get_openai_client():
    return OpenAI(api_key=st.secrets['openai']['OPENAI_API_KEY'])

4. 유틸리티 함수 (utils.py)

  • show_sidebar() 함수는 로그인 상태일 때 Streamlit 사이드바에 사용자 이름을 표시하고 로그아웃 버튼을 제공합니다.
  • 로그아웃 시 세션 상태를 초기화하고 앱을 새로고침합니다.
1
2
3
4
5
6
7
def show_sidebar():
    if st.session_state.get("authenticated", False):
        with st.sidebar:
            st.write(f"✅ 로그인 상태: {st.session_state['user']}")
            if st.button("로그아웃"):
                logout()
                st.rerun()

5. 데이터 연동 및 DB 구조 (db.py)

db.py는 사용자 정보, 채팅 세션, 질문/답변을 저장하는 PostgreSQL 테이블을 정의합니다.

  • users: 사용자 ID, 이름, 비밀번호
  • chat_sessions: 유저별 세션 ID와 생성일
  • chat_messages: 각 세션별 질문/답변과 timestamp
  • 모든 timestamp는 KST 기준으로 설정됩니다.
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(255) UNIQUE NOT NULL,
    password TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT (CURRENT_TIMESTAMP AT TIME ZONE 'Asia/Seoul')
);

6. 마무리

별도의 백엔드 서버 없이도 Streamlit만으로 인증과 데이터 관리를 구현할 수 있습니다. backend/ 디렉토리는 인증, 설정, 벡터화, DB 연결 등 챗봇이 작동하기 위한 모든 기능을 담고 있으며, 이 구조 덕분에 단일 파일이 아닌 구조적인 코드 관리가 가능했습니다.

This post is licensed under CC BY 4.0 by the author.