3장 - 전체 운영 실습

본 글은 이것이 MySQL입니다(한빛미디어, 우재남 지음) 을 읽고 정리한 내용입니다.


요구사항 분석과 시스템 설계 그리고 모델링

정보시스템 구축 절차 요약

정보시스템을 구축하기 위해서는 일반적으로 분석, 설계, 구현, 시험, 유지보수의 5단계를 거친다.

  • 분석 : 시스템 분석 또는 요구사항 분석이라고 부른다. 현재 우리가 무엇을 할 것인지를 결정. 사용자의 인터뷰와 업무 조사 등을 수행해야 하며 첫 단추를 끼우는 중요한 단계이기 때문에 오랜 기간 심형을 기울여야 한다.
  • 설계 : 시스템 설계 또는 프로그램 설계라고도 부른다. 사용자가 요구한 사항을 분석한 결과를 가지고 데이터베이스 구조를 설계하는 단계이다.
  • 구현 : 설계가 끝나면 그 결과문서들을 프로그래머에게 넘겨주면 그대로 구현하는 단계이다.
  • 시험 : 구현이 끝나면 테스트하는 단계.
  • 유지보수 : 시스템이 상용화가 되며 이후 문제점이 들어나면 수정하고 업데이트 하는 단계.

이 중 분석과 설계 과정은 전체의 50% 이상을 차지한다고 해도 과언이 아님.

데이터베이스 모델링과 필수용어

분석과 설계 중에서 가장 중요한 과정 중의 하나가 바로 데이터베이스 모델링이다. 데이터베이스 모델링이란 현실세계에서 사용되는 데이터를 MySQL에 어떻게 옮겨 놓을 것인지 결정하는 과정이라고 생각하면된다.

예를 들어 쇼핑몰 데이터베이스에는 사람과 제품 테이블이 필요할 것이다. 그리고 사람은 사람을 나타내는 특성(속성)들이 있고 대표적으로는 이름, 주민번호, 주소 등의 정보가 있을 것이다. 제품 역시 제품이름, 가격, 제조일자, 제조회사, 수량 등이 있을 것이다.

  • 테이블 : 회원이나 제품의 데이터를 입력하기 위해 표 형태로 표현한 것을 말함
  • 데이터베이스 : 테이블이 저장되는 저장소
  • 열(=컬럼=필드=속성) : 각 테이블은 열로 구성됨
  • 데이터 형식 : 열의 데이터 형식을 말함. 예를 들어 제품테이블의 가격은 정수형. 제품이름은 문자형에 해당한다.
  • 행(=로우=레코드=튜플) : 실질적인 데이터 한개를 의미
  • 기본키 : 각 행을 구분하는 유일한 열. 기본 키는 중복되어서는 안되며 비어 있어서도 안된다. 또 각 테이블은 하나 이상의 기본키를 가져야만 한다.
  • 외래키 : 두 테이블의 관계를 맺어주는 키를 말한다. 그림에는 나오지 않았다.

데이터베이스 구축 절차

데이터를 구축하는 가장 기본적인 순서는 데이터 베이스 생성 -> 테이블 생성 -> 데이터 입력 -> 데이터 조회/활용 순이다. 실습을 통해 알아보자.

데이터베이스 생성

인터넷 쇼핑몰을 구축해야 한다고 생각하고 쇼핑몰(ShopDB)부터 생성해보자. Workbench를 실행 후 접속한 다음 아래 SQL문을 실행시키자.

create database shopdb;

실행시키는 방법은 두가지 방법이 있는데 첫번째 아이콘은 여러줄을 실행할 때 사용하고 두번째 아이콘은 커서가 위치한 한줄만 실행할 때 사용한다.

테이블 생성

테이블을 생성하기에 앞서서 테이블마다 데이터 형식을 지정해줘야 한다. 아래는 회원테이블과 제품 테이블 형식을 지정한 것이다.

열이름영문이름데이터 형식길이NULL 허용
아이디memberIDchar8글자X
회원이름memberNamechar5글자X
주소memberAddresschar20글자O

열이름영문이름데이터 형식길이NULL 허용
제품이름productNamechar4글자X
가격costint정수X
제조일자makeDatedate날짜O
제조회사companychar5글자O
남은수량amountint정수X

💻 참고로 MySQL은 기본적으로 테이블 이름, 열 이름 등을 모두 소문자로 처리한다. 그러므로 대문자를 입력하더라도 소문자로 변경되어서 저장된다.

