Programming/SQL

DB/DBMS/SQL 기본 개념+원리, DDL 사례와 오라클DBMS 의 문자형 데이터 타입 2021-06-16

최동훈1 2021. 6. 16. 16:06

우선 DBMS는 (Data Base Management System)의 약자 이다. 그렇다면 DBMS는 DB를 관리해주는 도구라는 말인데 이것이 왜 필요할까?

우선 DB가 왜 만들어졌는지 부터 알 필요가 있다. 우선 DB가 없던 시절에는 각 컴퓨터나 시스템 마다 별도의 저장소를 사용했다. 그러면, 하나의 데이터 정보가 갱신되었을때, 따로 동기화를 각 저장소 마다 주기적으로 해줘야하는 수고로움이 있었다. 이런 단점을 하나의 저장소 공간을 공유함으로써, 즉각적인 데이터 갱신효과와 중복으로 저장할 필요없는 데이터들을 없앰으로써, 저장공간의 활용도를 극대화시켰다.

이렇게, 시스템마다, 위 사진은 한 대학의 도서관 시스템, 행정실 시스템을 나타낸 것이다. 원래 등록금 납부여부와 대출 가능여부가 분리된 형태로 각 시스템마다 별도의 저장소에 저장해서, 주기적으로 동기화 해주는 과정을 거치는 시스템이였다면, 위의 그림과 같이 별개로 분리된 저장공간을 하나로 합침으로써, 각 시스템의 정보들을 즉각적으로 받아올 수 있게 되었다. 예) 등록금납부한 사람이 대출가능 하다면, 바로바로 확인할수 있게끔 만든 것이다.

 

그러나, 세상일이 그렇듯 이런 좋은 방법에도 단점이 있다. 바로, 각 시스템마다 공통 DB에 접근할때마다, 성능이 느려지거나, 보안이 문제가되거나, 아니면 동시성 이슈(한 시스템이 DB에 접근하려 할때, 다른 시스템에서 이미 DB를 사용하고 있는 경우나 다른시스템이 업데이트하려던 데이터를 삭제해버리는 경우, 아니면 충돌이 이러나 병목현상이 일어나는 경우) 이런 문제들을 해결하기 위한 매니지먼트 시스템이 필요했다.

 

하지만 워낙 어렵고 고도화된 기술이라, 아예 이런 DB매니지먼트를 전문적으로 개발하는 소프트웨어 회사들이 나서서 개발했다.

대표적으로는 mySQL,ORACLE 등이다.

 위 중앙 데이터 뒤 물체를 DBMS로 표현했다.

또한 SQL이란 단어의 뜻을 살펴보자면, (Structured Query Language) 란 뜻인데 이것을 직역하자면 

구조화된 질의 언어

이다. 여기서 구조화된 이 무슨 의미일까? 아직 구체적인 내용은 학습하지 않았지만 SQL의 구조화된 형식의 종류에는 DDL,DML,DCL 등이 있다.

 

DDL : 자바의 클래스나, C언어의 구조체 처럼, "entity" 객체이다. 앞으로 DB에 저장하고자 하는 데이터가 어떤 형태인지 먼저 DBMS에 인식시키는 역할을 하며, Create/Alter/Drop 명령어 구조가 있다. Create는 말그대로 새로운 데이터 형태를 DBMS에 저장할 것이라고 DBMS에 알려주는 것이고, Alter는 데이터 형태의 변경, Drop은 앞서 정의한 구조를 삭제하는 것이다.

이 DDL에서 정의된 데이터형태는 오라클 DBMS의 테이블 스페이스라는 공간에 각각 저장된다. 자바로 치면 클래스를 담아두는 공간이라 생각하면 된다.

 

DML : 실질적인 데이터의 "조작" 이다. DDL을 통해 데이터의 형태를 정의하고, DB에 저장된 데이터를 가지고 올건지 말건지, 변경할건지,삭제할건지 등을 질의하는 구조이다. Insert/Select/Update/Delete 명령어 구조가 있다. 가장 많이 쓰이는 명령어 구조이다.

 

DCL: 어떤 사용자가 DB에 접근할 수 있는지 권한을 정의하는 명령어 구조이다. Grant/Revoke 등이 있다.

 

DDL을 통해 새로운 테이블을 만드는 사례를 표현하자면, 이렇다.

 

클래스로 예로듬 왜냐하면, DDL로 만든 테이블이란 개념 자체가 "개념화된 데이터 구조"즉 객체를 만드는 것과 같기 때문.

