데이터베이스는 거대한 ‘서랍장’이다: Rails로 기억을 저장하고 꺼내보는 경험
우리가 처음 웹서비스를 만들 때 가장 혼란스러운 개념이 있다.
“내가 입력한 정보는… 도대체 어디에 저장되는 걸까?”
DB를 이해하려면 거창한 개념이 필요하지 않다.
DB는 단순히 ‘정확하게 정리된 서랍장’이다.
서랍장은 테이블(table)
하나의 서랍은 레코드(record)
서랍 안의 칸들은 컬럼(column)
서랍장의 종류(Post, User 등)는 모델(model)
서랍을 여닫는 동작이 쿼리(query)
이 비유만 잡히면
DB는 더 이상 어려운 존재가 아니라
손끝으로 이해되는, 아주 물리적인 개념이 된다.
이제 Rails로 직접 만들어보자.
Part 1. “서랍장(Post 테이블)” 만들기
터미널에서:
rails generate model Post title:string body:text
rails db:migrate
이 명령은 이렇게 말하는 것과 같다.
“Post라는 이름의 서랍장을 하나 만들 거야.
서랍장 안에는 두 개의 칸을 만들어줄래?
하나는 title(제목 칸),
하나는 body(내용 칸).”
Rails는 이 명령을 받아
DB라는 큰 방 안에 새로운 서랍장(Post 테이블)을 설치한다.
그 서랍장의 각 서랍(레코드)에는
항상 title과 body라는 고정된 두 칸이 있게 된다.
이제 저장할 준비가 끝났다.
Part 2. “서랍(레코드)” 하나 만들어 서랍장에 넣어보자
Rails console로 들어가자.
rails console
그리고 아래 코드로
서랍(Post 하나) 를 만들어 서랍장에 넣는다.
Post.create(title: "첫 글", body: "DB 서랍장에 저장되었다!")
여기서 일어나는 일:
Post 서랍장 안에
title칸에는 "첫 글"
body칸에는 "DB 서랍장에 저장되었다!"
라는 내용으로
새로운 서랍(레코드)이 추가된다.
이 서랍은 이제 절대 사라지지 않는다.
서버를 껐다 켜도 그대로 남아 있다.
바로 이것이 DB가 “웹의 기억”인 이유다.
Part 3. “서랍장 열어보기”:
저장된 서랍을 꺼내보자
Post.all
Rails는 DB에게 이렇게 말한다.
“Post 서랍장, 거기 있는 모든 서랍 좀 꺼내줘.”
그러면 DB는 정확히 우리가 넣은 서랍들을 보여준다.
이게 바로
‘절대 잊어버리지 않는 공간’의 힘이다.
Part 4. “선반의 구조를 자동으로 정리해주는 지능형 서랍장”
Post.first로 하나를 꺼내서 확인해보자.
post = Post.first
post.id
post.created_at
post.updated_at
DB는 서랍을 넣을 때 자동으로:
id(서랍 번호)
created_at(언제 넣었는지)
updated_at(언제 수정했는지)
이런 메타 정보까지 정리해서 저장한다.
이건 단지 서랍장이 아니라
정교하게 정리되는 스마트 서랍장이다.
Part 5. “사람이 수천 개 서랍을 뒤질 필요가 없다”
DB는 초고속 사서처럼 즉시 찾아준다
예를 들어
제목이 “첫 글”인 서랍만 찾고 싶다면:
Post.where(title: "첫 글")
이 한 줄이면
DB는 수천 개 중에서도
딱 맞는 서랍만 꺼내준다.
마치 “사서”가 서랍 번호, 위치, 속성을
즉시 파악하는 것처럼 말이다.
이러한 빠른 검색 기능 때문에
DB는 웹서비스의 속도와 정확성을 담당한다.
Part 6. “서랍과 서랍을 연결하는 지적 네트워크”
댓글(Comment)을 Post 서랍장과 연결해보자
다음 명령을 입력하자.
rails generate model Comment body:text post:references
rails db:migrate
이 말은 이렇게 해석할 수 있다.
“댓글(Comment)을 저장할 서랍장도 하나 만들어줘.
서랍 안에는 ‘body’라는 칸이 있고,
그리고 이 서랍(Comment)이 어느 Post 서랍에 속하는지도 기억해줘.”
Rails는
Comment 서랍장에 자동으로 post_id라는 칸을 만들어
“이 서랍은 저 Post 서랍에 속해요”
라고 연결 정보를 저장한다.
이건 마치
서랍 옆면에
“이 서랍은 Post #1에 귀속됨”
이라는 스티커를 붙여두는 것과 같다.
Part 7. Rails에게 관계를 알려주자
app/models/post.rb
class Post < ApplicationRecord
has_many :comments
end
app/models/comment.rb
class Comment < ApplicationRecord
belongs_to :post
end
Rails에게 이렇게 말하는 것과 같다.
“Post 서랍장은 Comment 서랍을 여러 개 품을 수 있어.”
“Comment 서랍은 반드시 Post 서랍에 속해 있어야 해.”
이제 DB는
서랍들과 서랍들 간의 관계(relationship) 를 알고 있다.
이 구조가 바로
웹서비스를 구성하는 지적 네트워크다.
Part 8. 실제로 데이터를 연결해보자
console에서:
post = Post.first
post.comments.create(body: "이 글 재밌다!")
post.comments.create(body: "두 번째 댓글!")
그리고 댓글을 꺼내보자.
post.comments
출력 결과에는
방금 만든 댓글 두 개가 담겨 있다.
이걸 보고 당신은 깨닫는다.
DB는 단지 저장하는 곳이 아니라
서로 다른 정보들을 연결하여
하나의 지적 네트워크를 만들고 있다는 사실을.
이 연결성 때문에
웹서비스는 “유기체”처럼 작동한다.
Part 9. 이제 당신은 DB가 왜
‘웹서비스의 심장’인지 느꼈다
지금까지 직접 따라 하면서
당신은 DB의 본질을 정확하게 체험했다.
웹서비스의 기억
→ 데이터를 저장하고 다시 꺼낼 수 있다.
절대 잊어버리지 않는 공간
→ 재시작해도 Post와 Comment는 그대로 남아 있다.
정교하게 정리된 서랍장
→ 구조화된 칸, 자동 정리되는 메타정보(id, timestamps)
수백만 건도 즉시 찾는 사서
→ where 조건으로 바로 검색 가능
서로 연결된 지적 네트워크
→ Post ↔ Comment 관계 설정
웹서비스의 심장
→ 저장 + 검색 + 관계 = 웹의 모든 기능
이 모든 걸
당신은 이제 직접 만들고 다룰 수 있다.
그리고 독자의 마음에는 다음 생각이 싹트기 시작한다
“잠깐만… 나 진짜 웹서비스 만들 수 있는 사람 아닌가?”
“나만의 블로그 만들 수도 있겠는데?”
“친구들이랑 같이 쓸 TODO 서비스 만들어볼까?”
“내가 입력한 데이터가 저장되고, 연결되고, 불러와지는 게 이해돼!”
이각성(覺醒)의 순간을 지나면
웹은 더 이상 “사용하는 세계”가 아니다.
웹은 당신이 만들어내는 세계가 된다.