SQLite 데이터베이스는 무엇일까?
제목 : SQLite 데이터베이스는 무엇일까?
고도화를 위해 NestJS 강의를 들으며 SQLIte 데이터베이스 엔진을 접하게 되었으며,
매우 유명한 RDBMS (Relational Database Management System) 인
MySQL, Oracle 과는 다르다는 것을 알게 되었다.
NestJS 프로젝트에서 TypeORM 라이브러리를 사용하여 간단하게 데이터베이스 연결 예제를 수행하게 되었는데,
이 때 SQLite 를 처음 사용하게 되었다.
내가 든 생각은, Github Actions VM 머신에서 E2E 테스팅을 이용하여 RDBMS 를 모방할 수 있겠다는 생각이었다!
현재 나의 NestJS 예제 디렉토리는 이러하다.
➜ mycv git:(master) ✗ tree -L 1
.
├── README.md
├── db.sqlite # SQLite 의 데이터베이스를 의미
├── dist
├── nest-cli.json
├── node_modules
├── package-lock.json
├── package.json
├── src
├── test
├── tsconfig.build.json
└── tsconfig.json
Nest CLI 를 통해 만든 대부분의 폴더와 비슷할텐데,
중간에 db.sqlite
가 있는 것을 볼 수 있다.
이 파일은 TypeORM 라이브러리에서 단순히
TypeOrmModule.forRoot({
type : "sqlite",
database : 'db.sqlite',
entities : [User, Report],
synchronize : true, // 이건 개발시에만.
})
위의 모듈을 app.module.ts
에 넣어 적용시킨 결과물인 것이다!
그리고, IntelliJ IDEA 에서 자동으로 데이터베이스 스키마 인식을 해주는 것을 알게 되었다.
나는 이러한 생각이 들었다.
XML 형식으로 저장되어 있을까? 아니면 JSON 형식으로 저장되어 있을까?
➜ mycv git:(master) ✗ cat db.sqlite
?j?}QtablereportsreportsCREATE TABLE "reports" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "price" integer NOT NULL)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)??tableusersusersCREATE TABLE "users" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "
확실한 것은, 텍스트 형식으로 출력되도록 유도된 파일은 아니라는 것이었다.
그래서 SQLite 가 뭐지?
우선, 편하게 넓은 지식들을 접하는 것도 좋지만,
공식문서를 통해, 정확한 사실을 통해 지식을 얻기로 했다.
SQLite 공식 사이트 - 클릭하면 새로운 탭으로 이동됩니다
SQLite Home 에서 말하는 것
- SQLite 는
C
언어로 이루어져 있는 라이브러리이다. - 이를 통해 작고, 빠르며, 독립적이고, 높은 신뢰성과, 모든 기능을 갖춘 SQL 데이터베이스 엔진을 만들었다 한다.
- SQLite 는 모든 모바일 폰과, 대부분의 컴퓨터에 내장되어 있다.
- 사람들이 매일 사용하는 어플리케이션들에 기본으로 포함되어 제공된다.
- 그리고 SQLite 는 파일 형식이다.
- SQLite 는 오픈 소스로 열려있는 소스 코드이며, 어떠한 목적으로도 이용 할 수 있다.
- SQLite 는 직접적인 파일시스템 I/O 보다 더 빠를 수 있다.
- 메모리가 더 많을수록 속도가 더 빠르긴 하지만, 적은 메모리 환경에서도 꽤 좋은 성능을 낸다.
- SQLite 는 컴팩트한 라이브러리인데, 사이즈가 750KiB 보다도 작아도 모든 기능이 활성화 된다.
- SQLite 는 2000-05-09 부터 시작된 프로젝트이다.
주니어 개발자가 생각 할 수 있는 SQLite 의 용도?
프로그래밍 언어들과 프레임워크의 용도, 사용법을 배우고 있는 와중,
사실 데이터베이스의 차별점과 특장점을 세세히 구분하여 적용하기는 힘들 수도 있다.
바로 지금의 내 상황이 그러한데,
MySQL 은 굉장히 신뢰성 높고, 유명하기 때문에 사용했다.
MariaDB 는 MySQL 과 거의 엔진이 동일하며, 상업적 용도로 사용할 수 있는 라이선스이기 때문에 사용했다.
만약에 그냥 개발자라면 훑고 지나가도 상관 없다고 생각했다. 그런데, 나의 목표는 엔지니어 이다.
이러한 블로그 글, 혹은 알게 된 지식을 남기는 것이 중요하다는 것을 알게 된 것은 최근이다.
지식을 습득하는 것은 쉽지만, 내 것으로 만들기는 굉장히 어렵다고 생각했기 때문이다.
따라서, 나는 최근 학습과 동시에 모르는 것을 글로 남기기로 결정했다.
따라서 이러한 소제목 "주니어 개발자가 생각 할 수 있는 SQLite 의 용도" 로 글을 작성해본다.
SQLite 는 굉장히 컴팩트하고, 어플리케이션 자체에 내장할 수 있다.
이러한 특성으로, 사용자의 메타데이터를 저장하는 용도로 핸드폰, 컴퓨터에 적용되지 않았을까 추측해 본다.
심지어는 Node 22 버전부터 SQLite 가 내장되기 시작했다. 얼마나 컴팩트하길래..
어떻게 사용할 수 있을까?
1. 로컬 어플리케이션에서 테스팅용으로 사용
로컬 어플리케이션에서 데이터베이스를 접근하기 위해, 직접 MySQL 엔진을 실행하거나,
아니면 Docker 로 데이터베이스 이미지를 띄우는 것 대신,
파일 시스템을 이용하여 편리하게 테스팅이 가능하다고 판단된다.
2. 개인 프로젝트나 팀 프로젝트에서, Github Actions 에 SQLite 를 탑재하여 End-to-End 테스팅 실행
Github Actions 는 특정 브랜치, 혹은 모든 브랜치에 있어 특정 트리거가 걸리면 실행되는 VM 인데,
여기서 내장된 db.sqlite 파일 덕분에 편하게 E2E 테스팅을 진행할 수 있을 것 같다.
3. SQL 데이터베이스 엔진이므로, 결국 RDBMS 처럼 동작하니까, 테이블 스키마 에러 확인용으로 사용
사실, 데이터베이스 자체는 무결성 즉, 신뢰도를 중심으로 움직이므로 자체적으로 에러가 날 확률은 적을 것이다.
여기서 말한 에러는, 나 혹은 팀 전체가 설계한 데이터베이스 스키마가
어플리케이션에서 접근하려는 것과 다르지 않은지 확인 할 수 있을 거라고 생각한다.
실제로 팀 프로젝트를 진행하면서 데이터베이스 때문에 난리난 적이 있었는데,
그건 바로 PK, FK 로 묶여 있는 관계형 테이블에서,
PK 역할을 해줘야 하는 레코드가 삭제되어서 무결성이 붕괴된 것이다.
사실 데이터베이스 엔진 자체는 문제가 없다. PK 역할을 하게 되면, 애초에 삭제할 수가 없다.
그런데, 어플리케이션에서 특정 행동으로 인해 PK 역할의 레코드를 삭제한 것으로 보였다.
심지어 해당 PK 레코드는 홈페이지를 들어오자마자 나타나는 "게시물" 수준의 데이터여서,
데이터 무결성이 터지고, 백엔드는 오류를 쏟으며, 프론트엔드는 메인 페이지를 작성 할 수가 없었다.
이러한 경험에 따라, 테이블 스키마 에러 확인용으로도 괜찮다고 생각한다.
4. 클라우드 컴퓨팅에서 중요한 것 중 하나는 분산된 컴퓨팅 리소스들이(컨테이너들..) 원하는 캐시 데이터 저장
클라우드 컴퓨팅과 DevOps 가 유행인 지금,
Redis 는 분산된 컴퓨팅 리소스들이 필요로 하는 공동의 데이터를 저장해 주었다.
마크다운의 mermaid 로 예시를 들어 보자면,
flowchart TB
subgraph 클라우드
direction TB
Redis("Redis")
Container1("컨테이너 1")
Container2("컨테이너 2")
Container3("컨테이너 3")
Redis <--> Container1
Redis <--> Container2
Redis <--> Container3
Proxy{"프록시"}
Container1 <--> Proxy
Container2 <--> Proxy
Container3 <--> Proxy
end
Proxy <--> Outside-Con("외부 요청")
예를 들어서, 모든 컨테이너는 동일한 어플리케이션 이미지를 실행하고 있다고 가정한다.
이 때, 수많은 연결 요청은 Proxy 를 거치고, 이 요청들은 분산되어 컨테이너 1, 2, 3 에게 간다.
Redis 는 주로 캐시 데이터를 저장한다. 캐시 데이터는 사용자의 세션, 혹은 시스템 데이터를 저장한다고 예시한다.
물론, Redis 는 엄청나게 빠르다. 그리고 임시 데이터를 처리하기 위해 아주 좋은 솔루션을 마련한다.
그리고 많은 타입을 지원한다.
내가 상상한 것은, 이러한 모양새이다.
flowchart TB
subgraph 클라우드
direction TB
subgraph Capsule ["캡슐"]
Application-with-SQLite("SQLite 를 사용하는 어플리케이션")
end
Container1("컨테이너 1")
Container2("컨테이너 2")
Container3("컨테이너 3")
Capsule <--> Container1
Capsule <--> Container2
Capsule <--> Container3
Proxy{"프록시"}
Container1 <--> Proxy
Container2 <--> Proxy
Container3 <--> Proxy
end
Proxy <--> Outside-Con("외부 요청")
여기서 "SQLite 를 사용하는 어플리케이션" 이란,
외부의 요청을 받아 SQLite 의 데이터를 추가 및 삭제할 수 있는
모든 프레임워크를 의미한다.
물론 위의 아키텍쳐대로 설계한다면, Redis 보다는 느리고, 자유도가 떨어질 것이다.
하지만, 캡슐화 된 어플리케이션이 파일 형태로 데이터를 저장하므로,
정해진 형태의 데이터를 저장하고, 삭제할 수 있게도 만들 수 있다고 생각한다.
생각해 보지 않은 말이었는데,
혹시라도 다른 생각이나 아이디어가 있다면, 댓글은 항상 환영한다! - (로봇 빼고)