최근 Supabase를 사용하면서 여러 시행착오를 겪고 있다. 그중 하나가 바로 DB 테이블명 작성인데, 스스로 명확한 원칙이 없다 보니 꽤나 고생을 했다. 그래서 내 나름대로 명확하고 관리하기 쉬운 테이블명 작성 규칙을 정리해 보았다.
왜 테이블명 작성이 중요할까?
알아보기 어렵고, 모호한 테이블명은 나뿐만 아니라 프로젝트에 참여한 모두를 힘들게 한다. 테이블이 조금만 늘어나도, 어떤 데이터가 들어가 있는지를 여러 테이블을 확인해 보고 나서야 알 수 있게 된다. 명확하고 직관적인 이름을 사용한다면 불필요한 소통 비용이 줄어들고 유지보수할 때 큰 도움이 된다.
명확하고 직관적인 이름을 작성하는 법
일관성은 협업과 유지보수의 핵심이다. 테이블명을 작성할 때 데이터의 의미가 직관적으로 드러나야 한다. 예를 들어, 유저 정보를 담는 테이블이라면 users처럼 누구나 이해할 수 있는 이름을 선택한다. 프로젝트 초기에는 테이블명을 가볍게 생각할 수 있지만, 시간이 지나면 명확한 이름의 중요성을 크게 느끼게 된다.
일관된 단수형 또는 복수형으로 짓기
테이블명을 단수형(user) 또는 복수형(users) 중 하나로 일관되게 작성하는 것이 좋다. 일반적으로 복수형을 사용하는 것이 권장되는데, 테이블이 여러 개의 데이터를 담고 있음을 나타내기 때문이다. 하지만 제일 중요한 것은 일관성이다.
필요에 따라 접두사 활용하기
테이블이 많아질수록, 비슷한 기능이나 데이터를 관리하는 테이블을 한눈에 구분하기 어려워진다. 이럴 때 접두사를 적절히 사용하면 도움이 된다. 예를 들어, user_profiles, user_settings, user_logs와 같은 접두사를 사용하면 해당 테이블이 모두 사용자와 관련된 데이터를 다룬다는 것을 직관적으로 알 수 있다.
접두사는 꼭 필요한 경우에만 사용하는 것이 좋다. 불필요한 접두사가 오히려 테이블명을 길고 복잡하게 만들어 가독성을 해칠 수 있다.
언더스코어로 단어 구분하기(스네이크 케이스)
When naming tables, use lowercase and underscores instead of spaces (e.g., table_name, not Table Name). - Supabase docs
Supabase에서도 추천할 만큼, 보통 테이블명이나 컬럼명을 스네이크 케이스로 사용하는 것 같다. 전 회사에서도 백엔드 개발자분이 스네이크 케이스를 사용했던 것 같다. 그만큼 명명은 스네이크 케이스로 하는 것이 관습인가 보다. JS로 개발하다 보니 다른 표기법들도 익숙하긴 하지만, 언더스코어로 구분하니까 확실히 가독성이 높아지는 것 같다.
약어 사용은 지양하기
테이블명에 usr이나 addr과 같은 약어를 사용하면 작성 당시에는 괜찮아 보이지만, 나중에 코드를 읽는 사람에게는 불필요한 혼동을 줄 수 있다. 특히 새로운 팀원이 투입되거나 오랜만에 코드를 읽게 되는 경우, 약어는 코드의 흐름을 방해할 수 있다. 따라서 가능하면 테이블명에 약어를 쓰지 않고 풀네임을 사용하여 의미를 명확하게 전달하는 것이 좋다.
실제로, real chat user info를 r_c_user_info로 줄여서 사용하는 경우를 봤다. 이런 경우에는 혼란이 생길 수 있고, 컬럼들을 직접 확인해 봐야 알 수 있을 것 같다. r_c_user_info보다는 real_chat_users 또는 real_chat_user_profiles처럼 조금 더 구체적으로 작성해도 좋을 것 같다.
이런 몇 가지 원칙을 바탕으로 테이블명을 작성하면 협업 시 불필요한 소통 비용이 줄어들고, 프로젝트가 확장되더라도 체계적으로 관리할 수 있다. 데이터베이스 설계는 프로젝트의 기초를 다지는 작업이므로, 테이블명 작성부터 세심하게 고려하는 습관이 중요하다는 것을 깨달았다.