본문 바로가기
코드이그나이터와 php7와 mysql

MySQL에 넣었다가 꺼냈다가. 뭘?

1. 오토셋 APM 인스톨러 ( apache + php7.2 + mariadb ) 설치 | https://itadventure.tistory.com/93

2. 코드이그나이터 4 ( codeigniter 4 ) 설치 | https://itadventure.tistory.com/95

3. 비주얼 스튜디오 코드 에디터 설치 & 한글 설정 | https://itadventure.tistory.com/96

4. 폴더열기 / 웹페이지 편집(1) | https://itadventure.tistory.com/97

5. 웹페이지 편집(2) | https://itadventure.tistory.com/101

6. 코드이그나이터4의 URL 규칙 | https://itadventure.tistory.com/105

7. php, 네임스페이스 [ namespace ] ?! | https://itadventure.tistory.com/118

8. 코드이그나이터의 네임스페이스, 그리고 모델 | https://itadventure.tistory.com/122

9. 코드이그나이터 뷰의 파라미터 전달 | https://itadventure.tistory.com/147

10. 코드이그나이터 뷰를 나눠 볼까요? | https://itadventure.tistory.com/174

11. MYSQL 이 뭐여? [ 마이에스큐엘은 서류철이다! ] | https://itadventure.tistory.com/175

12. MYSQL 콘솔에 접속해보자! | https://itadventure.tistory.com/178

♣ 13. MYSQL에 넣었다가 꺼냈다가. 뭘?


최근 블렌더 2.8 e-Book ( 인터넷 서적 ) 을 편집하려고 남는 시간을 올인하느라
블로그 글을 통 신경을 못 썼었는데 정식 블로그 글을 적기는 정말 몇개월만인듯 합니다.

곧 제출한 책 심사가 잘 끝나서 인터넷 서적으로 정식 출판되기를 개인적으로 바라는 바입니다 :)
책이 많이 팔리길 바란다기보다는 일생에 책 몇 권 정도는 꼭 쓰고 싶었던 꿈이 있었는데 이 번에 진행하게 되어
크레이 개인적으로는 매우 기쁜 마음입니다. 출간하게 되면 블로그에 링크 / 판매처 등 내용 올리도록 하겠습니다.

오랜만에 벌려놓은(?) 여러가지 주제중 어느 글을 먼저 시작할까 하다 코드이그나이터를 진행하려 합니다.

지난 시간에는 '오토셋'을 통해 설치된 프로그램 중 MySQL 의 mariadb(마리아DB) 에 접속해서 데이터 베이스와 테이블을 생성하는 방법을 살펴보았었는데요.

테이블은 무엇이라고 하였었지요? 바로 장부와 같다고 설명드렸습니다.
그리고 데이터베이스는 여러 장부를 주제별로 묶은 것이다~ 라고 설명드렸었지요.

오늘은 테이블, 곧 장부에 내용을 한 줄 한 줄 기록하고 그 기록을 찾아보는 방법을 살펴보겠습니다.


첫째로, 지난 강좌를 참조해 주셔서 MySQL 콘솔 창까지 진입해 주세요.
화면에 아래와 같은 창이 펼쳐지면 맞게 접속하신 겁니다.
(원래는 바탕색이 검정, 글씨색이 흰색인데 인쇄하게 되면 잉크값을 아끼려고 색을 바꿨으니 혼동 없으시길 바랍니다 :) )

지난 시간에 만든 Library 데이터베이스에 접속해 봅시다.

use library;

MariaDB [(none)]> use library;
Database changed
MariaDB [library]>

이어서 데이터베이스 안에 무슨 테이블이 있는지 보려면 show tables 명령을 내리면 된다고설명드린 바가 있습니다.

show tables;

MariaDB [library]> show tables;         // 해석 : 테이블들을 보여줘!
+-------------------+
| Tables_in_library |    // 해석 : library 라는 (데이터베이스) 내의 테이블들
+-------------------+
| book              |
+-------------------+
1 row in set (0.001 sec)   // 해석 : 세트 안에 1행 ( 1개의 테이블 ) 이 있습니다.

현재 지난번에 만든 테이블, book 이라는 테이블 하나만 달랑 존재해 있군요.

book 테이블을 도서 테이블로 생각하기로 했었지요.

book 테이블의 구조가 어떻게 생겼는지,
지난번에 create table 문을 열심히 공부하신 분이라도 2~3개월 지나면 새까맣게 잊어버리실 겁니다.
사실 크레이도 그러하거든요 :)

