오늘은 프로그래밍을 배우면서 항상 궁금했던 질문에 대한 답을 얻었다. “프로그램이 종료되면 데이터는 어디로 가나?”
지금까지는 변수에 데이터를 저장했지만, 프로그램이 끝나면 메모리가 해제되어 모든 데이터가 사라진다. 그렇다면 영속적으로 데이터를 저장하려면? 이게 바로 데이터베이스의 영역이다.
오늘 다룬 범위
- 데이터, 정보, 지식의 차이
- 데이터베이스의 정의와 특징
- DBMS(Database Management System)
- RDBMS와 테이블 구조
- 정규화와 이상(Anomaly) 현상
핵심 개념 정리
데이터 vs 정보 vs 지식
강사님이 가장 먼저 명확히 한 부분이었다.
데이터(Data): 관찰, 측정으로 수집된 실제 값
정보(Information): 데이터를 처리한 결과, 의미를 부여한 것
지식(Knowledge): 정보를 통한 경험, 학습, 이해
예:
- 데이터: “김인템”, “경영학과”, “A”
- 정보: “김인템이라는 학생이 경영학과이고 성적이 A다”
- 지식: “경영학과 학생들의 평균 성적 추이”
데이터베이스는 데이터를 저장하고, 사용자는 그걸 가공해서 정보를 얻는다.
데이터베이스의 특징
데이터베이스는 단순한 파일 저장소와 다르다.
- 독립성: 프로그램과 분리되어 있다
- 무결성: 손상되지 않은 정확한 데이터만 저장
- 보안: 권한이 없으면 접근할 수 없다
- 효율성: 빠른 검색과 처리
DBMS와 RDBMS
처음엔 용어가 많아서 헷갈렸다.
DBMS(Database Management System)
- 데이터베이스를 관리하는 소프트웨어
- 역할: 데이터 저장, 검색, 수정, 삭제(CRUD)
- 종류: MySQL, PostgreSQL, MongoDB, Redis 등
RDBMS(Relational Database Management System)
- 관계형 데이터베이스를 관리하는 시스템
- 데이터를 테이블(행과 열) 형태로 저장
- SQL을 사용해서 데이터를 조작
- 대부분의 기업 시스템에서 사용
테이블 구조
RDBMS의 핵심은 테이블이다.
학생 테이블
┌─────┬──────┬───┬──────┐
│ 학번 │ 이름 │ 학과 │ 성적 │
├─────┼──────┼───┼──────┤
│ 1001│ 김인│ 경영│ A │
│ 1002│ 박민│ CS │ B │
└─────┴──────┴───┴──────┘
행(Row/Record): 하나의 데이터 레코드 (김인 한 명의 정보)
열(Column/Attribute): 특정 속성 (학번, 이름 등)
중요한 개념:
- Primary Key(기본키): 각 행을 고유하게 구분하는 열 (학번)
- Foreign Key(외래키): 다른 테이블의 기본키를 참조 (학과 ID)
정규화와 이상 현상
강사님이 강조한 부분: “테이블을 잘못 설계하면 데이터 중복과 이상 현상이 생긴다”
이상(Anomaly) 현상의 종류
학생-성적 테이블 (잘못된 설계)
┌─────┬──────┬────────┐
│ 학번 │ 이름 │ 과목1점│
├─────┼──────┼────────┤
│ 1001│ 김인 │ 85 │
│ 1001│ 김인 │ 92 │ ← 중복!
└─────┴──────┴────────┘
1. 삽입 이상: 과목을 모르면 학생을 추가 못 함
2. 삭제 이상: 과목 성적을 삭제하면 학생 정보도 함께 삭제됨
3. 수정 이상: 학생 이름을 바꾸려면 중복된 모든 행을 수정해야 함
해결책: 정규화
정규화는 테이블을 분리해서 중복을 제거하는 과정이다.
학생 테이블
┌─────┬──────┐
│ 학번 │ 이름 │
├─────┼──────┤
│ 1001│ 김인 │
└─────┴──────┘
성적 테이블
┌─────┬────────┬────┐
│ 학번 │ 과목명 │ 점수│
├─────┼────────┼────┤
│ 1001│ 수학 │ 85 │
│ 1001│ 영어 │ 92 │
└─────┴────────┴────┘
이제 각 데이터는 한 번만 저장되고, 중복이 없다.
헷갈렸던 점 / 실수 포인트
”정규화가 왜 필요한가?”
처음엔 “한 테이블에 다 넣으면 되지 않나?”라고 생각했다.
하지만 예시를 봤을 때:
- 중복 데이터로 인한 저장 공간 낭비
- 수정할 때 모든 중복을 다 찾아야 하는 번거로움
- 불일치 오류 (A 학생 이름을 한 곳은 “김인”으로, 다른 곳은 “김인템”으로 저장)
“정규화는 선택이 아니라 필수다."
"그럼 항상 완전히 정규화된 테이블을 써야 하나?”
강사님의 흥미로운 대답이었다: “상황에 따라 다르다.”
때론 속도를 위해 의도적으로 정규화를 덜 한다. (반정규화, Denormalization)
예를 들어, 자주 조회되는 통계 데이터는 미리 계산해서 저장하는 게 더 효율적일 수 있다.
하지만 기초는 정규화를 완벽하게 이해하는 것이다.
복습 Q&A
Q. Primary Key와 Foreign Key의 차이?
A.
-
Primary Key (기본키): 이 테이블에서 각 행을 고유하게 구분하는 열
- 예: 학생 테이블의 “학번”
- NULL 값이 없어야 함
- 중복되면 안 됨
-
Foreign Key (외래키): 다른 테이블의 Primary Key를 참조하는 열
- 예: 성적 테이블의 “학번” (학생 테이블의 학번 참조)
- 테이블 간의 관계를 나타낸다
Q. 하나의 Primary Key가 아니라 여러 개의 열을 조합해서 고유성을 나타낼 수도 있나?
A. 그렇다! 이를 **Composite Primary Key(복합 기본키)**라고 한다.
수강신청 테이블
┌─────┬────────┐
│ 학번 │ 과목번│
├─────┼────────┤
│ 1001│ K101 │
│ 1001│ K102 │ ← 학번과 과목번 조합이 고유함
│ 1002│ K101 │
└─────┴────────┘
“같은 학생이 같은 과목을 두 번 수강할 수 없다”는 비즈니스 규칙을 테이블 구조로 표현한 것이다.
Q. NoSQL은 정규화가 필요 없나?
A. 필요 없는 게 아니라 다르게 생각한다.
NoSQL은 문서 기반(예: MongoDB의 JSON)으로 데이터를 저장하기 때문에, 정규화 개념 자체가 다르다.
대신 다른 형태의 최적화를 고려한다.
내일은 NoSQL에 대해 배우니 그때 더 자세히 알 수 있을 것 같다.
한 줄 정리
좋은 데이터베이스 설계는 나중의 유지보수를 결정한다. 테이블을 잘못 설계하면 프로그래밍할 때 수십 배의 고민이 생긴다.
내일은 SQL을 배운다. 오늘 배운 테이블 구조를 가지고, 내일부터 실제로 데이터를 CRUD하는 방법을 배우게 될 것 같다.
Community
Comments
Comments appear immediately. Use report if something needs review.
No comments yet.