5 더 배워보기
source: categories/study/database/database5.md
5.1 수업의 정상
저는 어떤 기술에 대해 공부하면 그 기술의 혁신(innovation)은 무엇이고 본질(essence)이 무엇인지 파악하려고 노력합니다.
이렇게 파악하면 여러가지 판단할 때 있어서 도움이 많이 되더라구요.
지금 저희가 배우고 있는 것은 Relational Database
입니다.
이 중에서 Database
라는 말 자체가 본질이라고 생각합니다.
Database
라면 이것이 관계형이건 객체지향이건 그래프 데이터베이스이건 상관없이 공통적으로 공유하고있는 특징, 그것이 본질이겠죠?
그리고 그 본질은 당연히 CRUD
- 데이터를 추가하고
- 수정하고
- 삭제하고
- 읽고
이 네가지 작업을 가지고 있다면 Database
라고 봅니다.
그리고 Database
라면 위 네가지 특성을 꼭 가지고 있구요.
이번 강의를 통해서 Database
를 관통하는 공통점을 살펴본 것이고, 여러분이 교양으로 공부하고 계시다면 여기까지입니다.
뭐가 여기까지냐면 경제적인 공부는 여기까지입니다.
이후부터 나오는 것들은 기하급수적으로 어려워지기 때문에 경제적이지 않습니다.
교양으로 공부하러오셨다면 여기까지 공부하시고 나중에 필요하실 때 이 다음, 혁신을 공부하시면됩니다.
관계형 데이터베이스는 왜 다른 데이터베이스와 구분되는가? 라고하는 그 특징, 바로 Relational
이라는 말의 의미를 지금부터 살펴볼겁니다.
그런데 미리 말씀드리자면 혁신은 항상 어렵습니다. 여러가지 복잡성들이 존재하기 때문에.
그래서 저는 최대한 부담되지 않는 선까지만 관계형이란 측면을 살펴볼 것이고 최대한 쉽게 할테지만, 그럼에도 불구하고 내용 자체가 어렵습니다.
5.2 관계형 데이터베이스의 필요성
-
중복
데이터의 중복이 발생한다는 것은 그 데이터를 개선시킬 여지가 많다는 것을 뜻합니다.
예를들어, 위와 같이 author 컬럼과 profile 컬럼에 중복되는 데이터 값들이 있습니다.
위는 현재 5개의 데이터밖에 없기 때문에 뭐가 그렇게 큰 문제야? 라고 할 수 있지만, 데이터베이스는 예전에도 말씀드렸지만 데이터의 양이 어마어마한 것을 상정하고 만든 것이라고 했습니다.
데이터의 갯수가 1억개이고 그 중에서 1천만개의 데이터가 위처럼 중복이 된다고 생각해봅시다.
그리고 위와 같이 짧은 데이터가 아니라 긴, 용량이 큰 데이터라면 엄청난 비효율일 겁니다.
그리고 그런 중복된 데이터들을 전체 일괄적으로 수정해라 라고 한다면, 그때도 엄청난 비효율이 발생할 것입니다.
그리고 데이터의 용량이 크다면 그 데이터들끼리 비교해서 겹치는 데이터인지 아닌지도 판별하기 어려울 것입니다.
그리고 만약 ‘이름'같은 컬럼이라면 중복된다해서 같다고 처리하기도 애매합니다. 동명이인일 수도 있으니까요.
위와 같은 경우 위 데이터 형식으론 관리하기가 어렵습니다.
위와 같이 하면 테이블이 좀 복잡해지긴 했지만, 중복된 데이터는 사라지고, 각각의 데이터에 대해 author
테이블의 id
로 식별자가 대체가 되었습니다.
위와 같이 동명이인도 쉽게 식별할 수 있습니다.
그런데 위와 같이 바꾼다고 장점만 생기느냐. 아닙니다. 단점도 생깁니다.
이를 보통 trade off
라고 합니다.
- 기존에 수정하기 전 테이블을 보면 author와 profile 컬럼의 값들도 바로 쓰여있기 때문에 굉장히 직관적으로 데이터들을 볼 수 있습니다.
- 그런데 수정 후 테이블처럼 테이블을 별도로 쪼개서 테이블의 참조값을 적어놓게되면, 참조된 값들을 가지고 있는 테이블을 또 열어서 비교해가면서 봐야되는 불편함이 있습니다.
- 즉 여기서 위와 같이 테이블을 분리해 중복을 발생시키지 않으면서도 실제로 데이터를 볼 땐 수정전 테이블처럼 보고싶다는 욕구가 생깁니다.
MySQL과 함께라면 위 욕구를 실현시킬 수 있습니다.
위와 같이 author
테이블과 topic
테이블이 분리가되어있음에도 불구하고
불러올 때 같이 결합해서 불러올 수 있습니다.
5.3 테이블 분리하기
topic
테이블을 author
테이블과 topic
테이블로 분할하고 나중에 불러올 때 다시 합쳐서 불러오는 실습을 해보도록 하겠습니다.
5.4 JOIN - 관계형 데이터베이스의 꽃
컬럼을 id
, title
, description
, created
, name
, profile
이렇게만 보고싶을 때.
위와 같이 입력하면 에러가납니다.
여기서 ambiguous
는 애매모호하다는 뜻입니다.
왜 애매하냐면 topic
테이블에도 id
가 있고 author
테이블에도 id
가 있기 때문입니다.
그래서 위에서 id
라고하니까 MySQL 입장에서는 애매하다, id
가 어떤 id
를 가리키는거냐. 라는 겁니다.
이럴 경우엔 어떤 테이블의 id
인지 위 처럼 명시해줍니다.
위와 같이 할 수 있다는 것이 얼마나 혁명적인 일인지를 잘 아셔야됩니다.
이것이 얼마나 중요한 일인지..
여러분이 프로그래밍을 배울 때, 정보 기술에서 중복을 제거한다는 것은 정말 중요하고, 아주 많은 기술들이 바로 이것을 위해 존재합니다.
위 빨강선 기준으로 위에 있는 테이블은 옛날 테이블, 아래있는 테이블은 관계형 테이블입니다.
옛날 테이블은 예를 들어 duru
의 profile
을 database administrator
에서 developer
로 바꾼다고 했을 때, 모든 테이블에서 duru
를 찾아서 일일이 바꿔야합니다.
하지만 아래 관계형 테이블에선 그렇게 바꿀 필요 없이 author
테이블에서 바꿔주기만하면 됩니다.
그렇게되면 topic
, comment
테이블 모두 따로 건드릴 필요가 없습니다.
즉, 테이블을 분리한다는 것은 topic
테이블과 author
테이블 사이만 관계를 맺을 수 있는 것이 아니라
모든 테이블이 author
테이블의 id
식별자와 일치하는 식별자를 테이블에 포함하고 있다면
우리는 JOIN
을 통해서 얼마든지 관계를 맺을 수 있다는 겁니다.
JOIN
은 관계형 데이터베이스를 관계형 데이터베이스답게 만들어주고 JOIN
역시 깊게 들어가면 끝도 없습니다.
왜냐, 현실 데이터는 정말 오만가지 형태의 것들이 있거든요.
그 모든 복잡성을 JOIN
을 통해서 해결하려고하면 복잡한 것들이 많이 있겠죠?
5.5 인터넷과 데이터베이스
정보의 바다라고하는 인터넷에서 데이터베이스가 동작하게되면 굉장히 파워풀한 효과를 낼 수 있습니다.
MySQL은 내부적으로 인터넷을 활용할 수 있도록 고안된 시스템입니다.
저희 수업에서 자주 보았던 그림입니다.
여기서 제가 제대로 짚고넘어가지 않은 부분이 있습니다.
database server
바로 server
의 의미입니다.
인터넷을 동작하게하기 위해선 최소 몇대의 PC가 필요할까?
바로 2대입니다.
요청과 응답
웹
WEB Browser
url로 요청을 보냅니다.
그러면 응답을 합니다.
요청 / 응답 나뉘게됨
각각의 역할을 설명하기 위해 쉬운말을 찾음
요청 (client - 고객)
응답 (server - 서비스를 제공하는 자라는 뜻)
client 컴퓨터는 server 컴퓨터에게 정보를 요청하는데 이 관계가 웹
정보를 요청 - 웹브라우저(웹클라이언트) 설치되어있음
응답 - 웹서버 설치되어있음
게임클라이언트 / 게임서버
채팅클라이언트 / 채팅서버
클라이언트 / 서버 - 인터넷을 이해하는 핵심적인 용어
MySQL - 데이터베이스 클라이언트 / 데이터베이스 서버가 설치됩니다.
데이터베이스 서버에 데이터가 저장되고 데이터베이스 클라이언트를 통해 데이터베이스 서버에 접속할 수 있다.
데이터베이스 서버를 사용하려면 어떠한 형태로든간에 데이터베이스 클라이언트를 사용해야된다. 데이터베이스 서버를 직접 사용할 수는 없다.
데이터베이스 클라이언트란?
mysql -uroot -p
위 명령어를 실행했을 때, mysql이 데이터베이스 클라이언트를 실행하는 명령어이다.
위 명령어를 실행하고 비밀번호를 맞게 입력하면
Welcome to the MySQL monitor.
라고 쓰여있습니다.
이 MySQL 모니터가 데이터베이스 클라이언트 중에 하나였던 것이고
우리가 MySQL을 설치하면 MySQL을 만든 사람들이 MySQL 서버에 접속할 수 있도록 번들로써 제공하는 기본 클라이언트가 바로 MySQL 모니터였던겁니다.
그리고 MySQL 모니터는 명령어를 통해서 데이터베이스 서버를 제어하는 프로그램입니다.
다음 시간엔 데이터베이스 클라이언트 중에 하나인 워크벤치를 설치해서 사용하는 모습을 보여드릴겁니다.
그럼 여러분은 데이터베이스 클라이언트 두가지를 사용하게되는데, 지금까지 사용해왔던 것은 MySQL 모니터이고, 또 하나는 MySQL 워크벤치라는 프로그램입니다.
이 프로그램을 사용하면 GUI 환경에서 마치 엑셀을 다루듯이 데이터베이스를 다룰 수 있습니다.
5.6 MySQL 클라이언트
5.6.1 MySQL 모니터
MySQL 모니터의 장점
-
MySQL 서버를 설치하면 함께 설치되기 때문에 MySQL 서버가 있는 곳에 MySQL 모니터가 있다라고 생각할 수 있습니다.
어디에서나 사용할 수 있다는 뜻입니다. -
그리고 MySQL 모니터는 GUI가 아니고 명령어를 통해 제어하는 명령어 기반의 프로그램입니다.
반면에 이따 사용해볼 MySQL 워크벤치란 프로그램은 GUI 기반의 프로그램입니다.
즉, 마우스를 가지고 조작할 수 있는 프로그램입니다.그런데 많은 서버 컴퓨터들이 그 컴퓨터의 자원을 최대한 ‘일' 자체에 투여하기위해서 GUI 기능을 제공하지 않는 경우가 정말 많습니다.
그런 상황에선 MySQL 워크벤치를 그 컴퓨터 안에선 사용할 수 없습니다.
MySQL 모니터는 명령어기반이기 때문에 어디서든 실행할 수 있다는 굉장히 중요한 장점을 가지고있습니다.
그럼에도불구하고 MySQL 모니터엔 단점이 있습니다.
왜냐면 명령어를 통해서만 제어해야되기 때문에 명령어를 기억해야된다라는 단점을 가지고있습니다.
하지만 이 단점도 자주하다보면 장점이 됩니다.
특히나 요즘처럼 검색엔진이 발전한 시대에는 그 단점이 점점 없어지고 있습니다.
5.6.2 MySQL client
mysql client
검색
5.7 MySQL Workbench
MySQL에서 공식적으로 지원하는 GUI 기반의 프로그램인 MySQL 워크벤치라는 프로그램을 살펴보겠습니다.
mysql workbench
검색 및 설치.
위와 같이 모니터와 워크벤츠를 동시에 띄워서 비교하면서 실습해보도록 하겠습니다.
mysql -uroot -p -hlocalhost
-h
는 host
의 약자입니다.
host
는 인터넷에 연결되어있는 각각의 컴퓨터가 host
입니다.
그래서 여러분이 지금 실행하려고하는 MySQL 모니터라는 클라이언트로 인터넷을 통해서 다른 컴퓨터에있는 MySQL 서버에 접속하려고하면
위 -h
부분에다가 그 서버에대한 주소를 적어주면됩니다.
mysql -uroot -p -hgoogle.com
예를 들어, 여러분이 구글 직원이라면 위와 같이 할겁니다.
그런데 현재 저희는 MySQL 클라이언트와 MySQL 서버가 같은 컴퓨터에 위치하고있잖아요?
즉, 지금 MySQL 클라이언트가 설치되어있는 본인 컴퓨터를 가리키는 약속된 도메인이있는데 그것이 localhost
입니다.
그리고 localhost
와 똑같은 의미를가진 IP는 127.0.0.1
입니다.
mysql -uroot -p -h127.0.0.1
그런데 위와같이 -h
를 작성하지않고
mysql -uroot -p
라고 실행하면 기본값으로 -hlocalhost
가 실행됩니다.
여튼 이렇게 접속하면 MySQL 모니터에 접속하게됩니다.
MySQL 모니터를 쓰건, MySQL 워크벤츠를 쓰건 모든 클라이언트들은 SQL을 MySQL 서버에 전송함으로써 데이터베이스 서버를 제어하게된다 라는 것입니다.
이 사실을 이해하는 것이 나중에 파이썬, PHP, JAVA 같은 컴퓨터 프로그래밍 언어를 통해서
여러분이 어떤 어플리케이션이나 웹을 만들 때 굉장히 중요하고
많은 분들이 이 부분을 넘질 못합니다. 개념적으로.
결국에는 그런 컴퓨터 프로그래밍 언어를 이용해서 우리가 하는 일은 SQL
문을 생성해서 서버에 전달하는 것이다. 지금은 잘 이해하기 힘드시겠지만 차차 알게될 것입니다.
위와 같이 생성된걸 볼 수 있고 직접 데이터도 입력하시면됩니다. (엑셀처럼)
세상에는 정말 많은 MySQL 클라이언트가 있습니다.
모든 데이터분석을하는 시스템들은 본질적으로는 모두가 MySQL 클라이언트입니다.
이 세상에는 무수히많은 MySQL 클라이언트가 있습니다.
마무리
index
사용자들이 많이 검색하는 컬럼에 INDEX(색인)을 걸어주면, 데이터가 들어올 때, 데이터베이스가 그 컬럼의 데이터를 잘 정리정돈합니다.
예를들어 MySQL이라는 텍스트는 어떠어떠한 행에 저장되어있고 Oracle은 어디어디에 저장되어있다라는 것을 별도로 정리해놓습니다.
나중에 누군가 MySQL을 검색하면 굉장히 빠른 속도로 검색결과를 보여줄 수 있게되는겁니다.
왜?
미리 찾아놓았기 때문.
그래서 이런 성능상의 문제가 생기면 여러분들은 index
키워드를 검색하시면됩니다.
modeling
그리고 데이터가 많아짐에따라 여러가지 문제들이 발생할 수 있습니다.
위에서 말씀드린거는 데이터의 양적인 측면을 말씀드린거고, 현실에서의 데이터들은 굉장히 다양한 측면의 데이터들이 있기 때문에
여러분이 데이터베이스의 구조를, 쉽게말해서 테이블을 처음에 잘못 설계하면 나중에 큰 낭패를 볼 수 있습니다.
그래서 어떻게하면 테이블을 효율적으로 데이터의 중복이없이 더 좋은 성능으로 설계할 것인가 라고하는 주제에 대한 뛰어난 엔지니어들이 잘 적립해놓은 여러가지 성취들이 있습니다.
대표적인 것이 정규화, 역정규화 이런 것들이 있습니다.
그래서 처음에는 테이블 만들어쓰시면 되는데 나중에 데이터가 많아짐에따라서 ‘테이블 어떻게만들어야되지?' 라는 것이 고민된다면
modeling
이라는 키워드로 검색해보시면 여러분을 구원해줄 수 있는 지식들이 모여있을겁니다.
backup
아주 중요한건 백업입니다.
데이터를 아무리 많이 넣으면 뭐해요. 나중에 한번에 날라가버리면 그것은 재앙과도 같습니다.
그렇게될바엔 데이터를 모으지 않는 것이 나을 수도 있습니다.
그래서 데이터를 백업한다는 것은 매우 중요한 의미를 갖습니다.
예를 들어서 하드디스크가 있다면, 하드디스크에 대해 예측할 수 있는 것과 없는 것이 있습니다.
예측할 수 없는 것은 얘가 언제 고장날지 알 수 없다는 것입니다.
그런데 예측할 수 있는 것은 얘는 언젠가 반드시 고장난다는 것입니다.
그건마치 인간은 죽는다와 같습니다.
그런데 언제죽는지 모를뿐이죠.
그래서 자신의 노트북에 데이터를 저장을 해놨는데 그 데이터가 자기께 아닌것도 포함되어있다?
그럼 엔지니어로써 자격이 없는겁니다.
왜냐면 누군가에겐 그게 생명과도 같은 정보일 수도 있잖아요.
백업의 기본적인 정의는 데이터를 복제해서 보관하는겁니다.
그래서 내 컴퓨터와 별도의 컴퓨터에 데이터를 복제해서 보관한다면 데이터를 잃어버릴 가능성은 현저히 낮아집니다.
그리고 그 컴퓨터가 독립된 공간에 떨어져있다면 훨씬 더 유실될 가능성은 떨어지고
또 그 건물들이 서로다른 국가에있다면, 대륙에있다면 훨씬 더 안전해지는 것이죠.
백업 관련된 키워드는 mysqldump
, binary log
입니다.
cloud
cloud
는 내 컴퓨터를 데이터베이스 서버로 쓰는 것이 아니고 엄청나게 큰 회사들있잖아요?
MS, 아마존, 구글, 네이버.. 이런 큰 회사들이 가지고있는 인프라 위에있는 컴퓨터에서 임대해서 사용하는 것이 cloud
컴퓨팅이라고 생각하시면 되겠습니다.
그래서 컴퓨터들이 나한테있지 않습니다.
그 회사들의 데이터센터에있고 우리는 그 컴퓨터를 눈으로 볼 수 없습니다.
그럼 어떻게다루냐.
원격제어를 통해서 다룹니다.
특히나 최근에는 이런 클라우드 컴퓨팅시스템이 고도화되면서 MySQL 같은 데이터베이스를 서비스화시켜서 여러분이 그 회사의 웹사이트에 들어가서 클릭클릭클릭클릭하면 1분만에 데이터베이스 서버가 만들어집니다.
그럼 여러분들은 자신의 데이터베이스 클라이언트에 그 데이터베이스 서버의 고유한 주소를 입력해서 접속해서 사용할 수 있게되는 것입니다.
이렇게했을 때 장점은 필요할 때 켰다가 필요없을 때 끄면 더이상 과금이 되지 않는다는 것입니다.
그리고 이런 서비스들은 세계 최고수준의 엔지니어들이 고안하고 있기 때문에 내가 신경쓸 일들이 줄어듭니다.
어떻게하면 백업을 더 잘해놓을지, 어떻게하면 성능이 더 좋아질지(성능은 좀 신경쓰긴해야겠지만) 이런 것들에 대한 에너지 소비가 줄어듭니다.
특히나 백업측면을 그쪽이 알아서해주기 때문에 정말로 쉬워집니다.
AWS RDS
, Google Cloud SQL for MySQL
, AZURE Database for MySQL
programming
현대에는 데이터베이스 자체를 쓰는 경우는 많지않습니다.
데이터베이스를 일종의 부품으로해서 그 부품을 기반으로 여러 정보시스템이 완제품으로 만들어지는 것입니다.
여러분이 사용하는 수많은 웹사이트와 수많은 앱과 수많은 분석결과들이 그 안에, 뚜껑을 열어보면 데이터베이스가, MySQL이 들어가있을겁니다.
여러분들도 그런 웹사이트, 어플리케이션을 만들고싶다면 프로그래밍 언어를 배우셔서 데이터베이스 서버로 SQL을 던져줄 수 있는 방법을 배우시면됩니다.
Python mysql api
, PHP mysql api
, JAVA mysql api