그럴 때는 테이블의 구조를 다시 보는 명령어를 사용해 주셔야 하는데요.
테이블이 어떻게 생겼는지 보는 명령어가 있는데 다음과 같이 사용합니다.

desc 테이블명;
desc book;

MariaDB [library]> desc book;     // book 테이블의 구조를 보여줘!
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
|해석(항목)  | 유형         |'널'허용| 키 | 기본값  | 부가정보        |
+-----------+--------------+------+-----+---------+----------------+
| number    | int(11)      | NO   | PRI | NULL    | auto_increment |  // 일련번호
| title     | varchar(128) | NO   |     | NULL    |                |  // 제목
| body      | text         | NO   |     | NULL    |                |  // 본문
| totalpage | int(11)      | NO   |     | NULL    |                |  // 총페이지
| author    | varchar(128) | NO   |     | NULL    |                |  // 저자
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.070 sec)   // 해석 : 세트 안에 5행이 있습니다.

MariaDB [library]>

여러가지 정보가 나열되었는데요. book(책 장부)에 포함된 항목들이 쭈루룩 나열된 것입니다.
엑셀로 보자면 아래 그림의 제목에 해당하는 부분이 나열되었다고 보시면 됩니다.

이 장부에는 아직 제목만 존재하지, 내용이 전혀 들어 있지 않습니다.
이 장부에 역사적인 한 줄을 장식(?) 해 볼까요?

mysql에서는 INSERT ( 삽입하다 ) 명령을 통해 그 기록을 남길 수 있습니다.
아래와 같이 한번 입력해 볼까요? ( 사실 body 내용은 과장되었다는 소문이.. 수근 수근.. )
이 명령어는 title 항목을 '3D 모델링 블렌더 2.8'로 body는 '블렌더의 신비 어쩌고..'로, 각각 정해서 한줄을 기록하는 명령입니다.

insert into book set
title='3D 모델링 블렌더 2.8', 
body='블렌더의 신비! 그 고대의 비밀을 풀어보자!', 
totalpage=452,
author='크레이';

참고로 위의 내용이 여러줄로 기록되었는데 한줄로 이어서 써야 맞는게 아니냐고 궁금해 하시는 분들이 계실것 같아 하나 알려드립니다. 결론은 여러줄로 기록해도 무방합니다.
Mysql 에서는 한줄의 입력이 모두 끝났다고 알아듣는 걸 맨 마지막에 있는 세미콜론 기호 ( ; )가 나올 때만 인식합니다. 이대로 입력할 때 MYSQL 콘솔창의 화면은 아래와 같이 표시되니 참조해 주세요.

MariaDB [library]> insert into book set
    -> title='3D 모델링 블렌더 2.8',
    -> body='블렌더의 신비! 그 고대의 비밀을 풀어보자!',
    -> totalpage=452,
    -> author='크레이';
Query OK, 1 row affected (0.039 sec)

MariaDB [library]>

입력한 문장이 이상없다는 신호로 Query Ok, 1 rows affected (질의가 승인되었고, 1행이 영향을 받았습니다 ) 라고
결과가 나오면 정상이지만, 만일 중간에 오타가 있다만 아래와 같이 오류 메시지를 내뿜습니다.
아래 예시는 authorauthorr 로 잘못 입력한 경우입니다.

MariaDB [library]> insert into book set
    -> title='3D 모델링 블렌더 2.8',
    -> body='블렌더의 신비! 그 고대의 비밀을 풀어보자!',
    -> totalpage=452,
    -> authorr='크레이';
ERROR 1054 (42S22): Unknown column 'authorr' in 'field list' 
// 해석 : 1054 오류(42522) : '필드 목록' 내 authorr'는 알수 없는 컬럼입니다.
MariaDB [library]>

이 경우 사람의 실수 때문에 장부에 전혀 내용이 기록되지 않습니다.

컴퓨터가 융통성이 없다고는 하지만, 컴퓨터 입장에서 정확하지 않은 요구를 한건 사람입니다.
만일 정말로 authorr 이라는 항목이 있어서 이 항목을 저서를 출판한 출판사라고 정의했다면,
출판사라는 항목에 값 '크레이'를 넣어야 할텐데 말이죠. :)

이렇듯이 프로그래밍 언어명확한 입력을 요구합니다.

한줄을 더 입력해보겠습니다.
복붙(복사&붙여넣기)하신다면 오류는 나지 않을테니 결과 화면은 생략하겠습니다.

insert into book set
title='오토셋으로 구현하는 코드이그나이터 4', 
body='코드이그나이터4로 홈페이지를 만들어볼까요?', 
totalpage=500,
author='크레이';

만일 여기서 2가지 의문이 생기신 분은 아주 예리하신 분입니다.

첫번째, number 항목은 set 목록에서 빠져 있는데요. 실수한 것일까요?
number 항목은 앞에서 내용을 살펴보시면 auto increment ( 자동 증가 ) 라고 부가정보 속성이 기록되어 있을 겁니다.

자동증가 항목은 굳이 set 으로 설정하지 않아도 새로운 줄이 기록될 때마다 알아서 1씩 그 값이 증가되어 기록되기 때문에 굳이 넣을 필요가 없습니다. Mysql 이 알아서 붙여주는 일련번호가 되는 것이지요.

두번째, 다른 항목들은 모두 작은 따옴표로 기록되어 있는데 totalpage 만 따옴표가 없습니다.
mysql 은 문자항목과 숫자항목을 구분합니다. 단순히 내용이 숫자냐 문자냐가 아니고
처음 create table 명령으로 테이블을 만들 때 숫자 계열로 항목을 만든것이 숫자 항목이 되고,
문자 계열로 항목을 만든것이 문자 항목이 됩니다.

아래 보이는 create table  문에서 number 와 totalpage 는 int(11) 로 정의되어 있습니다.
이 것이 바로 숫자 항목이고, 그 외에 varchar, text  로 정의된 것이 문자 항목입니다.

CREATE TABLE book (
	number int(11) NOT NULL AUTO_INCREMENT,
	title varchar(128) NOT NULL,
	body text NOT NULL,
	totalpage int NOT NULL,
	author varchar(128) NOT NULL,
	PRIMARY KEY (number)
) ENGINE=InnoDB CHARACTER SET=utf8;


물론 숫자 항목에도 따옴표를 넣을 수 있도록 어느 버전에서부터인가 변경되긴 했지만,
기본적으로 숫자항목에 값을 넣을 때는 따옴표를 붙이지 않습니다. 그리고 문자 항목에 값을 넣을 때는 반드시 따옴표를 붙이도록 되어 있습니다.

이제 2권의 서적이 책 장부에 기록되었을텐데요.
정말 그런가 한번 살펴볼까요?

내용을 살펴보는 명령어는 아래와 같습니다.

select * from 테이블

MariaDB [library]> select * from book;
+--------+--------------------------------------+-------------------------------
-------------+-----------+--------+
| number | title                                | body
             | totalpage | author |
+--------+--------------------------------------+-------------------------------
-------------+-----------+--------+
|      1 | 3D 모델링 블렌더 2.8                 | 블렌더의 신비! 그 고대의 비밀
을 풀어보자!  |       452 | 크레이 |
|      2 | 오토셋으로 구현하는 코드이그나이터 4 | 코드이그나이터4로 홈페이지를
만들어볼까요? |       500 | 크레이 |
+--------+--------------------------------------+-------------------------------
-------------+-----------+--------+
2 rows in set (0.000 sec)

MariaDB [library]>

와우~ 그러자 2권의 장부가 그 내용이 주루룩 펼쳐져 나왔습니다.
select 명령어는 테이블의 내용을 모두 보여주는 명령어인데요. 선택하라라는 뜻을 가지고 있습니다.

장부를 보여주는데 왜 굳이 '선택해라~' 라는 단어를 사용했을까요?
그것은 바로 이 명령이 본래 선택해서 보여주는 기능이기 때문입니다.

select * from book; 명령어를 풀어서 설명드리면 아래와 같습니다.

select * // 해석 보여줘라 모든 것을
from book // book (테이블) 으로부터

'*' 표 기호는 영어로 '아스테리스크'라고 해서 '모든 것'의 의미를 담고 있는데요.
모든 것, 여기서는 모든 항목을 의미합니다.
바로 number, title, body, totalpage, author 모두를 말입니다.

select 명령어를 다음과 같이 사용할 수도 있습니다.

select 항목리스트 from 테이블

MariaDB [library]> select title, totalpage, author from book;
+--------------------------------------+-----------+--------+
| title                                | totalpage | author |
+--------------------------------------+-----------+--------+
| 3D 모델링 블렌더 2.8                 |       452 | 크레이 |
| 오토셋으로 구현하는 코드이그나이터 4 |       500 | 크레이 |
+--------------------------------------+-----------+--------+
2 rows in set (0.001 sec)

MariaDB [library]>

이번에는 책 제목, 총페이지, 저자 항목만 select 명령어로 나열하여 보았습니다.
훨씬 간결해 보이시지요? 이렇게 노출할 항목만 선택해서 보여줄 수 있기 때문에 선택하라~, 선택해서 보여줘라~라는 의미로 select 명령어가 대부분의 sql 시스템에 채택되어 사용된 것으로 보입니다.

이러한 항목을 선택하여 나열하는 사용 방법은 나중에 코드 이그나이터로 연결해서 사용할 때도 매우 유용한데요.
그 이유는 바로 컴퓨터의 메모리를 절약해주기 때문입니다.

대학교 입학원서 접수할 때 쯤 서버 컴퓨터에 동시 과다 접속으로 인하여 서버컴퓨터가 마비되었다라는 뉴스를
접해 들으신 적이 있으신가요?
그것은 인터넷 속도가 한계에 다달아서 그런 경우도 있고 여러가지 변수적인 다양한 요소가 있지만,
그 다양한 변수적 요소 중 한가지로 select * 과 같은 명령어 사용문제를 뺄 수 없습니다.

실무에서 자주 등장하는 것 중 하나는 바로 메모리 초과 오류인데요.
이 문제 때문에 원인을 알 수 없어 헤메이는 경우를 많이 보아 왔습니다.
논리적으로 오류가 없어 보이고 평소에는 아무런 문제가 없기 때문입니다.

이러한 메모리 과다 사용 문제사용자가 많이 몰릴 경우에만 발생합니다.
select * 이 원인이 되는 이유가 무엇일까요?
지금 book ( 도서 ) 테이블에서도 간과할 수 없는 부분은 바로 body 항목입니다.

여기서 body 항목은 무려 65535글자(영어 기준) 를 담을 수 있는데요.
물론 이 항목을 모든 도서가 다 사용하지는 않지만, 한권당 평균 10,000글자만 담는다 하더라도
100권이면 1,000,000글자입니다. 이는 컴퓨터 메모리로 약 1Mbytes ( 메가바이트 ) 에 해당합니다.

예를 들어 봅시다. 한 페이지에 100개의 도서목록을 화면에 보여준다고 할 때,
사실상 body ( 책의 본문 ) 항목은 화면에 전혀 보여주지 않습니다. 이럴 때 select * 명령어를 사용하면 필요하지도 않은 1Mbytes의 용량의 메모리를 한 순간에 사용합니다.
그리고 그러한 사용자가 1,000명이 동시에 접속했다고 치면 무려 1Gbytes ( 1 기가 바이트 ) 의 용량이 의도치 않게 서버에서 사용됩니다.
참고로 여기서 말하는 동시 접속자수는 1초간 동시접속자수를 의미하지 않습니다.
정확히 말해 페이지 로딩이 시작되기부터 끝나기 전까지의 시간이 겹치는 모든 사용자를 의미하는데요.
페이지 로딩이 끝나기까지의 메모리를 서버에서 차지하고 있기 때문입니다.

이런 경우 처리시간이 지연되어 사용자의 페이지 로딩이 처음에는 1, 2초 안에 끝나지만 나중에 가서는 10초, 30초, 1분 등 점점 늘어나기 때문에 동접자수가 급등할 가능성이 있습니다.

이러할 때 사용할 수 있는 가장 좋은 방법은 바로 메모리 사용량이 많은 항목 ( 여기서는 body ) 를 선택하지 않는 방법입니다.
아래와 같은 명령어 사용법은 필요한 항목만을 나열하도록 하기 때문에 불필요한 body 항목을 서버메모리에 담지 않아 속도가 빠르고 메모리 사용면에서도 훨씬 이득입니다. 물론 필요할 경우에는 사용해야 겠지요 :)

select title, totalpage, author from book

또 한가지 이점을 들자면 Database 서버와 웹서버를 나누어 운영할 경우 불필요한 통신 트래픽 감소 효과 또한 이점으로 들 수 있습니다. 이 내용은 이해하실 수 있는 분만 참고도 기억해 두셔도 좋겠습니다.

 


이번 시간에 다룬 것은 MYSQL 을 비롯한 모든 데이터베이스 언어의 기초적이자 원초적 핵심 부분입니다.

다시한번 살펴볼까요?
장부에 한 줄을 기록하는 명령어는 아래와 같습니다.

insert into 테이블명 set
필드='값', 필드='값', 숫자필드=값,...

그리고 장부에 기록된 내용을 꺼내어 보여주는 명령은 아래와 같으며,

select * from 테이블

메모리 절약을 위해 필요한 항목만 선택해서 보여주는 명령은 아래와 같습니다.

select 항목, 항목, ...  from table

오늘도 여기까지 읽어주셔서 감사합니다.
여기를 다녀가시는 모든 분들에게 만물의 창조자 하나님의 은혜와 축복이 가득하시기를 소망합니다 :)