우린 데이터 모델링 과정을 토대로
데이터베이스를 구축하는 능력을 얻었다.
정말 신기하고 설레지 않나?
우리도 이제,
일상에 가치를 제공하는 서비스의 데이터베이스를 구축해
그 가치들을 직접 실현할 수 있는 능력을 지니게 되었다.
마음만 먹으면,
우리도 세상 사람들의 삶을 위한 서비스를 제작할 수 있는 능력을 얻은 셈이다.
잠시 멈추고,
우리가 배웠던 것들에 대해 위대함을 느껴보자.
포스팅 목적
이번 포스팅에선,
조금의 욕심을 더 부린, 데이터베이스에 대해서 포스팅해보려 한다.
우리 서비스가 10만명 유저가 있다고 가정하자.
이때 데이터베이스는 하나로, 10만명의 유저 이벤트에 대해서 처리해야 된다.
어떨거 같나?
데이터베이스 오직 하나로
수만명의 요구사항을 모두 받아주기란
유저 한명한명의 처리에서 신속하고 빠르게 처리해줘야한다.
그러나, 우리가 이전까지 배웠던 데이터 모델링 과정으로
구축된 데이터베이스는 유저의 이벤트처리 속도는 그렇게 빠르지 않다.
즉, 다양한 사람들이 이용하는 데이터베이스로는 위치할 수 없다는 사실이다.
그렇다.
이번 포스팅은
수많은 사람들이 서비스를 이용해도, 그 가치를 제대로 누릴 수 있는
데이터베이스를 구축하는 방법에 대해서 기록하는 포스팅이다.
데이터베이스 최적화
데이터베이스 최적화하기란,
유저가 서비스를 이용할 때 쾌적하고, 빠르게 이용할 수 있게 만드는 과정을 뜻한다.
쉽게말해, 유저가 서비스를 이용하면서 로딩이나 버퍼링이 나타나지 않게 서비스 수행속도를 압도적으로 높히는
과정이다.
데이터베이스 최적화에는
인덱스 설정,
Application Cash 설정,
역정규화
가 있다.
인덱스 설정은
테이블의 특정 칼럼을 인덱스로 보고,
쿼리문을 실행시키는 과정을 뜻한다.
다시말해, 쿼리문을 조작해서 데이터베이스 처리속도를 높히는 전략이다.
Aplication Cash 설정은
서비스가 실행되는 기기에 캐시로 데이터를 저장해두고,
유저가 특정 이벤트 요청 시 캐시 값을 토대로 비교적 빠른 속도로
데이터베이스 요청을 받아내는 전략이다.
마지막으로 역정규화가 있다.
역정규화는 데이터베이스 테이블 칼럼 구성을
수정하는 과정을 거쳐 "정규화"라는 규칙에 구애받지 않고,
좀 더 효율적인 쿼리문을 요청할 수 있게
데이터베이스를 리모델링 하는 과정이다.
그렇다.
인덱스 설정과
Aplication Cash 설정은 부여된 상황에 맞춰
이벤트 작업을 수행하면 된다.
반면, 역정규화는 구축된 데이터베이스의 구조를 바꿔 최적화를 이뤄낸다.
정리해서, 역정규화는
데이터베이스 구조를 바꿔줌으로써 최적화를 이뤄낸다.
이에 따라, 유저의 요구사항에 대응하는 쿼리문 응답 속도를 어떻게 빠르게
바꿔주는지를 살펴보자.
역정규화
역정규화는 유저에게 훨씬 빠른 서비스와 많은 서비스를 제공하기 위해
사용하는 데이터베이스 전략이다.
모든 DB는 "정규화" 과정을 거쳐
데이터 중복을 제거했다.
이에 따라 읽기를 희생 후, 쓰기의 편리함 기반으로 이상적인 DB 모델을 구성했다.
따라서, 역정규화는 이러한 희생된 읽기성능을 최적화하고자 진행된다.
희생된 읽기 성능을 최적화하기란 쉽게생각하면 된다.
우리가 이상적인 DB 모델을 만들기위해, "정규화"를 지켰던 것처럼
역정규화는 "정규화"를 위반하며
데이터베이스 읽기성능 최적화를 이루는 것이다.
정리해서, "정규화"에서 거듭강조하는
" 데이터베이스에선 중복 데이터란 있어선 안될 존재 !!!!! " 라는 개념을 어겨보며
DB 성능의 최적화를 이뤄내는 것이다.
역정규화라는 과정은
정말 미지의 영역이다.
답이 존재하지 않고, 정말 상황에 따라 역정규화를 수행하는
구조가 다르다.
그러니, 프로젝트 상황을 잘 이해하고, 그 상황 속 가장 효율적인 처리를 수행할 수 있는
테이블을 구성하려는 사람이 되고자 노력하면 뭐든 잘할 수 있다.
너무 겁먹지 말고, 일단 그냥 해보자.
이제 역정규화에 대해서 개념을 간단하게 익혔다면,
어떻게 수행되어지는 지 하나씩 알아보도록 하자.
해당 지식들을 활용하는 수준의 개발자는
DataBase Leader Developer로 대단한 위치에 속해있다.
그러니, 나처럼 처음 접하는 분들은 너무 해당 개념을
완벽하게 이해하려고 하지 말자.
그냥 이런게 있구나.. 라는 정도만 느끼기만 해도 충분하다.
어차피, 나중에 실무뛰면서 왕창할 것이기 때문이다 ㅎㅎㅎ
조급하게 생각할 필욘없다.
그냥 책을 읽는다는 생각으로 아래의 지식들을 접해보길 바란다.
- Post. 꿈많은 욱22 -
1. 칼럼 조작해서, JOIN 줄이기
N:M 관계에서
매핑 테이블에 일반 테이블의 특정 칼럼을 추가한다.
아래와 같이 구성할 수 있다.
그렇다. 원래같았으면,
게시글의 모든 태그 조회 Query 문에선
Map_Post_Tag 테이블과 Tag 테이블을 JOIN시켜 게시글의 모든 태그를 조회했다.
반면, 매핑 테이블의 칼럼을 조작하여
Map_Post_Tag 테이블로만 게시글의 모든 태그를 조회할 수 있게 되었다.
참고로 JOIN 문은 상당한 호출 비용이 있다.
즉, 칼럼 조작함으로써
게시글의 모든 태그 조회 Query 문에서 사용되는 JOIN의 비용을 줄일 수 있게 되었다.
2. 칼럼 조작해서, 계산 줄이기
게시글 갯수를 조회하는 쿼리문의 비용을 줄여보자.
유저 테이블에 포스팅 갯수 칼럼을 추가한다.
아래와 같이 구성할 수 있다.
그렇다.
원래 같았으면, 유저의 모든 게시글 조회 Query 문에선 Post 테이블에서
Group By 문을 이용해 유저의 모든 게시글을 조회했다.
반면, 유저 테이블에 유저의 게시글 갯수 칼럼을 추가해두었기에
이젠, 유저 테이블 조회만으로 모든 게시글 조회를 수행할 수 있다.
Group By 또한, 상당한 호출 비용이 있다.
즉, 유저 게시글 갯수조회라는 목적에 따라 유저 테이블에
게시글 갯수 칼럼을 추가함으로써
유저 게시글 갯수 조회 Query 문에서 사용되는 Group By 의 비용을 줄일 수 있게 되었다.
3. 테이블 쪼개기, 칼럼 기준으로 테이블 분리
게시글 조회 비용을 줄여보자.
게시글을 조회할 때, 우린 상세보기를 클릭하지 않는 이상,
내용 전체를 볼 필요는 없다.
게시글의 핵심내용만 보면 된다.
게시글의 제목, 작성자, 업로드 날짜
그렇다.
일반적인 게시글 테이블은
핵심내용을 비롯해 게시글의 전체내용까지 함께 보관하고 있다.
게시글 핵심내용과 게시글 상세내용을 두 테이블로 분리시킨다.
아래와 같이 구성할 수 있다.
그렇다.
게시글 핵심내용인 제목, 작성자 Id와
상세내용인 게시글내용을 분리시켜
용량이 상대적으로 큰 게시글 내용이 조회되는 비용을 줄였다.
원래였음,
게시글 모든 내용들을 조회하며 큰 용량을 감당하며
핵심내용들을 조회했어야 했는데,
이젠, 큰 용량인 게시글내용은 필요할 때만 조회해서 사용할 수 있게 되었다.
4. 테이블 쪼개기, 행을 기준으로 테이블 분리
우리가 사용하는 서비스의 유저가 압도적으로 많아지면,
DB Table의 데이터 인덱스는 무수히 늘어나게 된다.
따라서, 유저가 적었을 때는 문제가 되지 않았지만,
유저가 점점 늘어나면서 특정 데이터들의 조회 시 비용이 압도적으로 늘어나게 되었다.
이러한 상황 속 조회비용을 줄이고자,
행 기준으로 테이블을 분리시킨다.
아래와 같이 구성할 수 있다.
그렇다.
데이터의 인덱스 범주를 정해두고,
인덱스 범주에 따라 테이블에 데이터를 보관하여
무수히 많은 데이터들을 하나의 테이블에 저장해두지 않게했다.
즉, 무수히 많은 데이터 속 조회하는 비용을 줄여,
특정 인덱스에 따라 비용을 낮춰 조회할 수 있게 되었다.
역정규화를 마치며
생활코딩 "관계형 데이터모델링" 과정의 마지막 단락으로,
꽤 어려운 이론개념들이었다.
실무에서 유저에게 최적화된 서비스를 제공하고자
사용하는 데이터베이스 전략으로
실무를 경험해보지 못했던 나에겐 "역정규화" 이론자체가 추상적으로 와닿았다.
그래도, 블로그에 기록해봄으로써
약간의 추상적인 면모를 덜어낼 수 있게 되었다.
역정규화를 수행하는 과정은 마치
우리의 인생과 같았다고 느꼈다.
앞서 우린 정규화라는 데이터베이스 속 설계 규칙을 토대로
데이터베이스를 구축했다.
그러나, 우리는 최적화라는 새로운 목표로
"정규화"라는 이상적인 데이터베이스 규칙들을 깨부수고, 우린 상황에 맞는 데이터베이스를 재설계해놓음으로써
최적화를 이뤄낸다.
우리 인생도 이와 같다.
모든 사람들이 시험에서 좋은 성적을 거두기 위해,
원하는 것을 얻기 위해, 사회가 규정한 약속들을 지키며 살아간다.
그러나, 우리는 더 나은 길이라는 목표로
사회가 규정한 것들에서 벗어나
오직 자기 자신에게 집중하며 자신만의 길로 더 나은 길로 걸어가 최고의 성과를 거둔다.
따라서, 이번 역정규화 개념들을 접해봄으로써
나는 이론적 개념에 더불어 인생을 배울 수 있었다.
우린 모두 연결되어 있고, 자기 자신이 속한 그 순간이 가장 중요하다는 사실을...
'📚 스터디 > 데이터베이스' 카테고리의 다른 글
[데이터베이스] 데이터베이스 가이드북, 정규화 [4] (2) | 2023.09.30 |
---|---|
[데이터베이스] 데이베이스 설계도, ERD 설계 [3] (3) | 2023.09.30 |
[데이터베이스] ERD 그게 뭔데? [2] (0) | 2023.09.24 |
[데이터베이스] 데이터 모델링의 시작, 개념적 데이터모델링 [1] (0) | 2023.09.17 |
[데이터베이스] 데이터 모델링을 시작하며 (0) | 2023.09.16 |