테마
04. AWS RDS와 데이터베이스 기초
데이터베이스의 핵심 개념을 이해하고, AWS RDS를 활용하여 클라우드 환경에서 관계형 데이터베이스를 운영하는 방법을 학습한다.
Part 1: 데이터베이스 기초
1. 데이터베이스(Database)란?
데이터베이스는 체계화하여 통합 관리하는 데이터의 집합이다. 단순히 파일에 데이터를 저장하는 것과 근본적으로 다르다.
왜 데이터베이스가 필요한가?
웹 서비스를 운영하면 회원 정보, 게시글, 주문 내역 등 수많은 데이터가 쌓인다. 처음에는 텍스트 파일이나 엑셀로 관리할 수 있지만, 데이터가 수만 건을 넘어가면 한계에 부딪힌다.
| 비교 항목 | 텍스트 파일 | 데이터베이스 |
|---|---|---|
| 데이터 검색 | 파일 전체를 순차적으로 읽어야 한다 | 인덱스(Index)를 활용하여 즉시 검색한다 |
| 동시 접근 | 여러 사용자가 동시에 수정하면 충돌한다 | 트랜잭션(Transaction)으로 안전하게 처리한다 |
| 데이터 무결성 | 잘못된 형식의 데이터도 저장된다 | 스키마와 제약 조건으로 유효성을 검증한다 |
| 관계 표현 | 파일 간 연결이 불가능하다 | 외래 키(Foreign Key)로 테이블 간 관계를 정의한다 |
| 백업/복구 | 수동으로 파일을 복사해야 한다 | 자동 백업, 시점 복구(Point-in-Time Recovery)를 지원한다 |
| 확장성 | 파일이 커질수록 성능이 급격히 저하된다 | 대용량 데이터를 효율적으로 처리한다 |
핵심은 데이터가 많아지면 구조화가 필수라는 점이다. 텍스트 파일 100줄은 메모장으로 충분하지만, 100만 줄은 데이터베이스 없이 관리할 수 없다.
2. RDB (Relational Database, 관계형 데이터베이스)
RDB는 데이터를 행(Row)과 열(Column)로 이루어진 테이블(Table) 형태로 저장하는 데이터베이스다. 1970년 에드거 커드(Edgar F. Codd)가 제안한 관계형 모델에 기반한다.
핵심 개념
| 용어 | 설명 | 예시 |
|---|---|---|
| 스키마(Schema) | 데이터의 구조를 미리 정의하는 설계도 | 회원 테이블에는 이름(문자열), 나이(정수), 이메일(문자열)이 있다 |
| 테이블(Table) | 데이터를 저장하는 2차원 표 | users 테이블, orders 테이블 |
| 필드(Field, Column) | 테이블의 열. 데이터의 속성을 나타낸다 | name, age, email |
| 레코드(Record, Row) | 테이블의 행. 하나의 데이터 항목이다 | ('홍길동', 25, 'hong@test.com') |
| 기본 키(Primary Key) | 각 레코드를 고유하게 식별하는 필드 | id = 1, id = 2 |
| 외래 키(Foreign Key) | 다른 테이블의 기본 키를 참조하는 필드 | orders.user_id -> users.id |
RDB의 특징
- 명확한 스키마(Schema) 기반: 데이터를 저장하기 전에 테이블 구조를 반드시 정의해야 한다. 스키마에 맞지 않는 데이터는 저장이 거부된다.
- ACID 트랜잭션: 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장한다. 은행 송금처럼 "전부 성공하거나 전부 실패"해야 하는 작업에 적합하다.
- SQL 사용: 표준화된 질의 언어(Structured Query Language)로 데이터를 조작한다.
- 정규화(Normalization): 데이터 중복을 최소화하도록 테이블을 분리한다.
RDB 테이블 구조 예시
┌─────────────────────────────────────────────────────┐
│ users 테이블 │
├──────┬──────────┬─────┬────────────────────┤
│ id │ name │ age │ email │ ← 필드(Field)
├──────┼──────────┼─────┼────────────────────┤
│ 1 │ 홍길동 │ 25 │ hong@test.com │ ← 레코드(Record)
│ 2 │ 김철수 │ 30 │ kim@test.com │ ← 레코드(Record)
│ 3 │ 이영희 │ 28 │ lee@test.com │ ← 레코드(Record)
└──────┴──────────┴─────┴────────────────────┘
↑ 기본 키(Primary Key)대표적인 RDB
| 이름 | 특징 |
|---|---|
| MySQL | 오픈소스, 가장 널리 사용되는 RDB. 웹 서비스에 최적화 |
| PostgreSQL | 오픈소스, 고급 기능 풍부. 복잡한 쿼리와 확장성이 뛰어남 |
| Oracle | 상용, 대기업에서 주로 사용. 안정성과 성능이 검증됨 |
| MariaDB | MySQL에서 포크(Fork)된 오픈소스. MySQL과 높은 호환성 |
| MSSQL | Microsoft의 상용 DB. Windows 환경과 .NET 생태계에 최적화 |
3. NoSQL Database (비관계형 데이터베이스)
NoSQL은 "Not Only SQL"의 약자로, RDB의 고정된 스키마 없이 느슨한 구조로 데이터를 저장하는 데이터베이스다.
NoSQL의 특징
- 스키마 없는 유연한 구조: 데이터 형태가 자유롭다. 같은 컬렉션(Collection)에 서로 다른 구조의 문서를 저장할 수 있다.
- 수평 확장(Horizontal Scaling): 서버를 추가하여 처리 능력을 늘리기 쉽다. 빅데이터 환경에 적합하다.
- 높은 쓰기 성능: 대용량 로그, 실시간 데이터 수집에 강하다.
- 최종 일관성(Eventual Consistency): ACID 대신 BASE(Basically Available, Soft state, Eventually consistent) 모델을 사용하는 경우가 많다.
NoSQL 데이터 구조 예시 (JSON 문서형)
json
// 문서 1: 기본 정보만 있음
{
"name": "홍길동",
"age": 25,
"email": "hong@test.com"
}
// 문서 2: 추가 필드가 있어도 같은 컬렉션에 저장 가능
{
"name": "김철수",
"age": 30,
"email": "kim@test.com",
"address": "서울시 강남구",
"hobbies": ["독서", "등산"]
}스키마가 없기 때문에 두 문서의 구조가 달라도 문제 없이 저장된다.
대표적인 NoSQL
| 이름 | 유형 | 특징 |
|---|---|---|
| MongoDB | 문서형(Document) | JSON 기반 문서 저장. 웹 애플리케이션에서 가장 인기 |
| Cassandra | 컬럼형(Column Family) | 대규모 분산 처리. Netflix, Instagram이 사용 |
| HBase | 컬럼형(Column Family) | Hadoop 위에서 동작. 대용량 데이터 분석에 적합 |
| Redis | 키-값(Key-Value) | 메모리 기반. 캐시(Cache)와 세션 저장에 최적화 |
| DynamoDB | 키-값(Key-Value) | AWS 관리형 NoSQL. 서버리스(Serverless) 환경에 적합 |
4. RDB vs NoSQL 비교
선택 기준 요약
| 판단 기준 | RDB 선택 | NoSQL 선택 |
|---|---|---|
| 데이터 구조 | 정형 데이터, 관계가 복잡 | 비정형 데이터, 구조가 자주 변경 |
| 트랜잭션 | 강력한 ACID가 필요 | 최종 일관성으로 충분 |
| 확장 방식 | 수직 확장 (서버 성능 업그레이드) | 수평 확장 (서버 수 증가) |
| 쓰기 패턴 | 읽기/쓰기 균형 | 대량 쓰기가 많음 |
Part 2: AWS RDS (Relational Database Service)
1. RDS란?
AWS RDS(Relational Database Service)는 AWS가 제공하는 관리형 관계형 데이터베이스 서비스다. 사용자가 직접 서버를 구축하고 데이터베이스를 설치할 필요 없이, AWS 콘솔에서 몇 번의 클릭만으로 데이터베이스를 생성하고 운영할 수 있다.
EC2에 직접 DB 설치 vs RDS 사용
EC2 인스턴스에 MySQL을 직접 설치하여 사용할 수도 있다. 하지만 이 경우 모든 관리 책임이 사용자에게 있다.
| 관리 항목 | EC2 직접 설치 | RDS 사용 |
|---|---|---|
| OS 설치/관리 | 사용자가 직접 | AWS가 관리 |
| DB 소프트웨어 설치 | 사용자가 직접 | AWS가 자동 |
| 보안 패치 | 수동으로 적용 | 자동 패치 또는 일정 예약 |
| 버전 업그레이드 | 수동으로 진행 | 콘솔에서 클릭 한 번 |
| 자동 백업 | 직접 cron 작업 설정 | 활성화만 하면 자동 |
| 시점 복구 | 직접 구현 필요 | 최대 35일 내 원하는 시점으로 복구 |
| 장애 대응 | 직접 모니터링 및 대응 | Multi-AZ 배포 시 자동 장애 조치(Failover) |
| 읽기 확장 | 직접 복제 구성 | Read Replica 간편 생성 |
RDS의 핵심 장점을 정리하면 다음과 같다:
- 자동 백업(Automated Backup): 매일 자동으로 스냅샷을 생성하고, 최대 35일까지 보관한다.
- 자동 패치(Automated Patching): 데이터베이스 엔진의 보안 패치를 자동으로 적용한다.
- 버전 업그레이드: 메이저/마이너 버전 업그레이드를 콘솔에서 간편하게 수행한다.
- 시점 복구(Point-in-Time Recovery): 백업 보관 기간 내 원하는 시점으로 데이터베이스를 복구할 수 있다.
RDS가 지원하는 데이터베이스 엔진
| 엔진 | 설명 |
|---|---|
| Amazon Aurora | AWS 자체 개발. MySQL/PostgreSQL 호환. 최대 5배 빠른 성능 |
| MySQL | 가장 대중적인 오픈소스 RDB |
| MariaDB | MySQL 포크. 커뮤니티 기반 |
| PostgreSQL | 고급 기능이 풍부한 오픈소스 RDB |
| Oracle | 엔터프라이즈급 상용 RDB |
| SQL Server | Microsoft의 상용 RDB |
2. RDS 아키텍처
아키텍처 설명:
- 클라이언트: 개발자는 HeidiSQL 같은 DB 관리 도구로, 웹 애플리케이션은 코드에서 직접 RDS 엔드포인트에 접속한다.
- 엔드포인트(Endpoint): RDS가 자동 생성하는 DNS 주소다. IP 주소 대신 이 엔드포인트로 접속한다.
- 보안 그룹(Security Group): 방화벽 역할을 한다. MySQL 기본 포트인 3306을 인바운드 규칙에 추가해야 외부에서 접속할 수 있다.
- 자동 백업: 설정한 시간에 자동으로 스냅샷을 생성하여 S3에 저장한다.
3. RDS로 MySQL 생성 (실습 가이드)
AWS 콘솔에서 RDS MySQL 인스턴스를 생성하는 전체 과정이다.
Step 1: RDS 대시보드 접속
- AWS 콘솔에 로그인한다.
- 서비스 메뉴에서 RDS를 검색하여 접속한다.
- 좌측 메뉴에서 데이터베이스 클릭 후 데이터베이스 생성 버튼을 누른다.
Step 2: 데이터베이스 엔진 선택
| 설정 항목 | 값 |
|---|---|
| 데이터베이스 생성 방식 | 표준 생성 |
| 엔진 유형 | MySQL |
| 에디션 | MySQL Community |
| 엔진 버전 | 기본값 사용 (최신 안정 버전) |
| 템플릿 | 프리 티어(Free Tier) 선택 |
중요: 프리 티어(Free Tier) 템플릿을 선택해도 계정 생성일, 플랜, 리전, 엔진, 인스턴스 클래스에 따라 과금 조건이 달라질 수 있다. 콘솔의 Free Tier eligible 표시와 Billing 대시보드를 함께 확인한다.
Step 3: 인스턴스 설정
| 설정 항목 | 값 | 설명 |
|---|---|---|
| DB 인스턴스 식별자 | my-first-rds | RDS 인스턴스의 이름 |
| 마스터 사용자 이름 | admin | DB 관리자 계정 |
| 마스터 비밀번호 | (직접 설정) | 최소 8자, 영문+숫자 조합 권장 |
| DB 인스턴스 클래스 | Free Tier eligible 표시가 있는 클래스 | 계정 조건에 따라 달라질 수 있음 |
| 스토리지 유형 | 범용 SSD | 기본값 사용 |
| 할당된 스토리지 | 20 GiB | 프리 티어 기본값 |
Step 4: 연결(Connectivity) 설정
이 단계가 가장 중요하다. 외부에서 RDS에 접속하려면 올바른 네트워크 설정이 필수다.
| 설정 항목 | 값 | 설명 |
|---|---|---|
| VPC | Default VPC | 기본 VPC 사용 |
| 퍼블릭 액세스 | 예(Yes) | 외부 인터넷에서 접속 가능하도록 설정 |
| VPC 보안 그룹 | 새 보안 그룹 생성 또는 기존 선택 | 인바운드 규칙 설정 필요 |
주의: 학습 목적으로 퍼블릭 액세스(Public Access)를 활성화한다. 실제 운영 환경에서는 퍼블릭 액세스를 비활성화하고, 같은 VPC 내의 EC2에서만 접속하도록 구성하는 것이 보안상 안전하다.
Step 5: 보안 그룹 인바운드 규칙 설정
RDS가 생성된 후, 보안 그룹의 인바운드 규칙을 편집한다.
| 유형 | 프로토콜 | 포트 범위 | 소스 |
|---|---|---|---|
| MYSQL/Aurora | TCP | 3306 | 0.0.0.0/0 (모든 IP 허용) |
보안 경고:
0.0.0.0/0은 모든 IP에서의 접속을 허용하는 설정이다. 학습용으로만 사용하고, 실제 운영에서는 특정 IP 또는 보안 그룹만 허용해야 한다.
Step 6: HeidiSQL로 접속
RDS 인스턴스가 생성되면(약 5~10분 소요), RDS 대시보드에서 엔드포인트(Endpoint) 를 확인한다.
HeidiSQL 접속 설정:
| 항목 | 값 |
|---|---|
| 네트워크 유형 | MySQL (TCP/IP) |
| 호스트명 | RDS 엔드포인트 주소 (예: my-first-rds.xxxx.ap-northeast-2.rds.amazonaws.com) |
| 사용자 | admin |
| 비밀번호 | RDS 생성 시 설정한 비밀번호 |
| 포트 | 3306 |
"열기" 버튼을 클릭하여 정상 접속되면 RDS MySQL 생성이 완료된 것이다. 이제 SQL 명령어로 데이터를 관리할 수 있다.
4. 스냅샷(Snapshot) 기능
스냅샷은 특정 시점의 데이터베이스 전체 상태를 캡처하여 백업하는 기능이다. 마치 게임의 세이브 포인트와 같다.
스냅샷의 종류
| 종류 | 설명 |
|---|---|
| 자동 스냅샷 | RDS가 설정된 백업 윈도우 시간에 매일 자동 생성. 보관 기간(1~35일) 설정 가능 |
| 수동 스냅샷 | 사용자가 원하는 시점에 직접 생성. 명시적으로 삭제할 때까지 보관 |
스냅샷 생성 방법
- RDS 대시보드에서 데이터베이스 인스턴스를 선택한다.
- 작업(Actions) 메뉴에서 스냅샷 생성(Take Snapshot) 을 클릭한다.
- 스냅샷 이름을 입력하고 생성 버튼을 누른다. (예:
my-first-rds-snapshot-20260329)
스냅샷에서 복원
스냅샷에서 복원하면 기존 RDS를 덮어쓰는 것이 아니라 새로운 RDS 인스턴스가 생성된다. 이 점이 매우 중요하다.
- 좌측 메뉴에서 스냅샷 클릭.
- 복원할 스냅샷을 선택하고 스냅샷 복원(Restore Snapshot) 클릭.
- 새 RDS 인스턴스의 식별자를 입력한다. (예:
my-first-rds-restored) - 인스턴스 클래스, 보안 그룹 등을 설정하고 생성한다.
- 새 인스턴스가 생성되면 새로운 엔드포인트가 부여된다.
스냅샷 활용 시나리오: 패치 전 안전망
데이터베이스 패치나 대규모 변경 작업 전에 스냅샷을 생성해두면, 문제가 발생했을 때 안전하게 롤백할 수 있다.
흐름 설명:
- 패치 전 스냅샷 생성: 현재 상태를 백업한다.
- 패치 적용: 데이터베이스 엔진을 업그레이드하거나 변경 사항을 적용한다.
- 성공 시: 정상 동작이 확인되면 스냅샷을 삭제하여 비용을 절감한다.
- 실패 시: 스냅샷에서 복원하여 새 RDS 인스턴스를 생성한다.
- 엔드포인트 전환: 애플리케이션의 DB 접속 주소를 새 인스턴스의 엔드포인트로 변경한다.
Part 3: SQL CRUD 기초
1. SQL이란?
SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터를 정의, 조작, 제어하기 위한 표준 질의 언어다. 1970년대 IBM에서 개발되었으며, 현재 거의 모든 RDB에서 공통으로 사용한다.
SQL은 크게 세 가지 범주로 나뉜다:
| 범주 | 약자 | 설명 | 대표 명령어 |
|---|---|---|---|
| 데이터 정의어 | DDL (Data Definition Language) | 데이터 구조를 정의 | CREATE, ALTER, DROP |
| 데이터 조작어 | DML (Data Manipulation Language) | 데이터를 조회/삽입/수정/삭제 | SELECT, INSERT, UPDATE, DELETE |
| 데이터 제어어 | DCL (Data Control Language) | 접근 권한을 관리 | GRANT, REVOKE |
2. CRUD 개념
CRUD는 데이터를 다루는 4가지 기본 동작을 나타내는 약자다. 거의 모든 애플리케이션은 이 네 가지 동작의 조합으로 구성된다.
| 동작 | 의미 | SQL 명령어 | HTTP 메서드 |
|---|---|---|---|
| Create | 생성 (새 데이터 삽입) | INSERT | POST |
| Read | 읽기 (데이터 조회) | SELECT | GET |
| Update | 수정 (기존 데이터 변경) | UPDATE | PUT / PATCH |
| Delete | 삭제 (데이터 제거) | DELETE | DELETE |
3. 데이터베이스 관리 명령어
HeidiSQL이나 MySQL CLI에 접속한 후 실행하는 기본 명령어들이다.
데이터베이스 생성
sql
-- 새 데이터베이스 생성
CREATE DATABASE my_shop;my_shop이라는 이름의 데이터베이스가 생성된다. 데이터베이스는 여러 테이블을 담는 컨테이너 역할을 한다.
데이터베이스 목록 조회
sql
-- 현재 서버의 모든 데이터베이스 목록 출력
SHOW DATABASES;실행 결과 예시:
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_shop |
| mysql |
| performance_schema |
| sys |
+--------------------+information_schema, mysql, performance_schema, sys는 MySQL이 내부적으로 사용하는 시스템 데이터베이스다. 직접 수정하지 않는다.
데이터베이스 선택 (사용)
sql
-- 작업할 데이터베이스 선택
USE my_shop;이후 실행하는 모든 SQL 명령은 my_shop 데이터베이스 내에서 동작한다.
데이터베이스 삭제
sql
-- 데이터베이스 삭제 (내부 모든 테이블과 데이터가 함께 삭제됨)
DROP DATABASE my_shop;주의:
DROP DATABASE는 되돌릴 수 없다. 실행 전에 반드시 대상 데이터베이스를 확인해야 한다.
4. 테이블 관리 명령어
테이블 생성
sql
-- users 테이블 생성
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
age INT NOT NULL,
email VARCHAR(200) NOT NULL,
PRIMARY KEY (id)
);각 키워드의 의미:
| 키워드 | 설명 |
|---|---|
INT | 정수형 데이터 타입 |
VARCHAR(100) | 최대 100자의 가변 길이 문자열 |
NOT NULL | 이 필드는 반드시 값이 있어야 한다 (빈 값 불가) |
AUTO_INCREMENT | 새 레코드 삽입 시 자동으로 1씩 증가하는 고유 번호 |
PRIMARY KEY (id) | id 필드를 기본 키로 지정. 모든 레코드를 고유하게 식별 |
주요 데이터 타입
| 데이터 타입 | 설명 | 예시 |
|---|---|---|
INT | 정수 | 1, 25, -100 |
BIGINT | 큰 정수 | 9999999999 |
FLOAT / DOUBLE | 소수 | 3.14, 99.99 |
VARCHAR(n) | 가변 길이 문자열 (최대 n자) | 'hello', '홍길동' |
TEXT | 긴 문자열 (최대 65,535자) | 게시글 본문 |
DATE | 날짜 | '2026-03-29' |
DATETIME | 날짜와 시간 | '2026-03-29 14:30:00' |
BOOLEAN | 참/거짓 | TRUE, FALSE |
테이블 목록 조회
sql
-- 현재 데이터베이스의 모든 테이블 목록 출력
SHOW TABLES;실행 결과 예시:
+-------------------+
| Tables_in_my_shop |
+-------------------+
| users |
+-------------------+테이블 구조 확인
sql
-- users 테이블의 구조(필드, 타입, 제약 조건) 확인
DESC users;실행 결과 예시:
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| age | int | NO | | NULL | |
| email | varchar(200) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+테이블 삭제
sql
-- users 테이블 삭제 (내부 모든 데이터가 함께 삭제됨)
DROP TABLE users;5. 레코드 CRUD (데이터 조작)
CREATE: 데이터 삽입 (INSERT)
sql
-- 단일 레코드 삽입
INSERT INTO users (name, age, email) VALUES ('홍길동', 25, 'hong@test.com');
-- 여러 레코드 한 번에 삽입
INSERT INTO users (name, age, email) VALUES
('김철수', 30, 'kim@test.com'),
('이영희', 28, 'lee@test.com'),
('박민수', 22, 'park@test.com');id 필드는 AUTO_INCREMENT로 설정했으므로 직접 입력하지 않아도 자동으로 1, 2, 3, 4가 할당된다.
READ: 데이터 조회 (SELECT)
sql
-- 모든 레코드 조회
SELECT * FROM users;실행 결과:
+----+--------+-----+----------------+
| id | name | age | email |
+----+--------+-----+----------------+
| 1 | 홍길동 | 25 | hong@test.com |
| 2 | 김철수 | 30 | kim@test.com |
| 3 | 이영희 | 28 | lee@test.com |
| 4 | 박민수 | 22 | park@test.com |
+----+--------+-----+----------------+sql
-- 조건부 조회: 나이가 25 이상인 사용자
SELECT * FROM users WHERE age >= 25;실행 결과:
+----+--------+-----+----------------+
| id | name | age | email |
+----+--------+-----+----------------+
| 1 | 홍길동 | 25 | hong@test.com |
| 2 | 김철수 | 30 | kim@test.com |
| 3 | 이영희 | 28 | lee@test.com |
+----+--------+-----+----------------+sql
-- 특정 필드만 조회
SELECT name, email FROM users WHERE age >= 25;실행 결과:
+--------+----------------+
| name | email |
+--------+----------------+
| 홍길동 | hong@test.com |
| 김철수 | kim@test.com |
| 이영희 | lee@test.com |
+--------+----------------+sql
-- 정렬: 나이 내림차순
SELECT * FROM users ORDER BY age DESC;
-- 개수 제한: 상위 2개만 조회
SELECT * FROM users ORDER BY age DESC LIMIT 2;UPDATE: 데이터 수정
sql
-- id가 1인 사용자의 나이를 26으로 변경
UPDATE users SET age = 26 WHERE id = 1;중요:
WHERE절을 생략하면 테이블의 모든 레코드가 수정된다. 반드시 조건을 지정해야 한다.
sql
-- 여러 필드 동시 수정
UPDATE users SET age = 31, email = 'kim_new@test.com' WHERE id = 2;DELETE: 데이터 삭제
sql
-- id가 4인 사용자 삭제
DELETE FROM users WHERE id = 4;중요:
UPDATE와 마찬가지로,WHERE절을 생략하면 테이블의 모든 레코드가 삭제된다. 복구할 수 없으므로 반드시 조건을 확인해야 한다.
sql
-- 조건부 삭제: 나이가 30 이상인 사용자 삭제
DELETE FROM users WHERE age >= 30;CRUD 명령어 요약
| 동작 | SQL 구문 | 핵심 주의 사항 |
|---|---|---|
| 삽입 | INSERT INTO 테이블명 (필드1, 필드2) VALUES (값1, 값2); | AUTO_INCREMENT 필드는 생략 가능 |
| 조회 | SELECT 필드 FROM 테이블명 WHERE 조건; | *는 모든 필드, WHERE 생략 시 전체 조회 |
| 수정 | UPDATE 테이블명 SET 필드=값 WHERE 조건; | WHERE 절 필수 (생략 시 전체 수정) |
| 삭제 | DELETE FROM 테이블명 WHERE 조건; | WHERE 절 필수 (생략 시 전체 삭제) |
비용 주의 사항
AWS RDS는 실행 중인 시간에 따라 요금이 부과된다. 학습 후 반드시 리소스를 정리해야 예상치 못한 비용이 발생하지 않는다.
비용이 발생하는 항목
| 항목 | 과금 기준 | 비고 |
|---|---|---|
| RDS 인스턴스 | 실행 시간당 | db.t2.micro는 프리 티어에서 월 750시간 무료 |
| 스토리지 | 할당된 용량(GB)당 | 프리 티어에서 20GB까지 무료 |
| 스냅샷 | 보관 중인 스냅샷 용량(GB)당 | 자동 백업은 보관 기간 내 무료, 수동 스냅샷은 과금 |
| 데이터 전송 | 아웃바운드 트래픽(GB)당 | 인바운드는 무료, 아웃바운드는 일정량 초과 시 과금 |
비용 절감 팁
- 학습 후 RDS 인스턴스 삭제: 사용하지 않는 RDS는 즉시 삭제한다.
- 삭제 시 최종 스냅샷 활용: RDS 삭제 시 "최종 스냅샷 생성(Create final snapshot)" 옵션을 선택하면, 나중에 스냅샷에서 복원하여 다시 사용할 수 있다. 스냅샷 보관 비용은 인스턴스 실행 비용보다 훨씬 저렴하다.
- 불필요한 수동 스냅샷 삭제: 더 이상 필요 없는 스냅샷은 삭제하여 비용을 절감한다.
- 프리 티어 한도 모니터링: AWS Billing 대시보드에서 프리 티어 사용량을 주기적으로 확인한다.
RDS 인스턴스 삭제 방법
- RDS 대시보드에서 삭제할 인스턴스를 선택한다.
- 작업(Actions) > 삭제(Delete) 를 클릭한다.
- 최종 스냅샷 생성 여부를 선택한다 (나중에 복원할 계획이 있다면 "예").
- 삭제 방지(Deletion Protection) 가 활성화되어 있다면 먼저 비활성화한다.
- 확인 문구를 입력하고 삭제를 진행한다.
핵심 정리
| 주제 | 핵심 내용 |
|---|---|
| 데이터베이스 | 체계화하여 통합 관리하는 데이터의 집합. 데이터가 많아지면 구조화가 필수 |
| RDB | 명확한 스키마 기반, 테이블 구조, ACID 트랜잭션. MySQL, PostgreSQL 등 |
| NoSQL | 스키마 없는 유연한 구조, 수평 확장. MongoDB, Cassandra 등 |
| AWS RDS | 관리형 RDB 서비스. 자동 백업, 패치, 시점 복구 지원 |
| 스냅샷 | 특정 시점의 DB 상태를 백업. 복원 시 새 인스턴스가 생성됨 |
| SQL CRUD | INSERT(생성), SELECT(조회), UPDATE(수정), DELETE(삭제). WHERE 절이 핵심 |
| 비용 | 인스턴스 실행 시간, 스냅샷 보관에 과금. 학습 후 반드시 리소스 정리 |