본문 바로가기
수업자료

요약 정리

by ^..^v 2025. 6. 30.
728x90
반응형

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), 권한 분리, 데이터 필터링 등을 통해 내부 유출도 방지


728x90
반응형

댓글