DB 설계, 정말 어렵죠? 저도 주니어 시절 똑같은 고민을 했습니다. 기획이 바뀔 때마다 DB 구조를 뜯어고치느라 밤새우기 일쑤였죠. 기획자와 티격태격하며 '이런 건 DB 구조상 어렵습니다'라고 말하는 제 모습이 부끄러웠습니다.
하지만 지금은 달라요. 어떤 변경사항이 와도 자신 있게 대처할 수 있습니다. 기획자의 새로운 아이디어에 '네, 가능합니다!'라고 당당히 말할 수 있죠. 그 비결, 정말 간단합니다. 제가 알게 된 이 놀라운 전략, 여러분과 공유하고 싶습니다.
팀 블로그 플랫폼을 개발하는 상황을 상상해봅시다. 처음에는 단순해 보였던 요구사항이 어떻게 복잡해지는지, 그리고 그에 따라 데이터베이스 구조가 어떻게 꼬여가는지 살펴보겠습니다.
기획자: "우리 플랫폼은 팀 블로그 개념으로 가요. 사용자는 가입할 때 반드시 하나의 블로그에 속해야 해요."
개발자: "알겠습니다. user 테이블에 blog_id를 필수 필드로 추가하겠습니다."
(1주일 후)
기획자: "팀원들 간에 권한 차이를 둬야 할 것 같아요. 글쓰기, 편집, 관리 권한 등으로요."
개발자: "음... user 테이블에 permission 필드를 추가하면 되겠네요."
(2주 후)
팀장: "팀원 추방 기능이 꼭 필요해요. 부적절한 행동을 하는 팀원을 내보낼 수 있어야 합니다."
개발자: (당황) "잠깐만요... 그럼 user 테이블의 blog_id를 null로 만들어야 하나요? 그리고 permission은 어떻게 하죠?"
기획자: "맞아요. 추방된 사람은 블로그에서 완전히 나가야 해요. 근데 나중에 다시 초대받을 수도 있어야 해요."
개발자: (식은땀) "그럼 blog_id와 permission을 null로 만들고, 초대받으면 다시 채우는 식으로 해야 할까요? 근데 이러면 사용자 이력 관리가 어려워질 것 같은데..."
팀장: "아! 그리고 추방된 사용자의 기록을 완전히 삭제하지 말고, 언제 추방됐는지, 누가 추방했는지 기록해야 해요. 나중에 문제가 생기면 추적할 수 있어야 하니까요."
기획자: "맞아요. 그리고 추방된 사용자가 작성한 글은 그대로 유지되어야 해요. 단, 추방된 사용자라고 표시가 되어야 합니다."
개발자: (완전히 절망) "잠깐만요... 그럼 user 테이블에 is_banned, banned_at, banned_by, ban_reason 같은 필드들을 추가해야 하나요? 그리고 글 테이블에도 author_status 같은 걸 넣어야 할까요? 이러다가 테이블이 너무 복잡해질 것 같은데..."
팀장과 기획자: (동시에) "네, 그렇게 해주세요! 꼭 필요한 기능이에요."
개발자: (한숨) "..."
이 개발자의 한숨 속에는 수많은 고민과 스트레스가 담겨 있습니다. 머릿속으로는 복잡해지는 데이터베이스 구조가 그려지고, 이를 어떻게 관리해야 할지에 대한 불안감이 엄습합니다. '이대로 가다간 나중에 유지보수가 불가능해질 거야...', '내가 실력이 부족한 걸까?', '애초에 설계를 잘못한 걸까?' 등의 생각이 꼬리에 꼬리를 물며 떠오릅니다.
이런 상황, 어떻게 하면 좋을까요? 다행히 해결책이 있습니다. 바로 다음 섹션에서 알아보겠습니다.
앞서 본 시나리오의 문제점은 무엇일까요? 바로 '관계'를 제대로 설정하지 않은 것입니다. 사용자와 블로그의 관계를 1:1로 설정했기 때문에 모든 문제가 발생했죠.
여기서 우리의 구원자, '다대다(Many-to-Many) 테이블'이 등장합니다.
다대다 테이블을 사용하면 어떻게 될까요? DBML(Database Markup Language)로 표현해보겠습니다.
Table User {
id int [pk, increment]
name varchar [not null]
email varchar [unique, not null]
}
Table Blog {
id int [pk, increment]
name varchar [not null]
description text
}
Table UserBlog {
user_id int [ref: > User.id]
blog_id int [ref: > Blog.id]
role enum('reader', 'writer', 'admin') [not null]
joined_at timestamp [default: `now()`]
banned_at timestamp
banned_by int [ref: > User.id]
ban_reason text
}
이 구조의 장점은 무엇일까요?
이제 기획자가 어떤 요구사항을 던져도 겁내지 않고 "네, 가능합니다!"라고 자신 있게 말할 수 있습니다. 다대다 테이블, 정말 마법 같지 않나요?
이제 기획자가 어떤 요구사항을 던져도 겁내지 않고 "네, 가능합니다!"라고 자신 있게 말할 수 있습니다. 다대다 테이블, 정말 마법 같지 않나요?
그리고 여기서 끝이 아닙니다. 잠시 후, 기획자가 다시 찾아옵니다.
기획자: "아, 그런데 생각해보니 한 사용자가 여러 팀 블로그에 속할 수 있으면 좋겠어요. 예를 들어, 한 사람이 '요리 블로그'와 '여행 블로그'에 동시에 참여할 수 있게요. 가능할까요?"
개발자: (미소) "물론이죠! 이미 그렇게 설계되어 있습니다."
기획자: (놀람) "정말요? 언제 그렇게 준비하신 거예요?"
개발자: "다대다 테이블을 사용했기 때문에, 이미 한 사용자가 여러 블로그에 속할 수 있고, 한 블로그도 여러 사용자를 가질 수 있어요. 새로운 기능을 추가할 필요도 없습니다. 그냥 사용하면 돼요."
기획자: (감탄) "와... 정말 대단하네요! 이렇게 미래를 예측하고 준비하다니!"
개발자: (뿌듯) "네, 유연한 설계의 힘이죠. 앞으로 어떤 변화가 와도 우리는 준비되어 있습니다!"
이처럼 다대다 테이블은 현재의 요구사항뿐만 아니라, 미래의 변화까지도 수용할 수 있는 강력한 도구입니다. 이제 여러분도 이 마법 같은 도구를 사용할 준비가 되셨나요?
지금까지 우리는 유연한 데이터베이스 설계의 중요성과 다대다 테이블 접근법에 대해 알아보았습니다. 이제 이론을 실전에 적용할 차례입니다.
하지만 잠깐, 데이터베이스 설계 도구들이 너무 비싸고 복잡하다고 생각되시나요? 저도 그랬습니다. dbdiagram을 사용하다가 가격 때문에 고민하던 중, 문득 이런 생각이 들었죠.
"이거, 내가 만들면 어떨까?"
그렇게 탄생한 것이 바로 EasyRd입니다. 제 지인과 함께 뚝딱 만들어낸 이 도구는 여러분이 방금 배운 모든 것을 쉽게 실천할 수 있게 도와줍니다.
EasyRd의 주요 특징:
자, 이제 여러분의 차례입니다. EasyRd를 방문해 직접 데이터베이스 설계를 해보세요. 유연하고 확장 가능한 구조를 만들어 미래의 악몽을 예방하세요.
기억하세요, 좋은 데이터베이스 설계는 프로젝트의 성공을 좌우합니다. 이제 여러분은 그 비밀을 알고 있습니다. 그리고 easyrd.dev와 함께라면, 그 비밀을 실천하는 것도 어렵지 않을 거예요.
자, 이제 데이터베이스 설계의 새로운 여정을 시작해볼까요? (easyrd.dev에서 만나요! ㅎㅎ;;)
다대다 테이블에 대한 query 최적화는 어떻게 달성하셨을지 궁금합니다 ㅎ