실제 이런 변수를 가진 데이터 형식을 DBMS에 저장 하고 싶다면, DDL중 Create 명령어를 쓴 다음, 각 데이터 타입을 오라클에서 사용가능한 데이터 타입으로 적어야 한다.

 

실제 DBMS에 날리는 SQL로 위 데이터 형식을 만든코드.

이렇게 SQL 언어로 작성하면 이런 코드가 된다.

 

위에 적힌 데이터 타입이 생소할 수 있는데, 오라클의 데이터 타입중 "문자형"에 대해서 설명해 보겠다.

오라클에서 사용가능한 데이터 타입은 크게

-오라클 내장 데이터 타입

-다른 DBMS 데이터 타입 

-ANSI 표준 데이터 타입

-SQL 데이터 타입

-사용자 정의 데이터 타입

등이 있다.

우선 오라클 내장 데이터 타입은 크게

1. Character형식 2.Numeric형식 3. Date형식 4.LOB 형식 이 있는데 각각은 순서대로, 문자형,숫자형,날짜형, 멀티미디어형 이다.

 

우선Character 형식을 설명하자면, 자료형은 4개 밖에 없다.

CHAR, VARCHAR, 

NCHAR, NVARCHAR. 인데, 각 타입마다 인자로 바이트 타입이나 char타입(2 CHAR이렇게 지정했을시에만 가능.)을 받고 해당 크기에 맞는 바이트를 저장공간에 할당한다. 그러나  Varivfication(가변)이란 키워드가 붙은 형식은 인자로 받은 바이트 전부 할당하는것이 아니라, "최대" 저장공간을 할당하고, 쓰여지지 않는 구간은, 반환한다. 그래서 ID나 PW 같은 길이가 가변적인 데이터는 VARCHAR을 이용하고, 전화번호, 생년월일 등, 문자의 길이가 정형화된 데이터를 저장할 때는 CHAR을 이용한다.

그런데 마냥 VARCHAR가 좋은것만은 아닌것이, 길이가 가변적이라 데이터 접근시 시간이 많이 걸린다.(인덱스가 들쭉날쭉이므로)

또한 NCHAR는 각 나라별로 사용할수 있는 언어를 UTF16(2바이트)나 UTF8(3바이트)로 나타낸 것이다. 즉, NCHAR의 인자인 Size는 바이트의 크기가 아니라, "문자" 의 크기이다. 이 타입을 사용한다면, 한글을 쓰는 변수에 타입으로 넣을 수 있을 것이다.

예) "남자" 라는 두 글자를 앞서 예시로 든 Gender 변수에 넣을려면 타입으로 NCHAR(2) 이러면 된다. 두글자 이므로.

 

오라클의 문자형 데이터 타입.

 

지금현재, 내 머릿속에 그려진 SQL의 근본적인 정의를 요약하자면 이렇다. 주의할 점은 내가 말을 이상하게 한 거일 수 도 있는데, DDL은 DBMS에 저장할 "개념화된 데이터구조" 를 정의하는 것이다.

 

SQL이란 컴퓨터가 DBMS에서 다루게 하기위한 데이터의 "형태" 등을 정의(DDL)하고, 구체적인 질의사항(DML)과, 접근할수 있는 권한(DCL)을 정의하는 언어이다.

 

이런 SQL은 SQLPLUS 등 해당 DBMS제품의 에디터에서 작성해도 되고, 자바 언어를 통해 쿼리를 날릴 수 있다.

또한 DBMS의 종류에 따라서 받아들이는 함수의 이름, 변수 등이 다르기에 자바는 JDBC라는 라이브러리를 사용해서 프로그램이 직접 DBMS에 SQL을 보내는 것이 아닌, 각 DBMS 마다 만들어놓은 JDBC Driver에 쿼리를 보낸다. 그럼 그 Driver가 DBMS 제품별 함수나 변수이름으로 바꾸어서 동작하게끔 만들어 준다.

 

공부시간 4시간.

순공부시간 2시간.

 

이번주는 월, 화 모두 백준 문제 와 알고리즘 공부한다고, SQL 공부를 아예하지 못했는데, 오랜만해서 그런지 집중도가 올라간 느낌이다. 확실히 그날 공부한 내용을 백지에다가 내 머릿속을 정리하면서 마무리짓는게 효과가 매우 좋은거 같다.