프로세스 풀과 스레드 풀
과도한 프로세스/스레드 생성은 CPU 성능 저하를 유발합니다. 이를 방지하기 위해 고정된 수의 실행 단위를 미리 생성하는 프로세스 풀/스레드 풀을 사용합니다. 초과 작업은 선행 작업 완료 시까지 대기합니다.
from concurrent.futures import ProcessPoolExecutor
executor = ProcessPoolExecutor(max_workers=4)
task_future = executor.submit(execute_function, arg1, kwarg1=val1)
task_future.add_done_callback(completion_handler) # 작업 완료 시 핸들러 실행
코루틴
코루틴은 IO 작업 시 코드 수준에서 전환하여 OS가 IO를 인지하지 못하도록 합니다. 이는 스레드가 IO에서 차단되지 않은 것처럼 보이게 하여 CPU 우선순위를 높입니다.
from gevent import monkey; monkey.patch_all()
from gevent import spawn
def async_task():
# IO 작업 포함 함수
...
greenlet = spawn(async_task)
greenlet.join() # 코루틴 완료 대기
데이터베이스 이론
데이터베이스는 구조화된 데이터 관리를 위한 소프트웨어로, 일반적으로 클라이언트-서버 아키텍처로 동작합니다.
데이터베이스 유형
- 관계형: 고정 스키마, 테이블 간 관계 지원 (MySQL, PostgreSQL)
- 비관계형: 유연한 스키마, 키-값 저장 (Redis, MongoDB)
핵심 개념
| 개념 | 설명 |
|---|---|
| 스키마 | 데이터 구조 정의 |
| 테이블 | 행/열 데이터 구조 |
| 레코드 | 테이블의 단일 행 |
기본 SQL 구문
-- 테이블 생성
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE
);
-- 데이터 조회
SELECT department, AVG(salary)
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department;
MySQL 데이터 타입
| 유형 | 예시 | 특징 |
|---|---|---|
| 정수형 | TINYINT, INT | unsigned/zerofill 지원 |
| 실수형 | DECIMAL(10,2) | 고정 정밀도 |
| 문자형 | CHAR(20), VARCHAR(255) | 고정/가변 길이 |
제약 조건
- PRIMARY KEY: 레코드 고유 식별자
- FOREIGN KEY: 테이블 간 관계 정의
- AUTO_INCREMENT: 자동 증가 값
- UNIQUE: 중복 값 방지
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
ON UPDATE CASCADE
ON DELETE CASCADE
);
테이블 관계 설계
- 1:N 관계: 외래 키 사용
CREATE TABLE departments ( dept_id INT PRIMARY KEY ); CREATE TABLE employees ( emp_id INT PRIMARY KEY, dept_id INT REFERENCES departments(dept_id) ); - M:N 관계: 조인 테이블 사용
CREATE TABLE student_course ( id INT PRIMARY KEY, student_id INT REFERENCES students(id), course_id INT REFERENCES courses(id) );
단일 테이블 쿼리
SELECT department, COUNT(*) AS staff_count
FROM employees
WHERE salary > 50000
GROUP BY department
HAVING staff_count > 5
ORDER BY staff_count DESC
LIMIT 10;