Today I learn
AI 엔지니어 및 FastAPI 백엔드 포지션 취업을 위한 개념 정리 우선순위: 🔴 필수 (면접에서 거의 확실히 나옴) → 🟡 권장 (알면 차별화) → 🟢 후순위 (취업 후 배워도 됨)
- HTTP 동작 원리: 요청/응답 구조, 헤더, 바디, 쿠키, 세션
- HTTP 메서드 차이: GET, POST, PUT, PATCH, DELETE 각각의 의미와 용도
- 상태 코드: 200, 201, 204, 400, 401, 403, 404, 409, 500 각각 언제 쓰는지
- HTTPS: SSL/TLS가 뭔지, 왜 필요한지, 대칭키/비대칭키 암호화 기초
- CORS: 왜 발생하는지, 어떻게 해결하는지, 브라우저의 동일 출처 정책
- REST API: 리소스 중심 설계, URL 네이밍 규칙, 상태 무결성(Stateless)
- DNS: 도메인이 IP로 변환되는 과정 (간단히)
- TCP vs UDP: 차이점과 각각 어디에 쓰이는지
- WebSocket vs HTTP: 양방향 통신이 필요한 이유, 연결 유지 방식
- gRPC: REST와의 차이, 어떤 상황에서 쓰는지 (개념만)
- 로드밸런싱: L4 vs L7, 왜 필요한지
- CDN: 정적 파일 서빙, 왜 빠른지
- OAuth 2.0 흐름: Authorization Code Flow 전체 과정
- HTTP/2, HTTP/3 차이
- TCP 3-way handshake 상세
- 네트워크 계층 모델 (OSI 7계층) 상세
- 프로세스 vs 스레드: 차이, 메모리 공유 여부, 컨텍스트 스위칭
- 동시성 vs 병렬성: 개념 차이, 싱글코어에서 동시성이 어떻게 가능한지
- 비동기(async/await): 이벤트 루프 동작 원리, I/O 바운드 vs CPU 바운드
- 왜 FastAPI가 비동기인지: async def vs def의 차이, 어떤 작업에 async를 써야 하는지
- 데드락: 뭔지, 왜 발생하는지, 어떻게 방지하는지 (개념)
- 메모리 기초: 스택 vs 힙, 가비지 컬렉션이 뭔지 (Python 기준)
- 멀티프로세싱 vs 멀티스레딩 vs 비동기: Python에서 각각 언제 쓰는지
- Python GIL: 뭔지, 왜 존재하는지, 어떤 영향을 주는지
- 파일 디스크립터: 소켓, 파일 등이 내부적으로 어떻게 관리되는지
- 컨테이너가 OS 레벨에서 어떻게 동작하는지: 네임스페이스, cgroups (개념만)
- 가상 메모리, 페이징
- 스케줄링 알고리즘 상세
- 시스템 콜 상세
- 인덱스: 왜 필요한지, B-Tree 구조 기본, 언제 걸어야 하는지, 인덱스가 오히려 느려지는 경우
- EXPLAIN ANALYZE: 쿼리 실행 계획 읽는 법, Sequential Scan vs Index Scan 차이
- 트랜잭션과 ACID: 각 속성이 뭔지, 왜 중요한지
- 정규화: 1NF, 2NF, 3NF가 뭔지, 왜 하는지, 반정규화는 언제 하는지
- N+1 문제: 뭔지, ORM에서 왜 발생하는지, 어떻게 해결하는지 (JOIN, eager loading)
- SQL 기본: JOIN(INNER, LEFT, RIGHT), GROUP BY, HAVING, 서브쿼리
- 커넥션 풀링: 왜 필요한지, SQLAlchemy에서 어떻게 설정하는지
- ORM vs Raw SQL: 각각의 장단점, 언제 뭘 써야 하는지
- 격리 수준(Isolation Level): Read Uncommitted ~ Serializable, 각 수준에서 발생할 수 있는 문제
- 낙관적 잠금 vs 비관적 잠금: 개념과 사용 사례
- 파티셔닝: 테이블이 커졌을 때 어떻게 나누는지
- 레플리케이션: 읽기/쓰기 분리, 마스터-슬레이브 구조
- Redis 자료구조: String, Hash, List, Set, Sorted Set 각각 언제 쓰는지
- 캐시 전략: Cache Aside, Write Through, Write Behind 패턴
- 샤딩 전략
- MVCC 내부 동작
- WAL(Write-Ahead Logging) 상세
- 시간/공간 복잡도: Big-O 표기법, O(1), O(n), O(log n), O(n²) 차이
- 배열 vs 링크드 리스트: 각각의 장단점, 접근/삽입/삭제 시간 복잡도
- 해시맵(딕셔너리): 동작 원리, 해시 충돌, Python dict의 시간 복잡도
- 스택, 큐: 개념과 활용 사례
- 정렬: 버블, 선택, 삽입, 퀵, 병합 정렬의 시간 복잡도 (코드까지 외울 필요는 없고 개념)
- 이진 탐색: 정렬된 데이터에서 O(log n) 검색
- 트리 기초: 이진 트리, BST 개념
- 기초 DFS/BFS: 그래프 탐색의 기본
- 힙/우선순위 큐: 개념과 활용
- 그래프: 인접 리스트, 인접 행렬, 최단 경로 기초 (다익스트라)
- 동적 프로그래밍: 메모이제이션, 간단한 DP 문제 풀이
- 코딩 테스트 연습: 프로그래머스 레벨 1~2 수준
- 고급 트리 (AVL, 레드블랙 트리)
- 고급 그래프 알고리즘
- 문자열 알고리즘 (KMP 등)
- 인증 vs 인가: 차이점, 각각 어떻게 구현하는지
- JWT: 구조(Header, Payload, Signature), Access Token vs Refresh Token, 왜 둘 다 필요한지
- 토큰 저장 위치: 쿠키 vs 로컬스토리지, 각각의 보안 이슈
- 비밀번호 해싱: 평문 저장이 왜 위험한지, bcrypt/argon2, 솔트가 뭔지
- SQL Injection: 뭔지, ORM이 어떻게 방지하는지, 파라미터 바인딩
- XSS/CSRF: 각각 뭔지, 어떻게 방지하는지 (기본 개념)
- HTTPS: 왜 필수인지, 인증서 개념
- 환경변수 관리: 비밀키를 코드에 넣으면 안 되는 이유, .env 파일, 시크릿 관리
- Rate Limiting: 왜 필요한지, 어떻게 구현하는지 (Redis 기반)
- API Key 관리: 발급, 회전, 만료 전략
- OWASP Top 10: 주요 웹 보안 취약점 목록 (개념 수준)
- 보안 감사 및 침투 테스트
- 제로 트러스트 아키텍처
- 암호학 상세 (RSA, AES 알고리즘 내부)
- 계층 분리: 라우터(Controller) / 서비스(Business Logic) / 레포지토리(Data Access) 패턴
- API 설계: RESTful 원칙, URL 네이밍 컨벤션, 일관된 응답 형식, 에러 응답 표준화
- 페이지네이션: offset vs cursor 방식, 각각의 장단점
- 입력 검증: Pydantic으로 요청/응답 스키마 정의, 왜 서버에서 검증해야 하는지
- 에러 핸들링: 예외 처리 전략, 커스텀 예외 클래스, 일관된 에러 응답
- 로깅: 로그 레벨(DEBUG, INFO, WARNING, ERROR), 구조화된 로깅, 뭘 로깅해야 하는지
- 환경 분리: 개발/스테이징/프로덕션 환경 설정 분리
- 비동기 작업 처리: 백그라운드 태스크, 메시지 큐(Celery + Redis), 작업 상태 추적
- API 버저닝: URL 방식(/v1/, /v2/) vs 헤더 방식
- 의존성 주입: FastAPI의 Depends 패턴, 왜 테스트가 쉬워지는지
- 멱등성: 같은 요청을 여러 번 보내도 결과가 같은 것, PUT vs POST의 멱등성 차이
- Webhook: 개념, 사용 사례, 재시도 전략
- 헬스체크 엔드포인트: 서버 상태 확인 API, 왜 필요한지
- MSA: 마이크로서비스 아키텍처 개념, 모놀리식과의 차이, 장단점
- 이벤트 드리븐 아키텍처: 이벤트 소싱, CQRS
- 헥사고날/클린 아키텍처: 포트 & 어댑터 패턴
- DDD(도메인 주도 설계)
- Docker: Dockerfile 작성, 이미지/컨테이너 개념, docker-compose, 볼륨, 네트워크
- Git: 브랜치 전략(Git Flow or GitHub Flow), PR, merge, rebase, conflict 해결
- CI/CD: GitHub Actions로 테스트 자동화, Docker 이미지 빌드, 자동 배포
- AWS 기본: EC2, RDS, S3, IAM 기본, 보안 그룹
- 리눅스 기본 명령어: ls, cd, cat, grep, ps, top, tail, chmod, 파이프(|)
- AWS 추가: ECR(컨테이너 레지스트리), ECS(컨테이너 배포), CloudWatch(모니터링)
- Nginx: 리버스 프록시가 뭔지, 왜 FastAPI 앞에 두는지, 기본 설정
- 모니터링: 서버 메트릭 수집, 로그 수집, 알림 설정 (개념)
- 도메인/DNS 설정: Route53, A 레코드, CNAME
- SSL 인증서: Let's Encrypt, 자동 갱신
- Kubernetes: 파드, 디플로이먼트, 서비스, 인그레스 (취업 후)
- Terraform/IaC: 인프라를 코드로 관리하는 개념
- 서비스 메시 (Istio 등)
- 트랜스포머 기본: 어텐션 메커니즘이 뭔지, 인코더/디코더 구조, 왜 RNN보다 좋은지 (수식보다 직관적 이해)
- 임베딩: 텍스트를 벡터로 변환하는 개념, 코사인 유사도, 유클리드 거리
- RAG: 전체 파이프라인, 왜 필요한지(할루시네이션 방지), 청킹 전략
- 벡터 검색: ANN(Approximate Nearest Neighbor), HNSW vs IVFFlat 인덱스 차이
- 프롬프트 엔지니어링: 시스템 프롬프트, few-shot, chain-of-thought, 프롬프트 구조화
- LLM API 활용: 토큰 개념, 컨텍스트 윈도우, temperature/top_p, 스트리밍
- Function Calling / Tool Use: LLM이 외부 도구를 호출하는 메커니즘
- 하이브리드 검색: 벡터 검색 + 키워드 검색 조합, RRF(Reciprocal Rank Fusion)
- 평가(Evaluation): RAG 품질을 어떻게 측정하는지 (Precision, Recall, MRR 등)
- 파인튜닝: Full fine-tuning vs LoRA vs QLoRA, 언제 파인튜닝이 필요한지
- 토크나이저: BPE, WordPiece 등이 뭔지, 왜 중요한지
- 모델 서빙: 추론 최적화, 배치 처리, 양자화(quantization) 기초
- 에이전트 설계 패턴: ReAct, Plan-and-Execute, 멀티 에이전트
- LangGraph: 그래프 기반 에이전트 흐름 제어, 상태 관리
- 가드레일: LLM 출력 검증, 할루시네이션 탐지, 안전한 출력 보장
- 리랭킹: Cross-encoder 리랭킹, LLM 기반 리랭킹
- PyTorch 심화: 커스텀 모델 설계, 학습 루프 직접 구현
- 논문 읽기: Attention Is All You Need 등 핵심 논문
- 분산 학습: 여러 GPU로 모델 학습
- RLHF/DPO: LLM 정렬(alignment) 기법
- MLOps: MLflow, Airflow, 모델 레지스트리, A/B 테스트
- 단위 테스트: pytest 기본, 테스트 함수 작성법
- API 테스트: FastAPI TestClient로 엔드포인트 테스트
- 테스트 픽스처: 테스트 데이터 준비, conftest.py 활용
- 코드 포매팅: black, isort, ruff 같은 도구 사용
- 통합 테스트: DB 연동 테스트, 테스트용 DB 설정
- 모킹: 외부 API(LLM 호출 등)를 테스트할 때 mock 사용법
- 테스트 커버리지: 측정 방법, 적정 수준
- E2E 테스트
- 성능 테스트 (부하 테스트)
- TDD 방법론
아래 질문들에 자기 프로젝트 경험과 연결해서 답할 수 있으면 합격 확률이 크게 올라감.
백엔드 질문:
- "프로세스와 스레드의 차이가 뭔가요?"
- "async/await가 내부적으로 어떻게 동작하나요?"
- "인덱스를 왜 쓰나요? 항상 좋은 건가요?"
- "N+1 문제를 설명하고 해결 방법을 말해주세요"
- "JWT의 Access Token과 Refresh Token은 왜 둘 다 필요한가요?"
- "REST API에서 PUT과 PATCH의 차이는?"
- "Docker를 왜 쓰나요? 가상머신과 뭐가 다른가요?"
- "CI/CD가 왜 필요한가요?"
AI 질문:
- "RAG가 뭔가요? 왜 필요한가요?"
- "임베딩이 뭔가요? 코사인 유사도는 어떻게 계산하나요?"
- "벡터 검색만으로 충분하지 않은 이유가 뭔가요?"
- "프롬프트 엔지니어링에서 중요한 점은?"
- "트랜스포머의 어텐션이 뭔가요? (직관적으로)"
- "할루시네이션을 어떻게 줄일 수 있나요?"
- "파인튜닝과 RAG 중 언제 뭘 선택해야 하나요?"
공통 질문:
- "이 기술을 왜 선택했나요?"
- "프로젝트에서 가장 어려웠던 점과 해결 방법은?"
- "다시 만든다면 뭘 다르게 하겠나요?"
1단계 (즉시) : Git 협업 + Docker + 기존 프로젝트 정리
2단계 (1~2개월) : AWS 배포 + 테스트 코드 + CS 기초(네트워크, OS, DB)
3단계 (2~3개월) : 새 프로젝트 + LangGraph + 파인튜닝 경험
4단계 (3~5개월) : 포트폴리오 다듬기 + 면접 준비 + 코딩 테스트
주의하자: 새 기술을 넓게 배우는 것보다, 가진 기술을 깊이 이해하고 "왜?"를 설명할 수 있는 게 취업에서 훨씬 중요하다.