건축하는데 설계도 없이 지으면 건물 올리면서도 고통받고 올리고 난 후에도 고통받는다.
토이 프로젝트 할 때도 다양한 설계를 미리 한다.... 안해서 고통받을 뿐....
➡️ 데이터베이스도 당연히 설계를 해야한다!
인터넷 쇼핑몰을 만드는데 어떤 데이터베이스가 필요할까?
데이터베이스 모델링은 현실 세계에서 사용되는 사물이나 작업을 DBMS로 옮기는 작업이다.
쇼핑몰을 예시로 들면 고객, 직원, 구매, 물품, 회원 등을 테이블로 옮기는 작업이 데이터베이스 모델링이다.
귀에 걸면 귀걸이고 코에 걸면 코걸이인 데이터베이스 모델링은 가장 효율적일 것으로 예상하며 진행해야 한다.
예를 들어 어묵을 구매했고 쇼핑몰에 가입한 회원의 수를 구하고 싶다면? 몇 번의 연산을 해야할까...어떻게 해야 효율적일까... 이런 고민을 하는 것이 데이터 모델링이다.
데이터베이스가 어려운 이유는 초기 용어가 너무 많고 어색하고 어렵고 눈물이 흐르기 때문이다.
데이터베이스 모델링을 끝냈다 가정하고 각 용어를 알아보자.
데이터 : 단편적인 정보, tess/아이유/바나나와 같은 개별적인 정보를 의미
테이블 : 회원이나 제품의 데이터를 입력하기 위해 표 형태로 표현한 것
데이터베이스 : 테이블이 저장되는 저장소. 테이블도 집이 있는데..
열(Column) : 테이블의 세로줄, 컬럼, 필드 등으로 불린다
열 이름 : 각 열을 구분하기 위한 이름. 서로 달라야 한다.
데이터 형식 : 열에 저장될 데이터의 형식. 숫자, 문자 등
행 : 실질적인 "진짜" 데이터. hero/임영웅/서울 은평구 증산동 이 하나의 행 데이터로 로우, 레코드 등으로 불린다. 행의 개수를 데이터의 개수라 부른다
기본 키 : 기본키(Primary Key)는 각 행을 구분하는 유일한 열을 말한다. 중복과 null이면 안된다. 테이블한테는 아이디와 비밀번호 같은 존재라 생각하면 쉽다.
이제 설치한 MySQL로 조금 맛 좀 봐볼까요?
Workbench 실행 후 MySQL 서버 접속, Schemas 클릭 후 마우스 우클릭, Create Schema 선택
Schema 이름을 shop_db로 하고 스키마 생성
CREATE SCHEMA 'shop_db';
위 코드를 워크벤치에서 GUI로 뚝딱 해낸 것
이제 shop_db 스키마가 생성된 것을 확인할 수 있다. 스키마는 데이터베이스와 유사한 용어로 집을 지었으니 이제 데이터(테이블)를 만들어보자!
생성한 스키마에 Create Tables를 클릭한다.
테이블을 설계한대로 입력한다.
CREATE TABLE `shop_db`.`member` (
`member_id` CHAR(8) NOT NULL,
`member_name` CHAR(5) NOT NULL,
`member_addr` CHAR(20) NULL,
PRIMARY KEY (`member_id`));
이런 멋진 코드를 workbench의 gui가 실행해준다는 뜻이다.
생성한 스키마의 생성한 테이블(member)에 마우스 우클릭, Select Rows-limits 1000 선택
Result Grid에 입력하고 싶은 데이터를 입력하고 Apply를 클릭
INSERT INTO `shop_db`.`member` (`member_id`, `member_name`, `member_addr`) VALUES ('tess', '나훈아', '경기 부천시 중독');
INSERT INTO `shop_db`.`member` (`member_id`, `member_name`, `member_addr`) VALUES ('hero', '임영웅', '서울 은평구 증산동');
INSERT INTO `shop_db`.`member` (`member_id`, `member_name`, `member_addr`) VALUES ('iyou', '아이유', '인천 남구 주안동');
INSERT INTO `shop_db`.`member` (`member_id`, `member_name`, `member_addr`) VALUES ('jyp', '박진영', '경기 고양시 장항동');
이제 데이터베이스(스키마), 테이블, 데이터 모두 만들어봤으니 SQL을 입력해서 데이터를 조회해보자!
전체 member 조회 SELECT FROM * FROM member
이름과 주소만 조회 SELECT member_name, member_addr FROM member
과제 : 아이유만 조회하기 SELECT * FROM member WHERE member_name = '아이유'
선택과제 : 데이터베이스 개체 중 테이블을 제외한 인덱스, 뷰, 스토어드 프로시저 3가지 정리
인덱스는 추가적인 쓰기 작업과 저장 공간을 활용해 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.
말이 어렵지만 모래알에서 바늘 찾기 위한 자료구조, 책의 마지막 찾아보기라고 생각하면 쉽다.
하나 기억해야할 것은 인덱스 생성 여부에 따라 결과가 달라지지 않는다는 것이다. 책의 찾아보기가 없다고 책의 내용이 없어지진 않다는 것과 같은 말이다.
뷰는 가상의 테이블이다. 실제로 정보처리기사 필기에서도 이렇게 설명하는데 뭔가...뭔가 다가오지 않는다. 그래서 이 책에선 뷰를 크롬 바로가기를 예시로 들고있다.
바탕화면에 IntelliJ는 더블클릭하면 바로 실행되지만 사실은 저런 파일구조로 들어가 bin에 있는 실행파일을 찾아서 연결된다.
이렇게 실제 테이블을 연결해주는 가상의 테이블 뷰는 사실 SELECT 문이다. 그럼 뷰는 왜 사용할까? ➡️ 바로가기처럼 찾기 쉽고(쿼리가 단순해짐), 보안이 강화(필요한 데이터만 노출)되기 때문이다.
스토어드 프로시저(Stored Procedure)는 MySQL에서 제공하는 프로그래밍 기능이다. C, Java, Python 같은 프로그래밍 언어에서 사용되는 연산식, 조건문, 반복문 등을 사용할 수 있다.
나중에 설명하겠지만 커피 뽑는 자판기를 만드는 것과 같다. 여러 SQL문을 자주 사용한다면 뭉탱이로 묶어 하나의 스토어드 프로시저(자판기)를 만드는 것이다.