지난 시간에 여러분 컴퓨터에 MySQL Server와 MySQL Workbench를 설치했다면
이번 시간에는 SQL 기초 실습을 위한 커뮤니티 Database를 만들고 순차적으로 각종 테이블을 만들어 보겠습니다.

SQL실습용 Database인  edu_community 데이터베이스는 블로깅,채팅/회원가입/로그인/마이페이지 기능을 포함한
일반 사용가 이용하는 간단한 커뮤니티 기반 플랫폼 웹사이트와 관리자가 해당 플랫폼을 관리자용 웹사이트  등 2개의 웹사이트에서 사용하는 공용 Database 입니다.

edu_community Database내에는 총 7개의 물리 테이블 이 존재하며 각각 테이블의 목적은 아래 ERD문서를 참고해주시기 바랍니다. 

-회원 정보테이블 : 일반 사용자 정보 관리 테이블
-관리자 정보테이블 : 관리자 사이트에 관리자 계정 정보 관리 테이블
-채널 정보테이블 : 채팅 채널정보 관리 테이블
-채널회원 정보 테이블 : 채팅 채널별 참여 회원 정보 테이블
-채널메시지 정보 테이블 : 채팅 채널별 각종 메시지정보 관리 테이블
-게시글 정보테이블 : 각종 게시글/블로깅 게시글 정보 관리 테이블
-게시글 첨부파일 정보 테이블 : 게시글 첨부파일 정보 테이블 


먼저 MySQL Workbench DB클라이언트 툴기반 GUI방식으로 Database를 생성하는 방법을 안내해드립니다.

Database는 정보관리시스템의 업무단위나 서비스 단위로 발생하는 각종 데이터를 영구적으로 보관하는 데이터 저장소 역할을 담당합니다.
Database 생성기준은 업무의 단위, 서비스의 규모에 따라 단일 DB로 또는 여러 DB로 나누어 전체 시스템의 Data를 안정적으로 관리할수 있습니다.

MySQL서버에서는 Database를 Schema란 용어로 사용하며 MySQL에서 Schema는 흔히 알고있는 Database로 이해하시면 됩니다. 

Step1) Create Database(Schema)
MySQL Workbench를 오픈하고 좌측 Navigator 메뉴>Schemas탭을 클릭합니다.


Schemas탭 영역에 오른쪽마우스 클릭 > Create Schema 메뉴를 클릭합니다. 

Step2) DB Name,Charset,Collation 설정

-Name : 입력박스에 DB(Schema)이름을 입력합니다.

DB Name은 소문자 언더바 조합으로 추천합니다. ex) edu_community


-Charset 
사용자가 입력하는 실제 데이터의 문자셋 타입을 지정하는 영역으로
영어를 포함한 유니코드 문자(한글/중국어/일본어/아랍어등 영어가 아닌 문자타입) 가 DB에 저장된다면 반드시 utf-8 or utf8mb4 타입을 선택합니다.
utf8mb4 타입을 추천드리며 utf8mb4 타입은 채팅시 사용자들이 입력하는 이모지(이모티콘)와 같은 데이터 사이즈가 큰  데이터도 저장할수 있는
최신의  Charset(문자셋)을 지원하는 타입이며 채팅/챗봇(이모지사용)등의 데이터를 보관한다면 반드시 utf8mb4를 선택해줍니다.

MySQL의 UTF-8의 경우 하나의글자를 저장하는 최대 3ytes로 문자를 저장하는 문자 인코딩 방식을 지원하지만
이모지는 이모지 하나가 4byte 크기여서 utf-8 타입으로 지정된 경우 이모지를 db에 저장시 에러가 발생하는 원인이 됩니다.
utf8mb4 타입은 하나의 문자셋을 최대 4byte 크기로 저장할수 있는 Chartset입니다.

-영문(아스키) 1글자: 1Byte (8bit) : A
-한글(유니코드) 1글자: 2Byte이상 최대 3Byte (16bit): 강
-이모티콘 1개: 4Byte (32bit) : 이모티콘이미지

-Collation 
Collation은  지정된 Charset기반으로  등록된 데이터들에 대한 정렬(내림차순/오름차순)과 관련된 옵션입니다.
ChartSet을 utf8로 선택했다면 반드시 Collation도 utf-8 unicode-ci or utf-8 unicode-ci 를 선택해줍니다.
ChartSet을 utf8mb4로 선택했다면 반드시 Collation도 utf8mb4 unicode-ci 를 선택해줍니다.
Collation을 해당 Charset에 맞게 적절하게 설정하지 않으면 등록된 유니코드 문자열들에 대한 정렬(오름/내림차순) 정렬이 의도치 않게 작동됩니다.

