1. 데이터베이스 (Database)
데이터 베이스 (Database) 정의
데이터베이스는 여러 사람이 공유하여 사용할 목적으로, 체계적으로 통합하여 관리하는 데이터의 집합. 단순히 데이터를 모아놓은 것을 넘어, 특정 규칙에 따라 구조화 되어 있어 데이터의 검색, 추가, 수정, 삭제가 용이.
데이터 베이스를 사용하는 이유?
- 효율적인 데이터 접근 및 관리 : 특정 조건에 맞는 데이터만 빠르게 찾아오거나 수정할 수 있음. JSON 파일처럼 매번 전체 파일을 읽을 필요가 없음.
- 데이터 무결성 보장 : "학번은 중복될 수 없다", "나이는 숫자여야 한다" 와 같은 규칙을 설정하여 데이터가 항상 정확하고 일관된 상태로 유지되도록 강제할 수 있음.
- 동시성 제어 : 여러 사용자가 동시에 같은 데이터에 접근하여 수정하려고 할 때, 데이터가 꼬이지 않도록 순서를 제어하고 안전하게 처리.
- 데이터 보안 및 복구 : 사용자별로 데이터에 접근할 수 있는 권한을 다르게 설정할 수 있으며, 데이터 손실 시 복구할 수 있는 백업 및 복원 기능을 제공.
데이터베이스의 기본 구조 (관계형 데이터베이스 기준)
가장 널리 사용되는 관계형 데이터베이스는 마치 엑셀 시트처럼, 데이터를 표(Table) 형태로 저장하고 관리.
[예시] `users` 테이블
| id (Primary Key) | name | |
| 1 | 홍길동 | hong@example.com |
| 2 | 이순신 | lee@example.com |
- 테이블 (Table) : 연관된 데이터들의 집합을 담는 표. 위 예제에서는 사용자들의 정보를 담는 `users` 테이블이 있음.
- 열 (Column / Field) : 테이블의 각 속성을 의미. `id`, `name`, `email` 이 각각의 열.
- 행 (Row / Record) : 하나의 완전한 데이터 단위를 의미. '홍길동'의 정보가 담긴 한 줄이 하나의 행.
- 기본 키 (Primary Key, PK) : 각 행을 고유하게 식별할 수 있는 값. `id` 열처럼 절대 중복되지 않는 값을 기본 키로 설정하여, "ID가 2번인 사용자를 찾아줘" 와 같이 데이터를 정확하게 찾아낼 수 있음.
2. DBMS의 종류와 특징
DBMS (Database Management System)는 데이터베이스를 만들고, 관리하고, 사용할 수 있게 해주는 소프트웨어. 즉, 도서관의 '사서'와 '도서 관리 프로그램' 역할을 하는 시스템. DBMS는 크게 관계형과 비관계형(NoSQL)으로 나뉨.
관계형 데이터베이스 (RDBMS)
데이터를 정해진 규칙에 따라 표(Table) 형태로 저장, SQL이라는 언어를 사용해 데이터를 조작. 정형화된 데이터를 다루는 데 매우 효과적.
| 이름 | 특징 및 사용 예 |
| MySQL / MariaDB | 전 세계적으로 가장 널리 사용되는 오픈소스 RDBMS. 웹 애플리케이션 (워드프레스, PHP 기반 사이트 등)에서 압도적인 점유율을 자랑함. |
| PostgreSQL | 오픈소스 RDBMS 중 가장 발전된 기능을 제공하며, 데이터 무결성과 표준 준수를 중요시함. 복잡한 쿼리와 데이터 분석에 강점을 보임. |
| SQLite | 서버가 필요 없는 파일 기반의 경량 데이터베이스. 모바일 앱(안드로이드, iOS)이나 소규모 애플리케이션에 내장하여 사용하기에 적합. (학습용으로 많이 쓰는 DBMS) |
| Oracle | 강력한 성능과 안정성을 갖춘 상용 RDBMS. 대규모 기업의 금융, 전사적 자원 관리(ERP) 등 핵심 시스템에서 주로 사용. |
비관계형 데이터베이스 (NoSQL)
표 형태가 아닌, 더 유연한 방식으로 데이터를 저장. 대용량의 비정형 데이터를 처리하고 수평적으로 확장하기에 용이.
| 이름 | 특징 및 사용 예 |
| MongoDB | JSON과 유사한 문서(Document) 형태로 데이터를 저장. 데이터 구조가 자주 변경되는 서비스나 프로토타이핑에 매우 유리. |
| Redis | 모든 데이터를 메모리에 저장하여 매우 빠른 속도를 자랑하는 Key-Value 저장소. 실시간 랭킹, 캐싱, 세션 관리 등에 특화. |
3. SQL의 정의
SQL (Structured Query Language)은 `구조화된 질의 언어`라는 뜻으로, 관계형 데이터베이스(RDBMS)와 소통하기 위해 만들어진 표준 언어.
SQL은 선언형 언어.
JavaScript 같은 명령형 언어가 "어떻게(HOW)" 작업할지 순서대로 지시하는 반면, SQL 같은 선언형 언어는 "무엇을(What)" 원하는지만 선언. 우리는 "어떤 데이터를 원한다"고 SQL로 선언할 뿐, 그 데이터를 어떻게 찾을지에 대한 구체적인 절차는 똑똑한 데이터베이스 (DBMS)가 알아서 가장 효율적인 방법으로 처리.
SQL을 사용하는 이유
- 표준화된 언어 : SQL은 국제 표준으로 지정되어 있어, 대부분의 관계형 데이터베이스(MySQL, PostgreSQL, SQLite 등)에서 거의 동일한 문법을 사용. 즉, 한 번 배워두면 여러 데이터베이스에서 평생 활용할 수 있는 강력한 기술.
- 데이터 관리에 최적화 : SQL은 처음부터 데이터를 다루기 위해 설계된 언어. 복잡한 조건의 데이터를 검색하거나, 여러 테이블의 데이터를 조합하는 작업을 JavaScript 같은 일반 프로그래밍 언어로 직접 구현하는 것보다 훨씬 간단하고 효율적으로 처리할 수 있음.
- 역할의 분리 : 애플리에킹션의 핵심 로직 (Node.js)과 데이터 처리 로직 (SQL)을 분리할 수 있음. 이를 통해 코드가 더 명확해지고 유지보수가 쉬워짐.
기본적인 SQL의 구조
SQL 구문은 마치 영어 문장처럼, 정해진 순서에 따라 키워드를 조합하여 만듬. 가장 기본이 되는 데이터 조회 ( SELECT ) 구문의 구조는 다음과 같음.
SELECT 조회할_열_이름
FROM 테이블_이름
WHERE 조건;
각 키워드는 다음과 같은 의미를 가짐.
- SELECT : "무엇을" 가져올지 지정. (예: 이름, 이메일)
- FROM : "어디에서" 가져올지 지정. (예: users 테이블)
- WHERE : "어떤 조건으로" 데이터를 필터링할지 지정. (예: 레벨이 10 이상인 사용자)
SQL이 중요한 이유
SQL은 데이터에 접근, 가공, 분석할 수 있는 가장 기본적인 '열쇠'와 같음.
- 백엔드 개발의 필수 기술: 사용자 정보, 상품 목록, 게시글 등 영구적으로 저장해야 하는 모든 데이터는 데이터베이스에 기록되며, 이때 SQL이 사용됨.
- 데이터 분석의 시작: 마케터, 기획자, 데이터 분석가 등 비개발 직군에서도 SQL을 사용하여 직접 데이터를 추출하고 비즈니스 인사이트를 얻는 경우가 점점 늘고 있음.
- 높은 범용성과 안정성: 수십 년간 발전해 온 기술인 만큼 안정적이며, IT 분야 어디에서나 통용되는 핵심 역량으로 인정받음.
SQL을 배운다는 것은 단순히 데이터베이스 기술 하나를 배우는 것을 넘어, 데이터를 이해하고 활용하는 능력을 갖추는 첫걸음.
4. SQLite
SQLite는 별도의 서버 프로그램 없이, 단일 파일에 모든 데이터를 저장하는 매우 가볍고 빠른 파일 기반의 관계형 데이터베이스.
MySQL이나 PostgreSQL이 모든 도시 사람들이 이용하는 거대한 중앙 도서관이라면, SQLite는 필요할 때마다 꺼내 쓰는 개인의 다이어리나 노트와 같음. 별도의 관리인(서버)이 필요 없고, 노트 파일 하나만 있으면 어디서든 내용을 읽고 쓸 수 있음.
장점
- 서버가 필요 없음 (Serverless) : 별도의 데이터베이스 서버를 설치하고 실행할 필요가 없음.
- 간편한 설정 (Zero-configuration) : 사용자 계정, 권한 등 복잡한 설정 과정이 전혀 없음.
- 단일 파일 저장 : 모든 데이터가 .db 확장자를 가진 파일 하나에 저장되어, 백업이나 이동이 매우 간편.
- 엄청나게 가볍다 : 대부분의 스마트폰, 웹 브라우저, 데스크톱 애플레키에션에 기본적으로 내장될 정도로 가볍고 빠름.
단점
- 제한적인 동시성 : 여러 사용자가 동시에 데이터를 '쓰는' 작업이 많은 대규모 웹사이트에는 적합하지 않음.
- 대규모 서비스에는 부적합 : 대용량 데이터 처리나 복잡한 고급 기능 면에서는 전문적인 서버 기반 데이터베이스에 비해 성능이 떨어짐.
SQLite 개발 환경 설정 (Node.js)
Node.js에서 SQLite를 사용하려면, 둘 사이를 연결해 주는 '드라이버' 역할을 하는 sqlite3 패키지가 필요함.
VS Code에서 프로젝트 폴더를 열고 터미널에 아래 명령어를 입력해 패키지 설치.
npm install sqlite3
require('sqlite3').verbose()
sqlite3 패키지를 불러옴. 뒤에 붙은 .verbose()는 '상세 모드'를 활성화하는 것으로, 에러가 발생했을 때 터미널에 더 자세하고 친절한 정보 (어디서 에러가 났는지 등)를 출력해 줌.
new sqlite3.Database(':memory:')
데이터베이스 연결을 생성함. ':memory:' 는 특별한 키워드로, 파일을 만들지 않고 컴퓨터의 메모리(RAM) 상에 임시 데이터베이스를 만들겠다는 의미. 스크립트가 종료되면 데이터도 함께 사라지므로, 간단한 테스트나 실습에 매우 유용.
db.serialize( () => { ... } )
Node.js의 데이터베이스 작업은 기본적으로 비동기로 동작. 즉, INSERT 가 끝나기 전에 SELECT 가 먼저 실행될 수도 있음.
db.serialize() 는 그 안에 있는 코드들이 반드시 순서대로 하나씩 실행되도록 보장해 주는 안정장치.
db.run() vs db.each() vs db.prepare()
SQL 명령의 종류에 따라 적절한 함수를 사용해야 함.
- db.run() : INSERT, UPDATE, DELETE, CREATE 처럼 결과 데이터를 반환받을 필요가 없는 SQL문을 실행할 때 사용.
- db.each() : SELECT 문으로 여러 행의 데이터를 조회할 때 사용. 조회된 데이터 각각의 행에 대해 콜백 함수를 한 번씩 실행.
- db.prepare() 와 stmt.run() : 동일한 SQL문을 여러 번 실행할 때 더 효율적인 방법. prepare 로 SQL문의 '틀'을 미리 준비해두고 (마치 도장처럼), run 으로 값 (잉크)만 바꿔가며 반복적으로 실행. (도장 찍기)
db.close()
모든 데이터베이스 작업이 끝났으면, 연결을 안전하게 종료. 모든 변경사항이 안전하게 처리되도록 보장하고 자원을 해제하는 중요한 과정.
SQLite 개발에 도움되는 프로그램
DB Browser for SQLite 만들어 놓은 .db 파일을 열고 수정 할 수 있음.
- DB Browser for SQLite 공식 사이트에서 프로그램을 다운로드하여 설치.
- Node.js 코드를 실행하여 `.db` 파일이 생성된 것을 확인.
- DB Browser 프로그램을 실행하고, '데이터베이스 열기'를 눌러 생성된 `.db` 파일을 읽음.
- '데이터 보기' 탭으로 이동하면 테이블과 저장된 데이터를 직접 눈으로 확인할 수 있음.
SQL 실습 (Node.js in Windows)
SQLite로 .db 파일 생성하기
const db = new sqlite3.Database('./memos.db');
현재 폴더에 `memos.db`라는 데이터베이스 파일이 생성.
테이블(Table)은 연관된 데이터들을 담기 위해 미리 저의된 '표'.
Column과 자료형
칼럼(Column)은 테이블의 각 '열'을 의미하며, 저장될 데이터의 종류인 자료형 (Data Type) 을 미리 지정해야 함.
마치 엑셀 시트의 각 열에 '이름', '날짜', '숫자' 등 서식을 지정하는 것과 같음.
| SQLite 자료형 | 설명 | 예시 |
| INTEGER | 정수 (소수점 없는 숫자) | 1, 100, -50 |
| TEXT | 문자열 (글자) | "안녕하세요", "메모 제목" |
| REAL | 실수 (소수점 있는 숫자) | 3.14, 99.9 |
| BLOB | 이미지, 동영상 등 파일 자체를 저장 | (지금은 사용하지 않음) |
Primary Key (기본 키)
기본 키(Primary Key)는 테이블의 각 행(row)을 고유하게 식별할 수 있는 '대표 값'.
Foreign Key (외래 키)
외래 키(Foreign Key)는 다른 테이블의 기본 키(Primary Key)를 참조하는 값.
INSERT 사용 시 주의사항 : SQL Injection
SQL문에 직접 값을 넣지 않고 ? (물음표)를 사용하는 것을 '플레이스홀더(Placeholder)'라고 함.
사용자가 입력한 값에 악의적인 SQL 코드가 포함되어 있더라도, 데이터베이스가 이를 명령어로 인식하지 않고 순수한 데이터로만 처리하게 하여 SQLInjection이라는 심삭한 해킹 공격을 방어하는 가장 기본적인 방법. 사용자 입력을 받을 때는 반드시 플레이스 홀더를 사용해야 함.
`SELECT` 결과 다루기: db.get, db.each, db.all 비교
db.get() : 단 하나의 결과만 필요할 때
- 콜백 함수의 인자: (err, row) - `row`는 단일 객체입니다.
- 주요 사용 사례:
- 고유한 `id`로 특정 사용자 한 명의 정보 조회하기
- 특정 조건을 만족하는 데이터가 존재하는지 여부만 확인할 때
db.each() : 각 결과를 하나씩 처리할 때
- 콜백 함수의 인자: (err, row) - `row`는 각 반복마다 다른 행의 정보를 담은 단일 객체입니다.
- 주요 사용 사례:
- 조회된 데이터가 매우 많아 한 번에 메모리에 불러오기 부담스러울 때
- 각각의 데이터에 대해 파일 쓰기, 외부 API 호출 등 개별적인 작업을 바로바로 처리하고 싶을 때
db.all() : 모든 결과를 한 번에 배열로 받을 때
- 콜백 함수의 인자: (err, rows) - `rows`는 모든 결과 행 객체를 담고 있는 배열입니다.
- 주요 사용 사례:
- 조회된 전체 데이터를 API 응답으로 보내야 할 때 (프론트엔드와 통신 시)
- 전체 데이터를 대상으로 정렬, 필터링 등 후속 작업을 하고 싶을 때
- (가장 일반적으로 많이 사용되는 방식입니다)
요약 비교표
| 메서드 | 콜백의 결과 값 | 콜백 실행 횟수 | 주요 사용 사례 |
| db.get() | 객체 하나 (첫 번째 결과) | 최대 1번 | 고유한 데이터 한 개만 필요할 때 |
| db.each() | 객체 하나 (각 결과) | 결과 행의 개수만큼 | 각 결과를 순차적으로 바로 처리 할 때 |
| db.all() | 결과 전체를 담은 배열 하나 | 1번 | 전체 결과를 한 번에 받아 다룰 때 (가장 흔함) |
결과 정렬 및 제한
결과 정렬하기 : `ORDER BY`
SELECT문으로 조회한 결과의 순서를 특정 열(column)을 기준으로 정렬
- ASC: 오름차순으로 정렬합니다. (Ascending, 기본값이라 생략 가능)
- DESC: 내림차순으로 정렬합니다. (Descending)
결과 개수 제한하기 : `LIMIT`
조회된 결과 중에서 처음부터 지정된 개수만큼만 가져 옴. 게시판의 '최신 글 5개' 목록이나 페이지네이션 기능을 구현할 때 필수
다양한 조건으로 검색
패턴 검색 : `LIKE`
문자열 데이터에서 특정 패턴을 포함하는 데이터를 검색할 때 사용. %는 '어떤 문자든, 몇 개든 상관없음'을 의미하는 와일드카드
목록 중 하나와 일치 : `IN`
여러 값 중 하나와 일치하는 데이터를 찾을 때 사용. OR를 여러 번 쓰는 것보다 간결.
데이터 요약 및 그룹화
집계 함수 : `COUNT`, `SUM`, `AVG` 등
데이터를 요약하고 통계를 낼 때 사용하는 함수.
- COUNT() : 행(row)의 개수를 셈. (예 : 총 게시물 수)
- SUM() : 숫자 열의 합계를 구함. (예 : 총 매출)
- AVG() : 숫자 열의 평균을 구함. (예 : 평균 점수)
데이터 그룹화 : `GROUP BY`
특정 열(column)의 값이 같은 데이터끼리 그룹으로 묶어, 각 그룹에 대한 집계 함수의 결과를 계산할 때 사용, '작성자별 메모 개수 구하기'와 같은 통계를 낼 수 있음.
테이블 연결하기 : `JOIN`
관계형 데이터베이스의 꽃이라 불리는 기능, `JOIN`은 여러 테이블에 흩어져 있는 데이터를 공통된 값(주로 Primary Key와 Foreign Key)을 기준으로 연결, 마치 하나의 큰 테이블처럼 보여주는 기능
테이블 구조 변경 및 삭제
테이블 구조 변경 : `ALTER TABLE`
이미 만들어진 테이블에 새로운 열을 추가하거나 기존 열의 타입을 변경하는 등 구조를 수정할 때 사용.
테이블 삭제 : `DROP TABLE`
⚠️ 경고 : 절대 되돌릴 수 없습니다!
DROP TABLE은 테이블의 구조와 그 안의 모든 데이터를 영구적으로 삭제하는 매우 위험한 명령어, 실행하기 전에 반드시 백업을 확인하고, 여러 번 확인하는 습관을 들여야함.
'DB' 카테고리의 다른 글
| SQL 사용법 (0) | 2025.12.10 |
|---|---|
| 데이터 베이스 구조 (0) | 2025.12.10 |
| 쿼리문 명령어 (0) | 2025.12.09 |
| MySQL 설치방법 (0) | 2025.12.09 |
| 로그인 기능 구현 (0) | 2025.11.27 |