디렉토리(directory)는 컴퓨터 파일 시스템에서 파일들을 체계적으로 정리하고 관리하기 위한 저장 공간의 구조입니다. 흔히 "폴더(folder)"라고도 부릅니다.
쉽게 비유하면, 서류를 정리하는 서랍장과 같습니다. 서랍 안에 관련된 서류들을 모아두고, 서랍 안에 또 다른 작은 칸(하위 디렉토리)을 만들 수도 있죠.
핵심 특징을 정리하면 이렇습니다. 디렉토리는 파일과 다른 디렉토리(하위 디렉토리)를 담을 수 있고, 트리(나무) 형태의 계층 구조를 이룹니다. 최상위 디렉토리를 "루트(root) 디렉토리"라고 부르며, Windows에서는 C:\, Linux/macOS에서는 /로 표현합니다.
예를 들어 /home/user/documents/report.pdf라는 경로가 있다면, home, user, documents는 모두 디렉토리이고 report.pdf가 그 안에 들어있는 파일입니다.
백엔드 파트 데이터 흐름구조를 잘짜서 빠르게 잘전달 하는 역할 어떻게 들어와서 어떤로직 어떻게 나가나 ?"
병목? 현상인가?
전반적인흐름처리파악을 알아야한다. -->설계 핵심적역할
제일 먼저 어떤데이터를 어떻게 전달할까 ? 를 먼저 생각해야하는데
타겟층에게 어떤 플랫폼으로 전달할것인지가 중요
데이터가 어디에서 들어오나?
어떻게 처리되나
어디로 출력될것인지?
drf fast ai 배우는이유
핵심 --> 어떤데이터를 수집해서 어떤고객층해서 어떤처리(속도 병목 현상 버그 에러 어떻게 처리되나?) 어디로 보낼까 ?
레스트프레임워크가 확장 유니티 언리얼 안경으로 확장된다.
md 파일 이게 생성형ai 랭귀지파일이여서 잘 읽고 분석하는데 빠르다
우리는 코드나온것에 체크와 잘못된점 경로 변경 지시 간단하게!!
코드를 눈으로 하는게 아니라 . f12번 검수방식이지 눈으로 읽는거아니고
먼저 해야할것은 13번과 전체 흐름처리구조 파일별로 봐라 .
어떤 클래스와 라우터로 움직이고 있는지 파악하기
13번에서 분석 한뒤 정량적 데이터로 이야기하기

ai 모델정의중에서 작은ㅂ분연결
http 통해 json 로 딕션어리 view
══════════════════════════════════════════════════════════════
AI 서버 전체 로직 흐름 (파일 + 클래스/함수 기준)
══════════════════════════════════════════════════════════════
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[서버 시작 시점] — 이 파일이 import 되는 순간 자동 실행.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
models/embedding_model.py
├── SentenceTransformer("upskyy/e5-small-korean") 로드
└── embedding_model 전역 객체 생성 (471MB 모델 메모리 적재)
↓ 이 파일이 import 되는 순간 자동 실행됨
main.py
├── FastAPI(title="AI Recommendation Server") 앱 생성
├── include_router(recommend_router) 라우터 등록
│ → /api/v1/recommend/embed (POST)
│ → /api/v1/recommend/similarity (POST)
└── GET / → root() → {"message": "AI server is running"}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[요청 흐름 1] POST /api/v1/recommend/embed
"여러 문장을 임베딩 벡터로 변환해줘"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DRF (Django, port 8000)
↓ POST /api/v1/recommend/embed
↓ body: {"texts": ["문장1", "문장2", "문장3"]}
─────────────────────────────────────────────────────
api/recommend.py
└── router = APIRouter(prefix="/api/v1/recommend")
↓
@router.post("/embed")
def embed_texts(payload: EmbeddingRequest)
↓ payload → Pydantic이 JSON을 EmbeddingRequest 객체로 자동 변환
↓ 검증 실패 시 422 자동 반환 (코드 없이 자동)
─────────────────────────────────────────────────────
schemas/recommend_schema.py
└── class EmbeddingRequest(BaseModel)
├── texts: List[str] ← ["문장1", "문장2", "문장3"] 검증
└── 검증 통과 → payload 객체로 확정
└── class EmbeddingResponse(BaseModel)
└── embeddings: List[List[float]] ← 응답 형식 고정
─────────────────────────────────────────────────────
services/recommend_service.py
└── make_embeddings(texts: List[str]) → List[List[float]]
↓ embedding_model.encode(texts) 호출
↓ numpy 배열 반환
↓ [vector.tolist() for vector in vectors]
└── numpy.ndarray → Python List[float] 변환 완료
─────────────────────────────────────────────────────
models/embedding_model.py
└── embedding_model (전역 객체)
└── .encode(["문장1", "문장2", "문장3"])
↓ 토크나이징 → 트랜스포머 추론
└── shape: (3, 384) numpy 배열 반환
─────────────────────────────────────────────────────
api/recommend.py (복귀)
└── {"embeddings": [[0.12, ...], [0.14, ...], [0.55, ...]]}
↓ EmbeddingResponse 스키마 형식으로 직렬화
└── JSON 응답 반환
DRF (Django, port 8000)
└── 응답 수신 → embeddings 벡터 배열 → DB 저장 또는 추가 처리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[요청 흐름 2] POST /api/v1/recommend/similarity
"두 문장이 얼마나 비슷한지 점수로 줘"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DRF (Django, port 8000)
↓ POST /api/v1/recommend/similarity
↓ body: {"text1": "보습력이 좋아요", "text2": "수분감이 오래가요"}
─────────────────────────────────────────────────────
api/recommend.py
└── @router.post("/similarity")
def similarity(payload: SimilarityRequest)
↓ JSON → SimilarityRequest 객체 변환
─────────────────────────────────────────────────────
schemas/recommend_schema.py
└── class SimilarityRequest(BaseModel)
├── text1: str
└── text2: str
└── class SimilarityResponse(BaseModel)
└── similarity: float ← 응답 형식 고정
─────────────────────────────────────────────────────
services/recommend_service.py
└── calculate_similarity(text1, text2) → float
↓ embedding_model.encode([text1, text2])
↓ vectors[0], vectors[1] 각각 추출
↓ cosine_similarity([vectors[0]], [vectors[1]])[0][0]
│ → sklearn이 내적/크기 계산 → numpy.float32 반환
└── float(score) → Python float 변환
─────────────────────────────────────────────────────
models/embedding_model.py
└── embedding_model.encode([text1, text2])
↓ 두 문장을 각각 384차원 벡터로 변환
└── shape: (2, 384) numpy 배열 반환
─────────────────────────────────────────────────────
api/recommend.py (복귀)
└── {"similarity": 0.3605}
↓ SimilarityResponse 스키마로 직렬화
└── JSON 응답 반환
DRF (Django, port 8000)
└── 유사도 점수 수신 → 추천 로직 처리 또는 DB 저장
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[파일 간 의존 관계]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
main.py
└── import → api/recommend.py (router 등록)
api/recommend.py
├── import → schemas/recommend_schema.py (EmbeddingRequest 등 4개 클래스)
└── import → services/recommend_service.py (make_embeddings, calculate_similarity)
services/recommend_service.py
├── import → models/embedding_model.py (embedding_model 전역 객체)
└── import → sklearn.metrics.pairwise (cosine_similarity)
models/embedding_model.py
└── import → sentence_transformers (SentenceTransformer)
schemas/recommend_schema.py
└── import → pydantic (BaseModel), typing (List)