Welcome to the tech blog of Junior Backend Developer Seulbin Kang!
Project
[Sansam E-commerce] 2. ERD 설계 : 확장성 있는 설계
-
👀 들어가기 전에
프로젝트를 시작할 때마다 공통적으로 해야 하는 작업들이 있다. ERD 작성, 요구사항 정의서, API 명세서 (Swagger), 역할 분배 (R&R) 그리고 Figma를 통한 화면 흐름 파악. 이번 프로젝트에서는 팀장을 맡아 일정과 역할을 분배했고, 프론트 담당자에게는 Figma 기반 화면 설계를 요청했다. 나는 백엔드 관점에서 프로젝트의 "골격"이 되는 작업(ERD / 요구사항 / API 명세 / R&R)을 먼저 단단히 잡는 데에 집중했다.
👀 본론
이번 포스팅은 그중에서도 ERD 설계에 집중해 정리하려 한다.
ERD는 이후 개발 속도/ 확장성 /운영 난이도를 좌우하는 아주 중요한 요소이기 때문에 그만큼 더 집중했고 지속해서 질문을 던졌다.
내가 ERD를 작성하며 계속 던졌던 질문은 아래와 같다.
이 구조는 요구사항이 바뀌어도 버틸 수 있는가?
화면/사용자 흐름을 DB 구조가 자연스럽게 받쳐줄 수 있는가?
조회/정렬/필터링이 늘어났을 때, 쿼리 성능과 확장성은 괜찮은가?
데이터가 커졌을 때, Update/Schema 변경 비용은 감당 가능한가?
그리고 여기서 가장 중요한 전제 하나.
지금은 토이 프로젝트일지 몰라도, 지금부터 하는 과정은 막 사업을 시작한 이커머스 스타트업이다. 즉, 지금부터 하는 하나하나가 다 돈이고 사업의 성패를 결정짓는다. 처음부터 확장성 있는 설계를 전제로 한다.
RDB로 갈 것인가? (그리고 왜 일단 RDB였나)
설계 과정에서 가장 많이 흔들렸던 고민 중 하나는 이거였다.
RDB로 조회를 계속하면 DB가 터질 수 있을텐데...
특히 채팅이나 로그성 데이터는 시시각각 쌓이기 때문에 NoSQL 또는 메시지 기반 구조를 떠올리는 것이 자연스럽다.
다만 당시 멘토링해주시던 강사님의 조언이 너무 명확했다. (지금까지도 너무 감사드립니다.)
RDB도 충분히 성능이 좋다. 일단 RDB로 설계하고 구현해보고 병목이 생기는 지점을 확인해서 하나하나 수정해 나가라.
그래서 모든 도메인을 우선 RDB 기반으로 설계하고, 성능 병목이 실제로 발생하는 지점에서 다음 선택(분리/캐시/NoSQL)을 하기로 했다.