데이터베이스

DataBase

데이터 베이스란 단어는 개발자가 아니어도 많이 듣는 용어중 하나 입니다.
의미는 데이터들을 잘 정리하여 모아놓은 것이라고 할 수 있습니다.

개발자들은 데이터 베이스에 많은 관심을 가져야 합니다.
데이터를 얼마나 잘 관리하고 효율적으로 사용하는지가 사업의 연속성에 큰 영향을 주기 때문입니다.
이번 글은 데이터 베이스에 관해 공부한 것을 간략히 정리하겠습니다.


데이터가 중요한 이유

데이터는 회사또는 서비스의 자산입니다.
물론 무조건 많다고 좋은 것이 아닙니다. 그 이유는 데이터를 저장하고 있는 것 자체도 비용을 지불하기 때문입니다.
데이터를 담고 있는 서버의 용량 혹은 데이터들이 네트워크 상으로 이동하면서 사용하는 통신 비용 등을 예로 들 수 있습니다.
따라서 데이터는 최소한으로 필요한 것만 모으는 것이 좋습니다.
아래의 사진을 보며 더 깊이 이야기를 해보겠습니다.

데이터란 자료의 모음이라고 보면 좋을 것 같습니다.
이 자료들을 특정한 조건으로 추려서 재 정리 한다면 이것은 정보(information)가 됩니다.
정보들은 또 특정한 목표를 가지고 의미를 부여할 수 있습니다.
의미있는 정보들은 지식(knowledge)으로써 고민하고 행동할 수 있는 조건 혹은 수단이 될 수 있습니다.
지식과 경험등을 모아 어떤 선택을하고 노하우가 쌓여 지혜(wisdom)가 되면 의사결정에 큰 영향력을 발휘할 수 있게 됩니다.


데이터 관리

위에서 설명한 대로 데이터가 중요하기 때문에 데이터는 사업의 연속성을 위해선 관리가 잘 되어야 합니다.
우리가 무서워하는 개인정보유출(벌써 다 털린것 같지만)은 사실 이 데이터가 해커에게 도난(복제) 당했다고 보시면 됩니다.
보안을 위한 내용은 이 글에서 다루지는 않을 것이지만 아래 정리한 내용에 더해 프로그래밍 적으로 혹은 시스템 설계적으로 보안에 신경을 써야 더 안전한 관리가 된다는 사실을 잊지 않으시길 바랍니다.

간단히 살펴 본다면
프로그래밍적으론 시큐어(secure)코딩이라는 것에 관심을 가져보시길 바라며, 인젝션 방어 등에 대해 알아 두시면 좋을 것 같습니다.

만약 시스템 설계를 할 때 크게 아래의 3 tier 구조로 설계한다면
web server : Apache, Nginx
WAS(Web Application Server) : JSP(spring), Django, NodeJS, PHP
DB

DB 서버는 전세계에 열어놓으면 안됩니다.
인바운드와 아웃바운드를 생각해서 DB서버 자신에게 접근해도 되는 곳에만 설정해야 합니다.
실제 서비스는 WAS에만 열어주어 해당 WAS를 통해서만 접근이 가능하도록 해야합니다.

SSH 키페어 방식으로 개발 서버(jump host)만 열어놓고
개발서버에서 각 웹서버, WAS, DB서버에 접근하도록만 열어놓고
사용자는 개발서버에 접속해서 개발을 진행하는 것이 가장 좋다고 합니다.(아직 제가 이대로 직접 설계해서 만들어 본적은 없습니다.)

그리고 중요한 부분중 하나는 사업 연속성을 위해서 DB는 정기적으로 백업 을 해야합니다.


DBMS : DataBase Management System

이 용어에 대한 정의를 저는 우리가 자주 사용하는 엑셀프로그램을 기본 컨셉으로 잡고 있습니다.
데이터들을 효율적으로 활용할 수 있도록 분류하고 저장해 놓는 프로그램이라고 생각하시면 됩니다.
데이터를 어떤 DBMS(이하 디비 라는 단어를 사용하겠습니다)를 활용해 저장할지는 개발 설계과정에서 중요한 포인트 중 하나입니다.
설계하고 있는 서비스의 사용자 수, 저장되는 데이터의 종류와 갯수 등을 고려하여 신중히 선택해야 합니다.
(지옥을 맛보고 싶지 않다면…)

디비는 크게 관계형인 것과 관계형이 아닌 것으로 구분할 수 있습니다.

  1. RDBMS(관계형 데이터베이스)는 전통적으로 많이 사용하던 디비 로 데이터들의 관계를 중요시하여 설계한 후 관리하는 방식입니다. 주로 SQL을 활용하여 데이터를 읽고 쓰고 등의 작업을 처리 합니다.
    예) MySQL, Oracle, MS-SQL, PostgreSQL, SQLite
    참고로 SQL[에스큐엘, 시퀄]은 이라고 읽으며 Structured Query Language의 줄임말 입니다.
    SQL에 대해선 아래에 좀 더 자세히 다루겠습니다.

  2. 관계형이 아닌것 : NoSQL ( Not only SQL )이라고 하며 보통 key-value방식을 이용하여 대용량의 데이터를 다루기 위해 고안된 데이터베이스 방식입니다.
    예) MongoDB, Amazon DynamoDB, Redis 등등 종류가 많습니다. 각각의 장점이 뚜렷하기 때문에 필요한 것을 잘 찾아서 사용해야 합니다.

물론 대용량의 데이터를 위해 무조건 NoSQL을 사용해야 하는 것은 아닙니다.
데이터간의 관계 및 데이터가 저장될 스타일에 따라 다르며 NoSQL이 상대적으로 런닝커브가 낮지만 관계형 디비에서의 사용되는 트랜잭션이란 기능은 돈이 오가는 거래에서 장점이 되기 때문에 어떤 디비가 좋다라는 식의 접근 보다는 어떤 서비스를 위해 어떤 디비를 활용해서 효율적으로 관리할 것인가를 고려해보는 것이 중요합니다.