-한글 오름차순 정렬 : 가,나,다.....
-한글 내림차순  정렬: 하,파,차....

Name,Charset,Collation을  입력/선택했다면 Apply 버튼을 클릭합니다.


Step3) Database(Schema)생성을 위한 SQL 구문생성/확인
Database(Schema)생성을 위한 SQL쿼리가 만들어지고 내용을 확인합니다.

CREATE SCHEMA `edu_community` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;

Apply 버튼을 클릭하면 CREATE SCHEMA SQL 구문이 로컬 MySQL서버에 전달되어 신규 Schema(Database)가 만들어집니다.


Step4) Finish 버튼을 클릭합니다.
-Finish버튼을 클릭하고
-좌측 Schemas탭에 오른쪽마우스클릭 > RefreshALL을 클릭해 정상적으로 DB가 생성되었는지 확인합니다.



Step5)Database 주요 DB 객체 소개

정상적으로 원하는 DB가 만들어졌다면 해당 DB노드를 확장해봅니다.
Database의 주요 DB객체 4개가 나열되며 각각의 DB객체의 사용목적은 아래와 같습니다. 

-Tables 
실제 데이터가 저장되는 DB객체
여러 테이블간의 관계를 기반으로 데이터가 해당 테이블에 저장되고 관리됩니다.

-Views 
실제 물리적으로 존재하지 않는 가상 테이블 객체
물리적으로 존재하는 테이블들을 기반으로 개발자가 원하는 새로운 가상의 테이블 구조를 미리 만들어 마치 물리 테이블을 사용하는것과 같은 기능을 제공
주로 여러테이블에 흩어져 있는 데이터를 매번 조인이란 방식을 통해 쿼리를 작성하는데 해당 쿼리를 반복적으로 작성해야하는 비효율을 방지하기 위해
해당 조인 쿼리등을 이용해 원하는 구조의 결과셋 가상 테이블 구조를 미리 만들어 두고 물리 테이블 호출하듯이 사용할수 있는 장점 제공


-StoredProcedures
일반적으로 DB Table에 테이터를 관리하기 위해서는 클라이언트나 백엔드 어플리케이션등에서 관련 SQL 구문을 작성해서 DB서버로 전송하고
DB서버에서는 해당 SQL 구문의 문법검사를 실행하고 SQL구문을 실행하여 데이터를 등록하거나 수정,조회.삭제 하는 작업이 진행됩니다.

실제 데이터를 관리하는 핵심 기능은 SQL구문이지만 해당 SQL구문이 상당히 길거나 시간이 오래걸리거나 SQL구문내에 복잡한 업무로직이 포함되어 있다면
SQL 구문을 DB서버에 전달하고 실행하는데 실행성능(조회속도/처리속도)이 떨어지게 됩니다.

이러한 실행성능을 개선하기 위한 목적으로 장문의 SQL구문이나 비지니스로직을 포함 SQL구문 자체를 DB서버에 저장해두고 해당 SQL에 필요한 매개변수값만 전달하여
실행하는 방식이 저장 프로시저 방식입니다.

저장 프로시저를 사용하면 최초 생성시 문법검사를 실행하기때문에 백엔드에서 호출시 문법검사를 하지 않고 바로 실행되고 장문의 SQL구문이 네트워크를 통해 이동하지 않기 때문에
SQL의 처리속도가 빨라지는 효과를 가져옵니다. 

-Functions
각종 개발언어의 함수처럼 자주 사용하는 SQL쿼리를 함수처럼 만들어 쿼리를 재사용하기위한 방식 제공
특정 테이블을 기반으로 원하는 단일 데이터(스칼라)값이나 데이터목록을 조회 반환하고자 하는 자주 사용되는 쿼리를
함수형태로 만들어 개바자 쿼리에서 재사용할수 있는 기능을 제공함 

Database의 주요 DB객체 4가지에 대해 간략히 알아보았으며 추후 단계적으로 View,Procedure,Functions 사용법은 별도 가이드 드리겠습니다.


Step6)기존 데이터베이스(Schema) 삭제하기
이미 만들어진 데이터베이스 삭제는
해당 Database 선택> 오른쪽 마우스 클릭 DropSchema 메뉴를 클릭하여 삭제가능합니다.

** 데이터베이스를 삭제하면 데이터베이스 내 모든 DB객체/데이터가 모두 삭제되오니 DB 삭제는 주의해서 사용하시기 바랍니다.