create table `shopdb`.`memberTBL` (
	`memberID` char(8) NOT NULL,
    `memberName` char(5) NOT NULL,
    `memberAddress` char(20) NOT NULL,
    PRIMARY KEY (`memberID`)
);

create table `shopdb`.`productTBL` (
	`productName` char(4) NOT NULL,
    `cost` int NOT NULL,
    `makeDate` date NULL,
    `company` char(5) NULL,
    `amount` int NOT NULL,
    PRIMARY KEY (`productName`)
);

데이터 입력

테이블도 생성했으니 이제 실제 행 데이터를 삽입해볼 수 있다.

insert into memberTBL values ('Dang', '당탕이', '경기 부천시 중동');
insert into memberTBL values ('Jee', '지운이', '서울 은평구 중산동');
insert into memberTBL values ('Han', '한주연', '인천 남구 주안동');
insert into memberTBL values ('Sang', '상길이', '경기 성남시 분당구');

insert into productTBL values ('컴퓨터', '10', '2020-11-23', '삼성', 17);
insert into productTBL values ('세탁기', '20', '2017-09-01', 'LG', 3);
insert into productTBL values ('냉장고', '5', '2018-02-01', '대우', 22);

데이터 활용

마지막으로 이제 저장된 데이터를 불러올 수 있다.

select * from memberTBL;
select * from productTBL;

혹은 조건을 주고 특정 행만 불러올 수도 있다.

select * from memberTBL where memberName='당탕이';

혹은 이런식으로 특정 열만 불러올 수도 있다.

select memberID, memberAddress from memberTBL where memberName='당탕이';

테이블 외의 데이터베이스 개체 활용

테이블이 데이터베이스에서 가장 중요한 개체임에는 확실하지만 그것만 있는 것은 아니다. 대표적으로는 인덱스, 스토어드 프로시저, 트리거, 함수, 커서 등이 있다. 여기서는 가볍게 이들이 뭐하는녀석들인지 알아보도록 하겠다.

인덱스(Index)

개념

인덱스는 책으로 비유하자면 책 제일 뒤에 있는 색인(찾아보기) 같은 것이다. 즉, 책의 특정 단어를 찾고자 할때 앞에서 부터 전부 찾아보는 것이 아니라 책 뒤에 색인을 이용하면 효과적으로 찾을 수 있다.

인덱스도 마찬가지이다. 우리가 실습하는 데이터 양은 얼마되지 않으므로 금방찾을 수 있겠지만 실무에서는 수천만~수억건 이상의 데이터를 처리하게 된다. 인덱스 없이 처리하기에는 매우 부담스러울 수 밖에 없는 일이 될 것이다. 따라서 고급 데이터베이스관리자가 되기 위해서는 인덱스를 잘 활용해야 한다.

인덱스는 테이블의 열 단위에 생성된다. 우리는 별도의 인덱스를 생성한 적이 없지만 우리도 모르게 이미 회원테이블의 아이디(memberID)에 인덱스가 생성되어있다. 열을 기본키로 설정하면 자동으로 인덱스가 생성되기 때문이다.

실습 1 - 인덱스 없이 검색하기

인덱스를 간단히 사용해보자. 인덱스 사용여부를 알기 위해서는 데이터의 양이 어느정도 있어야 하기 때문에 그런 테이블을 만들어보자.

// 테이블 생성
create table indexTBL (
	first_name varchar(14),
    last_name varchar(16),
    hire_date date
);

// 데이터 삽입
insert into indexTBL
    select first_name, last_name, hire_date
    from employees.employees
    limit 500;

select * from indexTBL;

만들었으면 먼저 인덱스가 없는 상태에서 쿼리가 어떻게 작동하는지 보자. 아래 SQL문을 실행시키고 Execution Plan(실행계획)을 확인해보자.

select * from indexTBL where first_name='Mary';

실행계획은 나중에 다시 설명할 예정이다. 지금은 Full Table Scan이라는 점에 주목하자. 이는 인덱스를 사용하지 않고 전체를 검색했다는 뜻이다.

실습 2 - 인덱스 생성 후 검색하기

아래는 indexTBL 테이블의 first_name 속성에 인덱스 생성하는 SQL이다.

create index idx_indexTBL_firstname ON indexTBL(first_name);

그리고 다시한번 이전에 조회했던 것과 같은 SQL을 실행시키고 실행계획 결과를 확인해보자.

이번에는 Non-Unique Key Lookup이라는 결과가 나왔다. 이는 인덱스를 사용했다는 말이 된다. 그래서 그 작은 글씨로 인덱스 이름인 idex_indexTBL_firstname이 나온 것을 알 수 있다.

✍ 실무에서는 필요한 열에는 꼭 인덱스를 생성해줘야 한다. 하지만 인덱스를 잘못 활용시 독이 될 수 있으므로 이부분에 대해서는 나중에 자세히 알아보도록 할것이다.

뷰(View)

개념

뷰란 가상의 테이블이라고 생각하면 된다. 즉, 사용자 입장에서는 테이블과 동일하게 보이지만 뷰는 실제 행 데이터를 가지고 있지 않다. 그 실체는 없는 것이며 진짜 테이블에 링크 된 개념이라고 보면 된다. 그래서 뷰를 select하면 결국 진짜 테이블의 데이터가 조회되는 것과 동일한 결과가 나온다.

뷰를 쓰는 이유는 뭔지 예를 들어 설명하겠다. 기존에 구축된 쇼핑몰을 운영하다가 회원의 주소를 대량으로 변경할 필요가 생겼다. 그래서 아르바이트생을 고용해서 회원의 다른 정보는 그대로 두고 주소만 변경시키는 일을 시키려고 한다. 근데 만약 아르바이트생에게 그냥 권한을 주면 주소 외에 주민등록번호, 전화번호 등의 중요한 정보를 열람하거나 수정 및 삭제할 수 있을 것이다.

이럴때 두가지 방법이 있을 수 있다.

  1. 중요정보를 뺀 아이디와 주소만을 있는 테이블을 다시 생성한 후 데이터를 다시 입력하는 방법. 이는 굉장히 번거롭고 나중에 심각한 문제를 야기할 수 있다.

  2. 뷰를 사용하는 것이다. 아이디와 주소만 있는 뷰를 생성하면 아르바이트생은 그 뷰만 접근할 수 있고 나머지 중요정보는 볼 수 없게 된다.

실습

뷰의 이름은 보통 앞에 view를 의미하는 v_를 붙인다. 여기서 uv_는 user view의 약자이다. SQL문을 보면 알겠지만 뷰의 실체는 select이다.

create view uv_memberTBL
as
	select memberName, memberAddress
    from memberTBL;

조회는 그냥 테이블인 것처럼 조회하면된다.

select * from uv_memberTBL;

스토이드 프로시저(Stored Procedure)

개념

스토이드 프로시저(Stored Procedure)란 MySQL에서 제공해주는 프로그래밍 기능을 말한다. 즉, SQL문을 하나로 묶어서 편리하게 사용하는 기능이다. 물론 다른 프로그래밍 언어에서 SQL을 묶어서 사용하는 방법도 있다.

실습

DELIMITER //
create procedure myProc()
begin
    select * from memberTBL where memberName='당탕이';
    select * from productTBL where productName='냉장고';
end //
DELIMITER ;

DELIMITER(구분문자) 은 내가 처음본 개념인데 쓰는 이유는 스토이드 프로시저안에 ; 때문이다. SQL문에서 ;는 문장이 종료되었다는 것을 의미하는데 스토이드 프로시저 같이 아직 종료되지 않았는데 종료를 시켜버리면 곤란할 것이다.

그래서 DELIMITER 뒤에 //문자로 기존 세미콜론의 역할을 대신하도록 설정하는 것이다. // 이외에 다른 문자도 상관없다. 아무튼 그래서 end 뒤에 //를 써서 스토이드 프로시저가 끝났다는 것을 알려주고 다시 DELIMITER ;를 통해 세미콜론이 구분문자 역할을 하도록 설정해줘야 한다.

프로시저 실행은 아래와 같이 해주면 된다.

CALL myProc();

트리거(Trigger)

개념

트리거란 테이블에 부착되어서 테이블에 insert나 update, delete 작업이 발생되면 실행되는 코드를 말한다.

예를들어 당탕이라는 회원이 탈퇴하는 경우를 생각해보자. 간단하게 그냥 delete로 삭제할 수 있다. 하지만 나중에 탈퇴한 회원을 조사할 필요가 있는 경우에는 알 수 없게되므로 일반적으로 삭제하기 전에 그 내용을 다른 곳에 먼저 복사를 해놓은다음 특정 기간이 지나야 완벽하게 삭제시키는 것으로 알고 있다. 이런 작업을 사람이 매번 수작업으로 하다보면 깜빡잊는 경우도 생길 수 있다.

이것이 바로 트리거의 대표적인 용도이다.

실습

회원 테이블에서 행 데이터를 삭제할 경우에 다른 테이블에 지워진 데이터와 더불어 지워진 날짜까지 기록해보는 실습을 해보자.

먼저 지워진 데이터 보관 테이블을 생성한다.

create table deletedMemberTBL (
	memberID char(8),
    memberName char(5),
    memberAddress char(20),
    deletedDate date -- 삭제한 날짜
);

그런다음 delete 작업이 일어나면 백업테이블에 지워진 데이터가 기록되는 트리거를 생성하자. 이번엔 문법이 좀 어려운데 세부내용은 나중에 알아보자.

DELIMITER //
create trigger trg_deletedMemberTBL -- 트리거 이름
	AFTER delete -- 삭제 후 작동하도록 설정
    ON memberTBL -- 트리거를 부착할 테이블
    FOR EACH ROW -- 각 행마다 적용
begin
	-- OLD 테이블의 내용을 백업 테이블에 삽입
    insert into deletedMemberTBL
    values (OLD.memberID, OLD.memberName, OLD.memberAddress, CURDATE());
end //
DELIMITER ;

이제 delete 작업을 한번 수행해보자. 그리고 나서 deletedmembertbl에 삭제된 데이터가 자동으로 백업 테이블에 들어가는지 확인해보자.

delete from memberTBL where memberName='당탕이';
select * from deletedmembertbl;

데이터베이스 백업 및 관리

  • 백업 : 현재의 데이터베이스를 다른 매체에 보관하는 작업
  • 복원 : 데이터베이스에 문제가 발생했을때 다른 매체에 백업된 데이터를 이용해서 원래 상태로 되돌려놓는 작업

DBA(데이터베이스 관리자)가 해야하는 가장 중요한 작업 한가지를 뽑으라고 하면 바로 이 백업과 복원이다.

백업 실습

실제로 백업을 받는다면 현재의 데이터베이스가 저장된 디스크에 백업하는것은 의미가 없다. 백업은 다른 디스크에 백업을 받아야만 의미가 있다. 여기서는 그냥 C드라이브에 백업폴더를 만들어서 별도의 디스크라고 생각하고 실습을 진행하겠다.

Workbench에서 왼쪽 Naviagtor를 보면 Data Export가 있다.

테이블, 뷰 등 모두 체크하고 Objects to Export에서도 모두 체크해서 스터오드 프로시저, 스토어드 함수, 트리거 등도 백업을 하도록 한다.

성공적으로 백업이 되었으면 C드라이브 백업 폴더에서 ShopDB.sql 백업 파일을 확인할 수 있다.

복원 실습

이제 큰사고가 발생했다고 가정하고 productTBL의 모든 데이터를 삭제해보자.

delete from productTBL;

사용중인 DB를 복원하면 문제가 생길 수 있으니 우선 다른 DB로 변경하자. 그리고 역시나 마찬가지로 Navigator에 Data Import/Restore를 클릭한다.

해당 백업파일을 불러온다음 타겟으로는 ShopDB가 있으므로 이것을 선택한다.

그리고 나서 데이터가 잘 복원되었는지 productTBL 테이블을 확인해보자.

✍ 여기서는 워크벤치를 사용해서 GUI환경에서 편리하게 백업/복원 기능을 활용해봤지만 그 내부적으로는 mysqldump.exe와 mysql.exe 프로그램이 작동했다.

백업과 복원은 훨씬 중요한 얘기가 많고 실무에서는 다양한 경우가 발생할 수 있다. MySQL Enterprise Backup 툴을 사용하면 더 고급 백업/복원 기능을 제공해주며 실시간 변경되는 내용도 백업이 되는 기업 환경 백업이 가능해진다. 추가적으로 MySQL Enterprise Monitor 툴은 MySQL 서버 상태를 GUI모드에서 한눈에 파악할 수 있는 기능을 제공한다.


MySQL과 응용프로그램 연결

MySQL과 PHP의 연동은 자주 사용된다. 혹은 Python이나 NodeJS를 이용해서 연동또한 가능하다. 언어마다 연동하는 방식이 다르므로 여기서는 그냥 넘어가도록 하겠다.

좋은 웹페이지 즐겨찾기