요즘엔 ORM ( Object Relational Mapping )이라는 기술(방식)이 등장하여 관계형 디비의 러닝커브를 높게 만드는 SQL사용을 하지 않는 방식(안에서 자동으로 처리해줌)이 발전하여 쉽게 디비를 사용할 수 있습니다.
하지만 편한만큼 마음대로 커스텀하기가 어려워 성능에 문제가 생길 수 있다는 단점이 있습니다.
(개인 사업에서 디비가 성능상 문제가 있을 정도가 되면 사용자와 데이터 양이 많아진 것이므로 돈을 많이 벌었을거고 데이터베이스 관리자를 두면 된다 라는 Honux의 조언이 있었습니다 ㅎㅎㅎ 그리고 어렵다는건 불가능한게 아니라 노오오오력을 하면 가능할지도 모릅니다!)


DBMS 관련 용어 정리

  • 테이블 ( Table ) : 데이터를 항목별로 구분해서 정리할 수 있도록 하는 틀 입니다. 엑셀화면(sheet)을 생각하면 이해하기 쉬울 것 같습니다.
  • 칼럼 ( Column ) : 테이블 내에서 데이터가 쌓이는 항목. 데이터의 라벨이라고 볼 수 있을 것 같습니다.
  • primary key ( pk ) : 고유한 키. 테이블의 컬럼 중에 다른 데이터와 구분할 수 있는 데이터라고 할 수 있습니다. 한개 또는 중복의 컬럼으로 고유한 key를 만들어 다른 데이터와 구분할 수 있도록 하는 건데 예를 들어 실생활에서 우리가사용하는 이름은 동명이인이 많으므로 pk값이 될 수 없습니다. 하지만 이름과 핸드폰번호를 묶는다면 고유한 한사람이 될 수 있는거죠. 하지만 더 쉽게 주민번호로 pk를 정하면 나만의 고유번호라 한개의 데이터로 원하는 데이터(특정 개인의 신상정보)를 찾을 수 있는거죠. 물론 주민번호같은 데이터는 요새 직접 다루지 않는것이 보안상 유리하고, 테이블에 데이터가 생성될 때 자동으로 숫자를 올려가며 데이터를 넣어주는 방식을 많이 사용하고 있습니다. 그럴 경우 보통 테이블의 id값이라고 사용합니다.
  • foreign key ( fk ) : 참조 키. 다른 테이블의 데이터를 참조하여 데이터의 연관성을 부여합니다. 보통 다른 테이블의 pk값을 이용하여 해당 테이블에 참조를 하며, 그 참조된 데이터가 pk가 될 수도 있습니다.
  • ERD ( Entity Relationship Diagram ) : 테이블과 컬럼, 그리고 키들의 관계를 사람이 알아보기 쉽게 그림으로 표현한 것입니다.

SQL ( Structured Query Language )

SQL은 디비를 다루기 위한 언어라고 할 수 있습니다.

크게 세가지로 구분하며 아래와 같은 명령어를 시작으로 사용합니다.

  1. 데이터 정의 언어(DDL:data definition language) - Create, Alter, Drop등의 명령어가 있습니다.
    보통 서비스의 설계나 수정사항이 있을 경우 전체적인 테이블 구조와 관계등을 설정할 때 사용합니다.

  2. 데이터 조작 언어(DML:data manipulation language) - Select, Insert, Delete, Update 등이 있습니다. 개발자들이 프로그램을 작성할 때 사용하게될 언어로 실제 데이터의 삽입, 삭제, 수정, 조회 등의 작업을 위해 사용합니다.

  3. 데이터 제어 언어(DCL:data control language)- Grant, Revoke, Commit, Rollback 등이 있습니다. 이미 조작된 데이터의 상태를 결정하는 명령어로 되돌리거나 전체 서버에 적용시키는 등의 제어를 가능하게 합니다.


CRUD

( Create / Read || Retrieve / Update / Delete )

위에서 설명한 데이터 조작언어(DML)을 흔히 CRUD라고 합니다.
CRUD는 읽고 쓰고 수정하고 삭제하는 등 개발자들이 가장 많이 사용하고 잘 알아둬야하는 명령어 입니다.

기본적인 사용은 아래와 같습니다.

  • Create : insert query

    1
    INSERT INTO users(name, nickname) VALUES ('이태현', 'chocozero');
  • Read : select query

    1
    SELECT name, nickname FROM users;
  • Update : update query

    1
    UPDATE users SET nickname = 'jake' WHERE name = '이태현';
  • Delete : delete query

    1
    DELETE FROM users WHERE name = '이태현';

마무리

긴 글 읽어 주셔서 고맙습니다. 혹시 오타나 오류가 있다면 저를 포함한 글을 읽는 모든 사람을 위해 언급해 주세요 ~

이 글은 내용이 방대해질 수 밖에 없는 내용이라 세분화시키려고 간략하게 Database에 대한 소개만 적은 글입니다.

실제로 중요한 부분인만큼 많은 시간 투자와 연습, 그리고 개념정리가 필요합니다.
특히 쿼리의 사용은 테이블의 관계에 따라 다양하고 복잡해질 수 있습니다.
좀 더 자세한 사용은 내용이 방대하기에 따로 포스팅을 준비하도록 하겠습니다.

모두 해피코딩 하세요 ~ ^^


본 글을 쓰는데 도움받은 레퍼런스

  1. honux(정호영) 마스터의 코드스쿼드 수업
  2. 위키피디아
Share 0 Comments