brunch

You can make anything
by writing

C.S.Lewis

by 림스랩 Mar 02. 2023

정규화 담론 : IT 비즈니스 상식

림스랩 기획자 L과 개발자 J의 대화 

우연치 않은 기회로 다른 서비스의 ERD를 볼 일이 있었는데, 가장 먼저 유저 데이터가 어떻게 연결되어 있는지를 확인하는 내 모습을 발견했다. 문득 예전 자사 서비스 초기 기획할 때가 떠올랐다. 기획에 대해 아무것도 모르는 완전 초보 시절, ERD는 커녕 개발이 어떻게 진행되는지도 잘 모르던 때였다.


당시 나는 여러 타입의 유저가 이용할 IT 비즈니스 서비스를 설계하고 있었다. 센터를 운영하는 센터장, 센터에 고용된 센터 직원 그리고 센터를 이용하는 일반 고객 총 3개 타입의 서비스 유저가 있었고, 개발자와 화이트보드에 그림을 그려가며 회의를 했던 기억이 난다.


MY SQL 워크벤치를 통해 데이터를 직접 접하게 되며, 유저 데이터 구조가 내가 생각한 것과 전혀 다른 구조로 이루어져 있다는 것을 깨달았다. 당시 유저 데이터가 하나의 테이블에서 관리되거나 각 타입의 테이블이 분리되어 있을 것이라고 생각했지만 실제로는 그 두 가지 방식을 혼합해서 사용하고 있었다.


User table이 하나인 경우
직책별로 User table을 따로 만들어 table이 3개인 경우
공통 data를 관리하는 User table과 직책별 부가 data를 관리하는 3개의 table이 있는 경우


안 그래도 MY SQL 워크벤치에서 JOIN 문을 이용해서 출력되는 데이터 세트에서는 데이터 수정이 불가능해서 불편을 느끼고 있었기에 왜 굳이 분리해 둔 것인지 늦은 저녁 친한 개발자에게 그 이유를 물어봤다.




나 : 우리 회사 DB는 user table에서 공통 데이터를 관리하고, user type 별 table을 따로 추가로 이용하는데 혹시 이렇게 설계되면 하나의 테이블만 이용하는 것보다 유리한 게 있어?


개발자 J : 유저 데이터가 하나의 테이블에서 관리되는 경우에는 유저 타입 별로 추가되는 칼럼이 있다면 해당하지 않는 유저 타입에 null 값이 많이 생겨요. 이런 방식을 비정규화라고 해요. Null 값이 많이 생기는 것이 싫은 경우에 저는 저렇게 분리해요. 굳이 하나 더 이야기하자면 null 값 하나하나가 작긴 해도 용량(1byte)을 차지하기 때문에 지금보다 용량에 예민했던 옛날에는 이용하지 않았다고 들었어요.


나 : 지금은 용량을 예전보다 크게 신경 쓰지 않아도 되니깐 굳이 분리 안 하고 사용하는 것이 좋지 않아?


개발자 J : 저렇게 분리하는 것을 정규화라고 해요. 중복되는 데이터를 최대한 분리하는 작업이라고 생각하면 편해요. 이렇게 설계되면 각 유저타입 테이블에 id 값이 부여가 되기 때문에 데이터가 많아졌을 때 원하는 데이터를 조금 더 빠르게 보거나 보정할 수 있겠죠.


나 : 단점은 따로 없는거야?


개발자 J : 말씀하신 것처럼 SQL에서 join문을 사용하는 경우 불편할 수 있어요. 그리고 join 문을 이용한 query를 작성하는 경우 성능이 30% 정도 더 든다고 알고 있어요.


(잠시 생각하더니)


개발자 J : 몇 년 전부터 sql에서 쿼리에서도 json 안의 필드 값들을 필터링이 가능해졌는데 주요 데이터만 하나의 테이블에서 관리하고, 부가적인 데이터는 json 칼럼에서 관리하는 개발자도 많아요. 대신 아무 데이터나 집어넣으면 안 되니 약속이 굉장히 중요해요.


User table이 하나지만 json을 이용해 (null)값을 제거했다.


나 : 그렇게 하면 join 문 이용을 최소화할 수 있겠구나. 성능과 운영 측면에서 모두 이득이네?


개발자 J : 그렇죠. json을 이용하는 이유가 join 문을 사용하지 않기 위해서니까요. 한눈에 볼 수는 없지만 입력은 비정규화 문법을 이용하기 때문에 반정규화라고도 부르죠.


나 : 그럼 그냥 칼럼을 여러 개 만드는 것과는 다른 개념인지?


개발자 J : 그렇죠. 데이터마다 필요한 필드만 입력하면 되니 null 값이 생기지 않고, alter가 쉽다는 장점이 있어요.




대화를 길게 풀었지만 결국 핵심은 정규화와 비정규화에 대한 대화였다고 볼 수 있겠다.


간단하게 정규화와 비정규화(반정규화)의 개념에 대해 알아보자면 아래와 같다.


관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다.

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.


그러니까, 그냥 쉽게 말로 풀이하자면


정규화 데이터베이스(Normalized Database)는 중복을 최소화하도록 설계된 데이터베이스이며,

비정규화 데이터베이스(Denormalized Database)는 읽는 시간을 최적화하도록 설계된 데이터베이스로 이해하면 되겠다.


이후에도 json에 대한 추가 질문과 index 등에 대한 질문이 이어졌다. 모든 것을 답변해 준 개발자 J는 자세한 내용은 대기업 SRE 팀에 근무하는 전문가에게 물어보는 것이 정확할 것이라는 찝찝한 말을 하며 사라졌다.


림스랩은 100억 Value의 초기 스타트업 창업 및 운영한 경험을 바탕으로, 다양한 제품 사례와 제품 및 사업 개발 방법론들을 스터디하며 사이드 프로젝트/예비/초기 창업자들의 시행착오를 줄이고자 하는 아티클을 연재하고 있습니다.
작가의 이전글 창업과 사업은 대중 예술이다
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari