[SECTION01. 데이터베이스란 무엇인가?]
| 제품명 | 특징 | 주로 쓰이는 분야 |
|---|---|---|
| MySQL | 무료, 가장 널리 쓰임, 웹 서비스에 최적화 | 일반적인 웹/앱 서비스 백엔드 |
| MariaDB | 완전 무료, 널리 쓰임, 웹 서비스에 최적화 | 일반적인 웹/앱 서비스 백엔드 |
| PostgreSQL | 무료, 기능이 풍부하고 확장성이 좋음 | 복잡한 쿼리, 데이터 분석이 필요한 서비스 |
| Oracle | 유료, 안정성과 성능이 매우 높음 | 은행, 금융권, 대기업 기간계 시스템 |
| H2 | 가볍고 빠름, 별도 설치 불필요 | 개발/테스트용 (실무 운영 DB로는 잘 안 씀) |
데이터 구조가 명확하고, 데이터 간 관계가 중요하고, 정확성(정합성)이 중요한 경우 사용
예: 쇼핑몰 주문 시스템, 게시판, 회원 관리, 결제 시스템
| 종류 | 저장 방식 | 대표 제품 | 주로 쓰이는 분야 |
|---|---|---|---|
| Document(문서형) | JSON과 비슷한 문서 단위로 저장 | MongoDB | 구조가 자주 바뀌는 서비스, 빠른 개발이 필요한 스타트업 |
| Key-Value(키-값) | Key 하나에 Value 하나, 단순 조회가 빠름 | Redis | 캐싱, 세션 저장, 실시간 랭킹 |
| Column-family(컬럼형) | 대용량 데이터를 컬럼 단위로 저장 | Cassandra | 로그 데이터, IoT 센서 데이터 등 초대용량 처리 |
| Graph(그래프형) | 데이터 간 "관계"를 노드/엣지로 저장 | Neo4j | 소셜 네트워크 친구 추천, 추천 알고리즘 |
데이터 구조가 자주 바뀌거나, 정형화되지 않은 데이터를 다루거나, 특정 기능(캐싱, 실시간 처리)에 특화된 저장이 필요한 경우
| 용어 | 비유 | 설명 |
|---|---|---|
| 테이블 (Table) | 엑셀의 시트 (Sheet) | 같은 종류의 데이터를 모아둔 곳 |
| 행 (Row / Record) | 엑셀의 한 줄 | 데이터 하나하나 (예: 회원 1명) |
| 열 (Column / Field) | 엑셀의 세로 칸 | 데이터의 속성 (예: 이름, 나이) |
AUTO_INCREMENT, IDENTITY 등)예시: 게시글은 누가 썼는지 알아야 합니다.
member 테이블:
| id (PK) | name | |
|---|---|---|
| 1 | 홍길동 | hong@test.com |
| 2 | 김철수 | kim@test.com |
board 테이블:
| id (PK) | title | content | member_id (FK) |
|---|---|---|---|
| 1 | 첫 게시글 | 내용입니다 | 1 |
| 2 | 두번째 게시글 | 내용입니다 | 2 |
board.member_id가 member.id를 가리킵니다.
즉 "1번 게시글은 1번 회원(홍길동)이 작성했다" 는 관계가 만들어집니다.
FK를 사용하면 다음과 같은 제약도 자동으로 생깁니다:
member 테이블에 없는 id를 board.member_id에 넣으려 하면 → 에러 (무결성)1. 관계형 DB와 NoSQL의 가장 큰 차이는 무엇인가?

2. 캐싱이 필요한 서비스에는 어떤 종류의 DB가 적합한가?
3. PK와 FK의 차이를 한 문장씩으로 설명해보자.
PK(기본키)는 테이블에서 각 행(레코드)을 서로 중복 없이 유일하게 식별할 수 있도록 지정한 고유한 기준 열입니다.
FK(외래키)는 한 테이블의 열이 다른 테이블의 PK를 참조하도록 연결하여 두 테이블 간의 상호 관계를 맺어주는 열입니다.
4. 게시글 테이블에 작성자의 이름을 직접 저장하지 않고 FK로 연결하는 이유는?
[SECTION02. H2 설치와 테이블 생성 실습]
| 타입 | 설명 | 예시 |
|---|---|---|
| INT | 정수 | 1, 25, 100 |
| BIGINT | 큰 정수 (자동증가 PK에 자주 사용) | 1, 1000000 |
| VARCHAR(n) | 길이가 가변적인 문자열, n은 최대 길이 | '홍길동', 'hong@test.com' |
| TEXT | 길이 제한이 거의 없는 긴 문자열 | 게시글 본문처럼 긴 글 |
| DATE | 날짜만 (연-월-일) | 2026-06-21 |
| TIMESTAMP | 날짜+시간 | 2026-06-21 14:30:00 |
| BOOLEAN | 참/거짓 | TRUE, FALSE |
CREATE TABLE 테이블명 (
컬럼명1 데이터타입 제약조건,
컬럼명2 데이터타입 제약조건,
...
);
| 제약조건 | 의미 |
|---|---|
| PRIMARY KEY | 기본키 지정 |
| NOT NULL | 빈 값을 허용하지 않음 |
| UNIQUE | 중복된 값을 허용하지 않음 |
| AUTO_INCREMENT (H2에서는 보통 IDENTITY 사용) | 값이 자동으로 1씩 증가 |
| DEFAULT 값 | 값을 넣지 않으면 기본값 사용 |
| FOREIGN KEY | 다른 테이블의 PK를 참조 |