FastAPI
Pydantic
- 데이터 검증 및 직렬화를 위한 Python 라이브러리
- BaseModel을 상속한 모델을 통해 자동으로 타입 검사 및 유효성 검사를 수행
- FastAPI의 강력한 기능 중 상당 부분은 Pydantic을 기반으로 한 데이터 검증과 직렬화 기능에 의존 ⇒ 이 관계를 이해하면 FastAPI의 구조와 장점을 명확하게 파악할 수 있음
FastAPI 데코레이터(decorator)
- HTTP 요청을 처리할 경로(엔드포인트)를 정의할 때 사용
- 함수 시그니처에 타입 힌트를 사용해서 요청, 응답, 문서화, 검증을 자동화
- 주요 데코레이터
데코레이터 | 설명 |
@app.get() | HTTP GET 요청 처리 |
@app.post() | HTTP POST 요청 처리 |
@app.put() | HTTP PUT 요청 처리 |
@app.delete() | HTTP DELETE 요청 처리 |
@app.patch() | HTTP PATCH 요청 처리 |
@app.options() | HTTP OPTIONS 요청 처리 |
@app.head() | HTTP HEAD 요청 처리 |
@app.api_route() | 메서드 여러 개 지정 가능 |
@router.get() 등 | APIRouter 객체에서 경로 정의 시 사용 |
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello") # 브라우저에서 /hello에 GET 요청을 보내면 JSON 응답을 반환
def say_hello():
return {"message": "Hello, World!"}
Form 클래스
FastAPI는 기본적으로 요청 본문(Request Body)이 JSON 형식일 것으로 예상합니다. 하지만 HTML <form> 태그를 사용한 요청은 JSON이 아닌 x-www-form-urlencoded 형식으로 전송됩니다.
따라서 이런 데이터를 처리하려면 FastAPI에 "이건 JSON이 아니라 Form 데이터야"라고 명시해야 하는데, 이때 사용하는 것이 바로 Form 클래스입니다.
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login")
async def login(username: str = Form(...), password: str = Form(...)):
return {"username": username, "password": password}
- Form(...): 이 파라미터는 form-data로부터 받아야 한다는 의미
- ...: 필수 값(required)을 나타냄
- 위 함수는 HTML form에서 POST 방식으로 전송한 데이터를 받기 위해 사용
FastAPI 자동 문서화
FastAPI는 자동 문서화(Auto Documentation) 기능이 매우 강력한 웹 프레임워크입니다.
이는 FastAPI가 함수에 사용된 타입 힌트(Type Hint)와 Pydantic 모델을 기반으로 OpenAPI 스펙을 생성하기 때문입니다.
FastAPI는 애플리케이션을 실행하면 자동으로 인터랙티브한 API 문서를 제공합니다. 개발자는 별도로 API 문서를 작성할 필요 없이, 코드만 잘 작성해도 문서가 완성됩니다.
FastAPI에서 제공하는 자동 문서화 도구
문서 UI | 경로 | 특징 |
Swagger UI | /docs | 기본 문서. 인터랙티브 UI로 API 테스트 가능 |
ReDoc | /redoc | 좀 더 읽기 좋은 문서 형식 |
OpenAPI JSON | /openapi.json | API 명세를 JSON 형태로 제공 |
React
useState 훅
리액트(React)의 함수형 컴포넌트에서 상태변수는 useState 훅을 사용하여 정의합니다. 이 훅은 컴포넌트 내부에서 상태(state)를 만들고, 업데이트할 수 있는 기능을 제공합니다.
기본 문법
const [state, setState] = useState(초기값);
- state: 현재 상태 값
- setState: 상태를 변경하는 함수
- 초기값: 상태 변수의 초기값 (숫자, 문자열, 객체, 배열 등 다양함)
숫자를 초기값으로 가지는 예
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0); // 숫자 초기값
return (
<div>
<p>카운트: {count}</p>
<button onClick={() => setCount(count + 1)}>증가</button>
</div>
);
}
문자열을 초기값으로 가지는 예
function NameInput() {
const [name, setName] = useState(''); // 빈 문자열로 초기화
return (
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
/>
);
}
불리언을 초기값으로 가지는 예
function Toggle() {
const [isVisible, setIsVisible] = useState(true);
return (
<div>
<button onClick={() => setIsVisible(!isVisible)}>토글</button>
{isVisible && <p>보이는 텍스트</p>}
</div>
);
}
빈 배열을 초기값으로 가지는 예
function TodoList() {
const [todos, setTodos] = useState([]);
return (
<ul>
{todos.map((todo, idx) => <li key={idx}>{todo}</li>)}
</ul>
);
}
빈 객체를 초기값으로 가지는 예
function Profile() {
const [user, setUser] = useState({});
return (
<div>
<p>이름: {user.name}</p>
<p>나이: {user.age}</p>
<button onClick={() => setUser({ ...user, age: user.age + 1 })}>
나이 증가
</button>
</div>
);
}
null 또는 undefined을 초기값으로 가지는 예
function OptionalData() {
const [data, setData] = useState(null); // 처음엔 데이터 없음
return (
<div>
{data ? <p>데이터: {data}</p> : <p>데이터 없음</p>}
<button onClick={() => setData("불러온 데이터")}>데이터 설정</button>
</div>
);
}
상태(state) 변수와 속성(props) 변수
항목 | props | state |
역할 | 부모 → 자식에게 전달하는 읽기 전용 데이터 | 컴포넌트 내부에서 관리하는 변경 가능한 데이터 |
수정 가능 | 부모만 수정 가능 (자식은 읽기만 가능) | setState() 또는 useState()로 수정 가능 |
사용 목적 | 외부로부터 받은 설정값, 구성 요소 | 사용자 입력, 내부 상태 변화 등 동적인 UI |
선언 위치 | 함수 매개변수로 전달 | useState() 등으로 컴포넌트 내부에서 정의 |
리렌더링 | 값이 바뀌면 리렌더링 발생 | 값이 바뀌면 리렌더링 발생 |
// 부모 컴포넌트(App.js)
import React from 'react';
import Child from './Child';
function App() {
return <Child title="Hello React" />;
}
// 자식 컴포넌트(Child.js)
import React, { useState } from 'react';
function Child({ title }) { // title은 props
const [count, setCount] = useState(0); // count는 state
return (
<div>
<h1>{title}</h1> {/* props 사용 */}
<p>Count: {count}</p> {/* state 사용 */}
<button onClick={() => setCount(count + 1)}>Increase</button>
</div>
);
}
export default Child;
리렌더링(re-rendering)
리액트(React)에서 컴포넌트는 "상태(state)나 속성(props)이 변경되었을 때" 다시 렌더링됩니다.
즉, 화면에 표시되는 내용을 새롭게 반영해야 하는 상황에서 리렌더링(Re-rendering)이 자동으로 발생합니다.
상황 | 설명 |
1. state 변경 | useState, useReducer 등으로 상태가 변경되면 컴포넌트가 다시 렌더링됩니다. |
2. props 변경 | 부모로부터 받은 props 값이 변경되면 자식 컴포넌트가 다시 렌더링됩니다. |
3. 부모 컴포넌트 리렌더링 | 부모가 리렌더링되면 자식도 기본적으로 함께 리렌더링됩니다. |
4. context 값 변경 | useContext를 사용하는 컴포넌트는 context 값이 변경되면 리렌더링됩니다. |
5. 강제 리렌더링 (forceUpdate) | 클래스형 컴포넌트에서 this.forceUpdate()를 호출하면 리렌더링됩니다. |
6. key 변경 (리스트 렌더링) | 리스트의 각 항목에 사용된 key가 변경되면 해당 컴포넌트가 새로 생성됩니다. |
7. React Strict Mode (개발 환경) | 개발 모드에서만 렌더링을 2번 수행하여 부작용을 감지합니다. (생산 환경에선 한 번만) |
라이프사이클 메서드
리액트(React)의 라이프사이클 메서드(Lifecycle Method)는 컴포넌트가 생성되고, 업데이트되고, 제거되는 과정을 각 단계별로 제어할 수 있도록 제공되는 메서드 또는 훅입니다.
클라우드
IP 주소
IP 주소(Internet Protocol Address)는 컴퓨터 네트워크에서 각 장치(호스트)를 식별하고 통신하기 위해 부여되는 고유한 주소입니다. 마치 실제 주소가 사람이나 건물을 구분하듯, IP 주소는 인터넷이나 로컬 네트워크 상에서 장치 간 위치를 식별하고 데이터 전달 경로를 설정하는 데 사용됩니다.
- IP 주소는 네트워크 상의 장치를 식별하는 논리적 주소
- 인터넷뿐 아니라 내부망(LAN)에서도 사용
- 모든 통신은 IP 주소를 기반으로 이루어짐
클라우드 컴퓨팅
클라우드 컴퓨팅(Cloud Computing)은 인터넷을 통해 서버, 스토리지, 데이터베이스, 네트워크, 소프트웨어 등 IT 리소스를 필요한 만큼 빌려 쓰는 방식입니다. 전통적인 온프레미스(on-premise) 방식과 비교할 때, 비용 절감, 유연성, 확장성 등 여러 이점을 제공합니다.
주요 이점
이점 | 설명 |
비용 절감(Cost Saving) | 하드웨어 구매, 유지보수, 전력, 공간 비용 불필요. 사용한 만큼 지불(pay-as-you-go) |
확장성(Scalability) | 사용량에 따라 서버 자원을 즉시 확장/축소 가능 (수직/수평 확장 모두 가능) |
유연성(Flexibility) | 다양한 서비스와 기술 스택을 조합해 신속한 개발과 배포 가능 |
고가용성(High Availability) | 다수의 데이터 센터를 통한 서비스 연속성 보장, 장애 복구도 빠름 |
속도 및 민첩성(Speed & Agility) | 몇 분 내에 인프라 자원 생성 가능 → 빠른 실험과 개발 주기 |
보안(Security) | 암호화, 접근 제어, 로그 감사 등 고급 보안 기능 제공 (단, 설정 책임은 고객에게 있음) |
글로벌 접근성(Global Reach) | 세계 어디서나 접속 가능, 여러 리전에 리소스 배치 가능 |
자동화 및 관리 효율화 | 자동 스케일링, 모니터링, 백업 등 운영 업무 자동화 가능 |
재해 복구(Disaster Recovery) | 자동 백업 및 복구 기능으로 데이터 유실 최소화 |
친환경성(Eco-friendly) | 효율적인 자원 공유를 통해 에너지 절약 가능 (탄소 배출 절감) |
클라우드 서비스 유형 (서비스 모델)
클라우드 서비스는 제공 방식에 따라 크게 세 가지 유형으로 구분됩니다.
각 유형은 사용자가 얼마나 많은 IT 인프라와 서비스를 직접 관리하느냐에 따라 구분되며, 이를 서비스 모델(Service Model)이라고 부릅니다.
서비스 모델 | 약어 | 의미 | 주요 사용자 대상 |
인프라형 서비스 | IaaS | Infrastructure as a Service | 인프라 직접 운영이 필요한 개발자, 시스템 관리자 |
플랫폼형 서비스 | PaaS | Platform as a Service | 애플리케이션 개발 중심의 개발자 |
소프트웨어형 서비스 | SaaS | Software as a Service | 최종 사용자 (비개발자 포함) |
S3
Amazon S3(Simple Storage Service)는 AWS에서 제공하는 객체 스토리지 서비스로, 데이터를 안전하게 저장하고, 빠르게 접근하며, 고가용성으로 제공하는 서비스입니다.
S3는 단순한 저장소를 넘어 다양한 데이터 관리, 보안, 버전 관리, 웹 호스팅 등 여러 기능을 제공합니다.
기능 구분 | 설명 |
객체 저장(Object Storage) | 파일(객체)을 키(key) 기반으로 저장. 정적 웹 페이지, 이미지, 백업 등 다양한 용도로 사용 가능 |
정적 웹 호스팅(Static Website Hosting) | HTML, CSS, JS 파일을 업로드하면 정적 웹사이트처럼 동작 가능 (index.html, error.html 설정 등) |
버전 관리(Versioning) | 동일한 파일의 변경 이력을 모두 보관. 실수로 덮어쓴 파일도 복원 가능 |
수명 주기 관리(Lifecycle Management) | 오래된 파일을 자동으로 다른 스토리지 클래스(예: Glacier)로 이동하거나 삭제 설정 가능 |
스토리지 클래스 선택(Storage Classes) | 비용과 접근 속도에 따라 다양한 스토리지 클래스 선택 가능 (예: Standard, Infrequent Access, Glacier, Intelligent Tiering 등) |
정책 기반 접근 제어(Access Control) | IAM 정책, 버킷 정책, ACL(Access Control List), S3 퍼블릭 액세스 차단 설정 가능 |
암호화(Encryption) | 저장 시(SSE: Server-Side Encryption), 전송 시 HTTPS로 암호화 지원. KMS 기반 키 관리도 가능 |
이벤트 알림(Event Notification) | 파일 업로드, 삭제 등의 이벤트 발생 시 Lambda, SNS, SQS로 알림 전송 가능 |
S3 객체 잠금(Object Lock) | WORM(Write Once Read Many) 방식으로 객체를 일정 기간 변경/삭제 불가하게 설정 (규제 대응용) |
멀티파트 업로드(Multipart Upload) | 대용량 파일을 여러 파트로 나누어 병렬 업로드하여 성능 향상 및 장애 대응 |
크로스 리전 복제(CRR) | 버킷 간 객체를 다른 리전으로 자동 복제하여 재해 복구나 글로벌 접근성 향상 |
S3 Select / Glacier Select | 전체 파일을 다운로드하지 않고, 저장된 CSV/JSON/Parquet 파일에서 필요한 데이터만 SQL로 추출 가능 |
액세스 로그(Access Logging) | 누가, 언제, 어떤 파일에 접근했는지를 다른 버킷에 로그로 저장 가능 |
Intelligent-Tiering | 사용 패턴에 따라 자동으로 스토리지 클래스 이동 → 비용 최적화 |
Requester Pays | 요청자가 다운로드 요금을 부담하도록 설정 가능 (공공 데이터 공유 등 활용) |
EC2
Amazon EC2 (Elastic Compute Cloud)는 AWS에서 제공하는 가상 서버 인스턴스를 생성하고 실행할 수 있는 핵심 컴퓨팅 서비스입니다. EC2는 단순한 "가상머신" 이상의 유연성과 통제력을 제공하며, 다양한 구성요소를 통해 이를 구현합니다.
구성 요소 | 설명 |
인스턴스 (Instance) | 사용자가 실행하는 가상 서버. CPU, 메모리, 스토리지, 네트워크 성능 등을 선택할 수 있음 |
AMI (Amazon Machine Image) | 인스턴스의 운영체제(OS)와 애플리케이션이 설치된 기초 이미지. 인스턴스 생성 시 기반으로 사용 |
인스턴스 유형 (Instance Type) | 인스턴스의 하드웨어 사양 (예: t3.micro, m5.large). 목적에 따라 컴퓨팅 최적화, 메모리 최적화 등 선택 가능 |
EBS (Elastic Block Store) | 인스턴스에 연결되는 디스크(블록 스토리지). 루트 디바이스 또는 추가 볼륨으로 사용 가능 |
키 페어 (Key Pair) | SSH를 통해 리눅스 인스턴스에 접속하거나 RDP로 윈도우 인스턴스에 접속하기 위한 암호화 키 (개인 키 PEM/PPK) |
보안 그룹 (Security Group) | EC2 인스턴스의 가상 방화벽 역할을 하는 규칙 집합. 인바운드/아웃바운드 트래픽 제어 |
Elastic IP | 고정 퍼블릭 IP 주소. 인스턴스를 재시작해도 IP가 바뀌지 않도록 고정 가능 |
네트워크 인터페이스 (ENI) | EC2 인스턴스가 사용하는 가상 네트워크 카드. 보조 IP, MAC 주소 등 구성 가능 |
User Data | 인스턴스 시작 시 실행할 초기화 스크립트(예: bash 쉘스크립트) 작성 가능 |
Auto Scaling Group (ASG) | 조건에 따라 EC2 인스턴스를 자동으로 생성/제거하여 확장성 확보 |
Launch Template / Launch Configuration | ASG나 EC2 인스턴스를 시작할 때 사용하는 사전 설정 세트 (인스턴스 유형, AMI, 보안 그룹 등) |
Placement Group | 인스턴스를 배치할 전략: Cluster, Spread, Partition 등을 설정하여 고성능/가용성 조절 |
Tenancy 옵션 | 인스턴스를 공유 호스트(default)나 전용 호스트/인스턴스에 배치할지 결정 |
Lifecycle 상태 | EC2 인스턴스는 pending → running → stopping/stopped → terminated 등의 상태를 가짐 |
Lambda
AWS Lambda는 서버를 직접 관리하지 않고도 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스(Serverless Computing)입니다. 즉, 서버를 생성하거나 유지보수하지 않아도 이벤트 기반으로 코드가 자동 실행되며, 사용한 만큼만 비용이 청구됩니다.
Lambda 함수 기본 구조
def lambda_handler(event, context):
# event: 트리거에서 전달된 입력 데이터
# context: 함수 실행 환경 정보
return {
"statusCode": 200,
"body": "Hello, Lambda!"
}
event 매개변수
- Lambda 함수가 실행될 때 트리거에 의해 전달되는 데이터
- 형식은 dict이며, 트리거 종류에 따라 구조가 달라짐
context 매개변수
- AWS가 자동으로 제공하는 객체
- Lambda 함수의 실행 환경 정보 및 메타데이터를 담고 있음
VPC
AWS VPC(Virtual Private Cloud)는 AWS 상에 논리적으로 분리된 가상 네트워크를 생성하고 관리할 수 있는 서비스입니다. VPC를 통해 사용자는 프라이빗 IP 주소, 서브넷, 라우팅, 방화벽, 게이트웨이 등 네트워크 구성 요소를 직접 제어할 수 있습니다.
구성 요소 | 설명 |
VPC | AWS 계정 안에 생성된 논리적 가상 네트워크. IP 대역(CIDR 블록)을 기반으로 구성 |
서브넷(Subnet) | VPC 안에서 IP 대역을 분할한 네트워크 단위. 퍼블릭 서브넷, 프라이빗 서브넷으로 구분 가능 |
라우팅 테이블(Route Table) | 서브넷 간(내부), 또는 인터넷(외부)로 가는 트래픽의 경로를 정의 |
인터넷 게이트웨이(Internet Gateway, IGW) | VPC를 외부 인터넷과 연결하는 구성 요소 (퍼블릭 서브넷 필수) |
NAT 게이트웨이 / NAT 인스턴스 | 프라이빗 서브넷의 인스턴스가 인터넷에 나가도록 허용하지만 들어오는 요청은 차단 |
보안 그룹(Security Group) | 인스턴스 단위로 적용되는 가상 방화벽. 상태 저장(Stateless)이며 인바운드/아웃바운드 규칙 정의 |
네트워크 ACL(Network ACL, NACL) | 서브넷 단위로 작동하는 방화벽. 상태 비저장(Stateless)으로 트래픽에 대해 허용/거부 규칙 설정 |
DHCP 옵션 세트 | VPC 내에서 인스턴스가 자동으로 사용할 DNS, NTP 등의 설정을 지정 |
VPC 피어링(VPC Peering) | 서로 다른 VPC 간에 사설 IP로 통신할 수 있도록 연결 |
VPC 엔드포인트(Endpoint) | 프라이빗 서브넷에서 AWS 서비스(S3, DynamoDB 등)로 연결할 수 있도록 설정 (인터넷 필요 없음) |
VPN 게이트웨이 / 고객 게이트웨이 | 온프레미스 네트워크와 VPC를 VPN으로 연결할 때 사용하는 구성요소 |
Transit Gateway | 여러 VPC 및 온프레미스 네트워크를 중앙 집중식으로 연결하는 허브 역할을 하는 게이트웨이 |
RDS 보안 강화 방법
AWS RDS(Relational Database Service)의 보안을 강화하려면 네트워크, 인증, 암호화, 모니터링, 권한 관리 등 다양한 측면에서 접근해야 합니다. RDS는 기본적으로 관리형 서비스이지만, 설정에 따라 취약할 수 있으므로 사용자가 주의 깊게 보안 설정을 구성해야 합니다.
구분 | 방법 | 설명 |
네트워크 접근 제한 | VPC, 서브넷, 보안 그룹(Security Group) | RDS 인스턴스를 퍼블릭 서브넷에 배치하지 말고, 특정 IP나 인스턴스에서만 접속 가능하게 설정 |
암호화 | 저장(At-Rest) 및 전송(In-Transit) 암호화 | RDS 생성 시 KMS를 이용한 저장 암호화 적용. 클라이언트 연결 시 SSL 사용 권장 |
인증 방식 | IAM 인증 활성화 | 사용자 이름/비밀번호 대신 IAM 사용자/역할 기반 인증 사용 (MySQL, PostgreSQL 지원) |
비밀번호 관리 | 강력한 비밀번호 정책 + 주기적 변경 | 관리자/root 계정은 최소 권한 부여, Secrets Manager와 연동 가능 |
백업 보호 | 스냅샷 암호화 및 백업 자동화 | 자동 백업 및 수동 스냅샷 시 암호화 설정 확인, 백업을 다른 리전에 복제하면 재해 복구 가능 |
감사 및 로깅 | CloudWatch Logs / RDS Enhanced Monitoring / CloudTrail | 쿼리 로그, 오류 로그, 연결 로그 등을 활성화하고 지속적으로 모니터링 |
접근 제어 | IAM 정책 및 DB 사용자 권한 분리 | root, admin 계정 사용 최소화, 필요 최소 권한 원칙 적용 |
멀티 AZ 구성 | 고가용성과 장애 복구 | 장애 시 자동으로 대기 인스턴스로 전환되어 무중단 운영 가능 |
보안 패치 적용 | RDS 자동 패치 적용 설정 | 유지보수 기간 중 보안 패치 자동 적용 (미리 시간 설정 가능) |
퍼블릭 액세스 차단 | Public accessibility 비활성화 | Publicly accessible = false로 설정하여 외부에서 접근 차단 |
RDS Proxy 사용 | 보안 + 연결 효율성 향상 | 인증 정보 보호, DB 연결 풀링 기능 제공 (권장) |
데이터 마스킹 / 권한 필터링 | DB 내부 보안 기능 사용 | 뷰(View), 권한 분리, 데이터 필터링 등을 통해 내부 유출도 방지 |
'수업자료' 카테고리의 다른 글
실습 : 행맨 (0) | 2024.08.04 |
---|---|
실습 : 가위, 바위, 보 게임 (1) | 2024.08.04 |
실습 : 다양한 형태의 피라미드 출력 (0) | 2024.08.04 |
실습 : 주민등록번호를 이용한 나이, 성별 추출 (0) | 2024.08.02 |
실습 : 주문 처리 함수 (0) | 2024.08.01 |
댓글