웹 애플리케이션 만들기 실습

MySQL

본 수업은 웹 애플리케이션 만들기 수업으로 대체 되었고, 2015년 6월 이후에 폐지됩니다. 개편된 수업에서 뵙겠습니다.http://opentutorials.org/course/1688

데이터베이스란?

데이터베이스란 데이터의 저장, 출력, 삭제, 수정과 같은 작업을 쉽고 안전하게 할 수 있도록 도와주는 시스템이다. 이해를 돕기 위해서 유사 데이터베이스인 엑셀을 보자.

좋아하는 영화

그림처럼 엑셀은 데이터를 표의 형식으로 저장해서 정보의 종류에 따라서 분류한다. 이런 특성 덕분에 '제목'을 기준으로 오름차순 정렬을 한다든지, 감독이 피터위어인 작품을 검색하는 것이 가능하다. 데이터베이스는 데이터를 표(table)라는 형식으로 저장해서 정렬, 검색, 그룹핑등을 할 수 있다. 엑셀과 다른 점은 이런 작업을 프로그래밍적으로 할 수 있다는 점이다. 그렇다면 '프로그래밍적'의 의미가 무엇일까?

SQL

지금까지 배운 HTML, CSS, JavaScript 처럼 데이터베이스도 SQL이라는 언어가 있다. 이 언어를 이용하면 데이터를 생성, 수정, 삭제, 열람을 할 수 있다. 예를 들어 위의 엑셀문서에서 감독이 오시이 마모루인 영화만 가져오고 싶다면 아래와 같이하면 된다.

SELECT * FROM `좋아하는 영화` WHERE 감독 = '오시이 마모루';

이 명령을 실행하면 엑셀 기준으로 아래와 같이 출력될 것이다.

패트레이버의 길이가 2:10이 아니고 2:20이라면 이 영화의 식별자인 '번호'를 기준으로 길이를 변경할 수 있다. 이를 위한 SQL문을 보자.

UPDATE `좋아하는 영화` SET 길이=2:20 WHERE 번호 = 4;

'프로그래밍적'으로 데이터를 관리한다는 말의 의미가 이해되는가? 명령을 입력해서 데이터를 조작하는 것이 불편하게 느껴질 수도 있다. 하지만, 앞으로 배울 PHP와 같은 언어를 이용하면 웹을 이용해서 데이터베이스에 제어할 수 있는데 이때 SQL이 사용된다. 또 데이터베이스 관리 소프트웨어를 사용하면 엑셀처럼 GUI(그래픽 유저 인터페이스) 환경에서 데이터를 조작할 수 있기 때문에 SQL 문법에 정통하지 않아도 데이터베이스를 사용하는 데는 큰 지장이 없다. 꼭 알아둬야 하는 SQL문은 딱 4줄이다. 필자는 이마저도 근 10년째 헷갈려서 자주 찾아본다. 헷갈리는 것은 습관이다. 겁먹지 말자.

  • 조회 - SELECT
  • 수정 - UPDATE
  • 삭제 - DELETE
  • 추가 - INSERT

스키마(scheme)

스키마란 데이터의 구조를 의미한다. 말이 어렵게 느껴질 수도 있는데 사실 별거 아니다. 이를테면 위의 예제를 가만 보면 정보의 구조가 있다. 번호, 제목, 길이, 감독이라는 정보로 구성되어 있고, 번호는 숫자, 제목과 감독은 문자, 그리고 길이는 시간이라는 포맷을 가지고 있다. 그리고 번호는 다른 항목과 중복되지 않는 유일무일한 식별자다. 이것이 정보의 구조다. 데이터베이스를 사용하려면 이 구조를 먼저 만들고, 그 구조에 맞게 데이터를 등록해야 한다. 정보의 구조를 설계하는 행위를 데이터 모델링이라고 부르는데, 이것은 개발의 편의, 유지보수의 복잡도, 시스템의 성능에 결정적인 영향을 미친다.

위의 예제와 같은 정보를 만드는 SQL 문은 아래와 같다.

CREATE TABLE `좋아하는 영화` (
    `번호`  int NOT NULL AUTO_INCREMENT ,
    `제목`  varchar(255) NOT NULL ,
    `길이`  time NOT NULL ,
    `감독`  varchar(20) NOT NULL ,
    PRIMARY KEY (`번호`)
)

TABLE은 표라는 뜻인데 데이터베이스는 표에 데이터를 담는다. CREATE TABLE `좋아하는 영화`는 '좋아하는 영화'라는 이름의 테이블을 생성하라는 명령이다. 괄호 다음에는 열(column, 예제에서는 번호, 제목, 길이등)의 정보가 어떤 형식인가를 지정하는데, 이를테면 '번호' 뒤의 'int'는 숫자 데이터라는 의미고, 'NOT NULL'은 꼭 데이터를 입력해야 한다는 의미다. PRIMARY KEY (`번호`)는 번호의 값이 중복되면 안 되는 유일무이한 식별자여야 한다는 의미다. 이 식별자를 기준으로 정보를 수정하고 삭제한다. 이 부분은 뒤에서 다시 한번 살펴볼 것이다.

데이터베이스에 대한 자세한 내용은 생활코딩 데이터베이스편을 참고 한다. http://opentutorials.org/course/195

MySQL

MySQL은 데이터베이스라는 장르에 속하는 제품으로 현재 ORACLE에서 무료/오픈소스로 제공되고 있다. 가장 많이 사용되는 고성능 데이터베이스 중의 하나다. 우리는 '개발 > 서버구축' 시간에 MySQL을 이미 설치했다. 이제 사용하는 방법에 대해서 알아볼 것이다.

opentutorials 모델링 실습

지금까지는 생활코딩 플랫폼인 opentutorials의 겉모습을 만들었다. 이제는 시스템의 내면을 설계할 차례다. 모델링을 시작하려면 우선 만들고자 하는 것이 어떤 정보들로 구성되어 있는지를 분석하는 것이 우선이다. 먼저 우리가 만들려고 하는 웹서비스의 UI를 보자.

이 중에 데이터베이스화할 수 있는 데이터를 뽑아보면 아래와 같다.

  1. 수업 제목 : 문자, 앞으로 수업을 토픽('topic')라고 부르겠다.


     
  2. 수업 내용 : 문자

위의 정보를 바탕으로 토픽을 테이블로 만들어보면 아래와 같다.

참고 opentutorials.org에서는 하나의 글을 토픽(topic)라고 부르고, 토픽의 집합인 수업을 모듈(module)라고 부른다. 또 모듈을 묶어서 만든 메뉴를 코스(course)라고 부른다.

이름 데이터베이스 내에서 사용할 이름 데이터 타입 데이터 타입 설명
번호 id int 숫자,
토픽(수업) 제목 title varchar(255) 최대 255자인 문자
토픽 내용 description text 길이 제한 없이 문자 사용 가능
토픽 생성시간 created datetime 2012-04-04 06:16:51 와 같은 형식으로 시간을 표현

Table, Row, Column, Field의 관계

실제로 데이터베이스 스키마를 생성하기 전에 알아둘 것이 있다. 데이터베이스는 데이터를 표(table)의 형식으로 저장한다. 아래 그림을 보자.

Row는 행을 의미하고 Column은 열, Field는 행과 열이 교차하는 칸을 의미한다. 열은 토픽의 제목, 토픽내용, 토픽 생성시간과 같이 데이터의 종류별로 그룹핑되고, 행은 서로 연관된 데이터들의 그룹을 의미한다. 아래의 그림을 보자.

열은 번호, 제목, 길이, 감독처럼 데이터의 종류에 따라서 그룹핑되고, 행은 '1, 공각기동대, 1:30, 오시이 마모루'처럼 연관된 데이터끼리 그룹핑된다. 열과 행의 관계에 대해서 잘 따져보자.

접속

이제 실제로 작업을 시작해보자. 우선 터미널을 실행한 후에 아래와 같이 입력한다.

mysql -uroot -p 

비밀번호를 입력하면 설치과정에서 등록했던 비밀번호를 입력한다.

 

참고 이 명령은 MySQL Monitor라는 프로그램을 실행한다. 이 프로그램은 MySQL에서 기본적으로 제공하는 데이터베이스 클라이언트인데, 이 프로그램을 이용해서 MySQL 서버를 제어할 수 있다. 이 프로그램 자체가 MySQL이라고 착각하기 쉽지만, 실제로 데이터가 저장되는 곳은 서버고 서버에 접속해서 데이터를 제어하는 것은 클라이언트다. MySQL Monitor 외에 많은 클라이언트가 있고 이런 클라이언트를 사용하면 엑셀처럼 편리하게 데이터베이스를 제어할 수 있다.  http://opentutorials.org/course/195/1413

참고 수업의 코드를 복사&붙여넣기 할 때는 우분투에서 마우스 오른쪽 클릭을 한 후에 '붙여넣기' 혹은 'paste' 항목을 선택하면 된다.

 

데이터베이스 생성

로그인에 성공하면 이제 데이터베이스를 생성한다. 여기서 의미하는 '데이터베이스'는 데이터를 저장하는 시스템을 통칭하는 용어로서 데이터베이스가 아니라 연관된 테이블들을 그룹핑하는 단위다. 비유하자면 테이블이 파일이라면 데이터베이스는 디렉터리라고 할 수 있다. 아래의 SQL문을 이용해서 opentutorials라는 이름의 데이터베이스를 생성할 수 있다.

CREATE DATABASE opentutorials CHARACTER SET utf8 COLLATE utf8_general_ci;

아래와 같은 화면이 보인다면 데이터베이스의 생성에 성공한 것이다.

방금 생성한 데이터베이스에 들어가자. 아래 명령을 실행하면 opentutorials 디렉터리로 들어가게 된다. 그 상태에서 명령을 내리면 opentutorials 디렉터리에 있는 테이블들을 대상으로 작업이 수행된다. cd 명령으로 디렉터리에 들어가는 것과 같은 원리다.

use opentutorials;

테이블 생성

아래는 지금까지의 상황을 종합해서 만든 스키마다. 복사&붙여넣기 해서 실행하자.

CREATE TABLE topic (
    id  int(11) NOT NULL AUTO_INCREMENT,
    title  varchar(255) NOT NULL ,
    description  text NULL ,
    created  datetime NOT NULL ,
    PRIMARY KEY (id)
);
위의 내용을 선택할 때 더블클릭을 사용하지 말자. 몇가지 이유로 붙여넣기를 했을 때 오류가 발생할 것이다. 코드를 드래그해서 선택한 다음에 붙여넣기 한다. 

각 구문의 의미는 아래와 같다.

  • CREATE TABLE `topic` (
    topic 테이블을 생성한다.
  • `id`  int(11) NOT NULL AUTO_INCREMENT ,
    id 컬럼은 숫자형이고 조회시 11자리까지 보여준다. 입력필수(값을 반듯이 입력해야 한다). 값을 특정하지 않으면 자동으로 가장 큰 값이 생성된다. (중복방지)
  • `title`  varchar(255) NOT NULL ,
    title 칼럼은 가변형 텍스트이고 최대 255자리까지 입력된다. 입력필수.
  • `description`  text NULL ,
    description은 길이 제한이 없는 텍스트 형이고 입력은 옵션이다.
  • `created`  datetime NOT NULL ,
    created은 2012-04-04 06:16:51와 같은 시간의 형식이 오고, 입력필수다.
  • PRIMARY KEY (`id`)
    id는 유일무이한 값이어야 한다.
  • );
    ';'는 명령이 끝났다는 것을 알려준다. ';'를 사용하지 않으면 명령의 실행이 유보된다.

 

데이터 입력

topic 테이블을 생성했다. 이제 데이터를 저장할 만반의 준비가 됐다. 아래 명령을 이용해서 빈테이블을 조회해보자.

SELECT * FROM topic;

각 구문의 의미는 아래와 같다.

  • SELECT
    테이블의 데이터를 조회한다. 
  • *
    모든 컬럼에 대한 조회 결과를 보여준다. 만약 일부 결과만을 원한다면 '*' 대신에 'title, description' 으로 변경
  • FROM topic;
    topic 테이블에서 조회한다.

자 이제 데이터를 입력해보자.

INSERT INTO `topic` (title,description,created) VALUES ('JavaScript란', '<h2>\r\n    자바스크립트는</h2>\r\n<ul>\r\n	<li>\r\n		브라우저에서 실행되는 언어</li>\r\n	<li>\r\n		가장 많이 사용되는 언어</li>\r\n	<li>\r\n		주로 html을 프로그래밍적으로 조작하기 위해서 사용됨</li>\r\n</ul>\r\n<h2>\r\n	예제</h2>\r\n<ul>\r\n	<li>\r\n		자바스크립트는 3가지 방식으로 사용됨</li>\r\n	<li>\r\n		외부의 파일을 로드</li>\r\n	<li>\r\n		&lt;script&gt;태그 사이에 기술</li>\r\n	<li>\r\n		태그에 직접 기술</li>\r\n</ul>\r\n<h2>\r\n	참고링크</h2>\r\n<ul>\r\n	<li>\r\n		<a href=\"http://www.maroon.pe.kr/webmaster/java/java_study.html\" target=\"_blank\">스크립트 세상</a></li>\r\n	<li>	\r\n</ul>\r\n', now());
INSERT INTO `topic` (title,description,created) VALUES ('변수와 상수', '<p>\r\n	변수란</p>\r\n<ul>\r\n	<li>\r\n		변하는 값</li>\r\n	<li>\r\n		x = 10 일 때 왼쪽항인 x는 오른쪽 항인 10에 따라 다른 값이 지정된다.</li>\r\n</ul>\r\n<p>\r\n	상수란</p>\r\n<ul>\r\n	<li>\r\n		변하지 않는 값</li>\r\n	<li>\r\n		x = 10 일 때 오른쪽항인 10이 상수가 된다.</li>\r\n</ul>\r\n<pre class=\"brush: xml\">\r\n&lt;script type=&quot;text/javascript&quot;&gt;\r\n&nbsp;&nbsp;&nbsp; // x의 값이 오른쪽 항에 따라서 변한다.\r\n&nbsp;&nbsp;&nbsp; // x가 변수라는 명시적인 의미\r\n&nbsp;&nbsp;&nbsp; var x = 10;\r\n&nbsp;&nbsp;&nbsp; alert(x);\r\n&nbsp;&nbsp;&nbsp; var x = 20;\r\n&nbsp;&nbsp;&nbsp; alert(x);\r\n&lt;/script&gt;</pre>\r\n<p>\r\n	&nbsp;</p>\r\n', now());
INSERT INTO `topic` (title,description,created) VALUES ('연산자', '<p>\r\n	연산에 사용되는 기호들. (y = 5 일 때)</p>\r\n<table class=\"table\">\r\n	<tbody>\r\n		<tr>\r\n			<th align=\"left\" width=\"15%\">\r\n				Operator</th>\r\n			<th align=\"left\" width=\"40%\">\r\n				Description</th>\r\n			<th align=\"left\" width=\"25%\">\r\n				Example</th>\r\n			<th align=\"left\" width=\"20%\">\r\n				Result</th>\r\n		</tr>\r\n		<tr>\r\n			<td valign=\"top\">\r\n				+</td>\r\n			<td valign=\"top\">\r\n				더하기</td>\r\n			<td valign=\"top\">\r\n				x=y+2</td>\r\n			<td valign=\"top\">\r\n				x=7</td>\r\n		</tr>\r\n		<tr>\r\n			<td valign=\"top\">\r\n				-</td>\r\n			<td valign=\"top\">\r\n				빼기</td>\r\n			<td valign=\"top\">\r\n				x=y-2</td>\r\n			<td valign=\"top\">\r\n				x=3</td>\r\n		</tr>\r\n	</tbody>\r\n</table>\r\n', now());
INSERT INTO `topic` (title,description,created) VALUES ('JSON', '<h2>JSON이란?</h2>\r\n\r\n<p>서로 다른 언어들간에 데이터를 주고 받는 여러 방법이 있다. 대표적인 것이 XML인데, XML은 문법이 복잡하고, 엄격한 표현규칙으로 인해서 json 대비 데이터의 용량이 커진다는 단점이 있다.</p>\r\n\r\n<p>JSON은 경량의 데이터 교환 형식으로 JavaScript에서 숫자와 배열등을 만드는 형식을 차용해서 이것을 다른 언어에서도 사용할 수 있도록 한 텍스트 형식이다.&nbsp;</p>\r\n\r\n<p>아래 예제는 위의 예제에서 전송한 데이터를 받아서 몇가지 부가정보를 추가해서 json으로 인코드한 후에 다시 반환하는 PHP 코드다.&nbsp;</p>\r\n\r\n<p>json.php - (<a href=\"https://github.com/egoing/codingeverybody_javascript/blob/master/JSON/json.php\" target=\"_blank\">github</a>)</p>\r\n\r\n<pre class=\"brush: php\">\r\n&lt;?php\r\n$userinfo = json_decode($_GET[&#39;data&#39;]);\r\n$userinfo-&gt;address = &#39;seoul&#39;;\r\n$userinfo-&gt;phonenumber = &#39;01023456789&#39;;\r\necho json_encode($userinfo);\r\n?&gt;</pre>\r\n\r\n<h2>json의 형식</h2>\r\n\r\n<h3>object</h3>\r\n\r\n<p>객체는 아래와 같은 문법을 가지고 있다.</p>\r\n\r\n<p>예제</p>\r\n\r\n<p>{&quot;userid&quot;:&quot;egoing&quot;,&quot;pwd&quot;:&quot;12345567&quot;}</p>\r\n\r\n<p><img height=\"113\" src=\"http://www.json.org/object.gif\" width=\"598\" /></p>\r\n\r\n<h3>array</h3>\r\n\r\n<p>배열은 아래와 같은 문법을 가지고 있다.&nbsp;</p>\r\n\r\n<p>예제</p>\r\n\r\n<p>[1,2,3,4]</p>\r\n\r\n<p><img height=\"113\" src=\"http://www.json.org/array.gif\" style=\"line-height: 1.8em;\" width=\"598\" /></p>\r\n\r\n<h3>Value</h3>\r\n\r\n<p>위에서 사용된 Value는 값을 의미하는데&nbsp;큰 따옴표로 묶인 문자나 숫자, 불린 값이 사용된다.</p>\r\n\r\n<p>예제</p>\r\n\r\n<ul>\r\n	<li>문자 : &quot;헬로우 월드&quot;</li>\r\n	<li>숫자 : 1</li>\r\n	<li>불린 : true</li>\r\n</ul>\r\n\r\n<p><img height=\"278\" src=\"http://www.json.org/value.gif\" width=\"598\" /></p>\r\n', now());

각 구문의 의미는 아래와 같다.

  • INSERT
    데이터를 입력한다.
  • INTO topic
    topic 테이블에 데이터를 입력한다.
  • (title, description, created)
    뒤에 따라오는 VALUES의 값이 title, description, created 순이라는 것을 의미한다. 스키마와는 다르게 id가 없는 것은 스키마에서 id 값으로 AUTO_INCREMENT를 지정했는데, 이 특성이 부여된 컬럼은 자동으로 가장 큰 값이 추가되기 때문에 INSERT 명령이 실행될 때마다 제일 큰 값이 부여된다. 덕분에 데이터가 중복되는 문제를 방지 할 수 있다.
  • VALUES ('...', '....', '....')

데이터가 잘 입력 됐는지 확인해보자. '\G'은 컬럼의 수가 많을 때 화면이 깨지는 문제를 우회하기 위한 방법으로 칼럼이 수직으로 출력된다.

SELECT * FROM topic\G

결과는 아래와 같다.

우리가 만들고 있는 opentutorials 서비스의 특징은 최신글이 나중에 오고, 오래된 글이 처음으로 정렬되는 특성을 가지고 있다. 이를 위해서는 데이터를 조회할 때 정렬 방법을 지정해야 하는데 아래와 같이 한다.

SELECT * FROM topic ORDER BY Id ASC;

ORDER BY id ASC 는 id 칼럼을 기준으로 작은 값이 먼저 출력되도록 정렬한다는 의미다. 반대로 정렬하고 싶으면 ASC 대신에 DESC를 사용하면 된다.

정리

여기까지다. 만들려는 서비스에 맞게 테이블을 만들고, 이 테이블에 데이터를 저장한 후에 이것을 필요에 따라 조회하면 원하는 정보를 얻을 수 있다. 대부분의 웹서비스들이 이렇게 정보를 저장, 수정, 삭제, 조회하는 작업을 웹상에서 수행하는 것을 목적으로 하기 때문에 웹서비스에 있어서 데이터베이스는 심장이라고 할 수 있다. 다음 시간에는 이 데이터베이스를 웹을 통해서 조작하는 방법에 대해서 알아볼 것이다. 고지가 코앞이다.

댓글

본 수업은 웹 애플리케이션 만들기 수업으로 대체 되었습니다. 개편된 수업에서 뵙겠습니다. 본 수업은 2015년 6월 이후에 폐지됩니다. http://opentutorials.org/course/1688

 

궁금하신 점은 각 강의의 댓글로 문의해주세요. 답변이 없는 것은 운영자가 못 봤거나 모르는 것입니다. 생활코딩 커뮤니티에 질문하면 더 많은 분의 도움을 받을 수 있습니다. 그리고 문제를 해결했다면 본문의 댓글로 공유해주시면 다른 분에게 큰 도움이 됩니다. 원하는 답변을 얻는 것은 확률의 문제입니다. 질문의 품질이 높으면 그 확률도 올라갑니다. 질문자의 상황을 더 잘 전달하기 위해서 screenr.com이나 이미지 캡처의 이용을 권합니다.

 

댓글 본문
  1. 강석태
    Kangui-MacBook:~ KangSeoktaeMac$ ./mysql -uroot -p
    -bash: ./mysql: No such file or directory

    이렇게 뜨네요 .. ㅜㅜ
    인터넷 뒤져보다가 sudo 명령어를 사용해서 해봤는데도 이럽니다.

    Kangui-MacBook:~ KangSeoktaeMac$ sudo ./mysql -uroot -p
    Password:
    sudo: ./mysql: command not found

    뭐가 문제일까요?
  2. Jchg
    ./mysql 로 해보세요~
    대화보기
    • 강석태
      데이터베이스 실습2에서
      mysql -uroot -p
      를 하면
      command not found 라고만 뜨는데 어떻게 해야 할까요?

      여기서 막히네요..

      Kangui-MacBook:~ KangSeoktaeMac$ mysql -uroot -p
      -bash: mysql: command not found
      Kangui-MacBook:~ KangSeoktaeMac$ mysql -uroot -p
      -bash: mysql: command not found
    • 김성철(sck_love@yahoo.com)
      방금 답글은 1년전의 PAUL님께 드린 것입니다.
    • 김성철(sck_love@yahoo.com)
      데이타베이스를 만들면 테이블 데이타는 MySQL 서버컴퓨터측의 data-directory에 (하드 디스크입니다) 저장됩니다.
      데이타 서버는 주로 인터넷 너머의 어딘가에 있습니다. 인터넷 없이는 SQL은 쓰지 못합니다.
      그러나 인터넷 없이 SQL을 사용하려면, development server를 자기 PC에 구현을 하면 됩니다.

      dev.mysql.com, http://www.mysql.com에 접속하셔서
      윈도우 버전용 MySQL 커뮤니티 서버(무료)를 다운로드 하신 다음,
      PC에 설치하면 됩니다.
      그러면 localhost 라는 서버이름으로 자기 컴퓨터에서 mysql이 작동합니다.

      답이 되었는지요...
      대화보기
      • 김성철(sck_love@yahoo.com)
        박홍홍님.
        MySQL에서 로그인 패스워드가 정상적으로 매치되었는데도 저런 에러가 나오면,
        Mysql.user table이 사용자 셋팅이 제대로 안되어서 그런 것입니다.
        보통 다른 사용자로 로그인했을 때 그런 에러가 나면,
        root로 로그인한 다음, alter user sck@loclahost = password("비번"); 한 다음
        grant user 에서 select, update, delete등의 권한을 그 사용자에게 주는 과정이 필요합니다.
        이것이 안되면 로그인해서 들어갈 수 있어도 select 문등을 사용할수 없게 됩니다.
        제가 머릿속의 기억으로만 명령어를 기억해서 대충 말씀드렸는데,
        MySQL 5.x(5.0-5.7) 레퍼런스 매뉴얼이 있는 곳(영문임)을 말씀드릴께요.

        http://dev.mysql.com......en/
        (영문 매뉴얼입니다)

        일단 MySQL 버전을 알아야 합니다. 버전을 몇 쓰시는지요?
        일단 5.7의 홈페이지를 위에 써 드렸으니까 여기서 찾아보세요.
        여기가 MySQL의 공식 홈페이지입니다.

        제가 보기에는 귀하의 에러가 로그인 패스워드 문제인지도 모른다는 생각이 듭니다.
        어떠한 mysql 명령어를 친 것도 아닌데, 저런 에러가 나온다는 것은 security 쪽에 문제가 생겼다는 것입니다.
        그것도 root 유저인데, 그런 에러가 난다면 패스워드를 의심하지 않을 수 없습니다.
        저도 MySQL 을 리눅스 머신에 설치할 때 많은 애를 먹었습니다.
        설치가 다 끝났어도 mysql client로 로그인해서 들어갈 때 시큐리티 에러가 나서 사용도 못해본 적이 있는데요...
        mysql 은 설치가 다 끝난 다음에, data directory를 initializing하는 작업이 꼭 필요합니다.
        이 때 이 작업을 안하면 mysql client를 사용할 수 없게 됩니다.
        mysql 5.7.6이전과 이후의 경우, 각각 다르게 install을 해야 하므로 버전번호를 꼭 확인하십시오.

        http://dev.mysql.com......en/data-directory-initialization.html
        (데이타 디렉토리 초기화 문서입니다)

        그리고 한가지 포인트가 있는데,
        리눅스나 유닉스에서 chown, chgrp 등으로 mysql 디렉토리와 그 하위 디렉토리의 ownership을
        mysql, sck(내이름), ... 등으로 설치한 사용자의 id로 chown, chgrp을 해야 합니다.
        이것을 하지 않으면, mysqld (데몬, 즉 서버)가 뜰때 사용자의 시큐리티가 문제가 되어 시작을 할 수 없게 됩니다.
        절대로, root user id로 chown, chgrp을 하면 안됩니다. 일반 사용자의 id로 해야만 합니다.

        그리고, mysql의 설치된 디렉토리 중,
        ./scripts 디렉토리 속에 스크립트 파일이 있는데, 이것을 실행해야만 root user password가 초기화됩니다.
        mysql의 root 사용자 password는 그 리눅스 머신의 root나 일반 사용자 암호가 통하지 않고 별도의 암호체계를
        갖추고 있습니다. mysql의 root password는 리눅스 머신의 root password와는 별개의 다른 암호입니다.
        이 스크립트가 실행되어야만 mysql의 root password가 다음 파일속에 만들어집니다.
        (자동으로 생성되는 암호이므로, 첫번 mysql client 로그인 후 바꿔주어야만 합니다.)

        $HOME/.mysql_secret 이라는 파일

        이 파일속의 암호를 그대로 복사하여 mysql client 로그인시 입력해 주세요.
        그러면 security error는 사라질 것입니다.

        그리고 mysql client에서 다음의 명령을 실행하세요.

        mysql> SET PASSWORD 'root'@'localhost' = PASSWORD('new-password');

        위와 같이 새로운 패스워드로 바꿀 때, 반드시 위의 방식대로 해야만 합니다.
        이렇게 하고 난 뒤, mysql client log out 후, 다시 로그인해 보십시오.
        그래서 새 패스워드가 잘 작동하면 된 것입니다.
      • egoing
        아래 수업으로 갈아타는 것도 추천드려요.
        https://opentutorials.org......688
        대화보기
        • egoing
          박홍홍님 어렵겠지만 질문하는 방법을 개선해보세요. 가지고 있는 단서를 최대한 논리적이고 자세하면서 너무 장황하지 않게 정리해서 공유해주시면 도움 받을 수 있을 확률이 높아질꺼예요. 좌절하지말고 힘내기요.
          대화보기
          • 김수빈
            그러면 호스팅을 바꾸시면 됩니다. 해결방법은 가장 간단한것이 이거말곤 없네요.
            지금 이 강의 말고 세로 만들어진 강의를 보시는것을 추천 드립니다.

            비트나미 을 이용해서 MySQL 접속을 하기 때문에, 그런 오류는 없을거 같네요.
            혹시 몰라서 무료 호스팅 업채 알려드립니다.
            http://homp.kr (홍보 아닙니다. 사용해보니 sql 접속 잘 되네요)
            대화보기
            • 박홍홍
              안되네요 ㅜㅜ 도대체 뭐가 문제인지 .. 여기서 막혀서 못나가고있네요 ㅜㅜ
              대화보기
              • 김수빈
                보안상의 이유로 pw 는 화면에 표기 되지 않습니다.
                일반적으로 사이트에 들어가서 로그인을 할때 비번은 ***** 이렇게 표시되는것과
                같은 원리이니 무시하시고 입력하시면 됩니다.
                대화보기
                • 김수빈
                  웹 호스팅의 경우 MySQL 접속이 제한됩니다.
                  보면 $ 으로 되어 있는데, root 권한이여야 접속이 됩니다.

                  지금 뜨는에러는, 권한이 없는 메세지 같습니다.
                  혹시 mysql -ujihong -p비번 -hlocalhost 라고 입력하시면 될것같습니다.
                  대화보기
                  • 박홍홍
                    이미지가 안올라가네요 ㅜ 아뇨 mysql -uroot -p치고 엔터치면 일단 패스워드 입력하라고 나오고 패스워드입력하고 엔터치면 저리 나옵니다. 패스워드는 우분투로긴할때 쓰는 그 패스워드 그대로 정확히 쳤습니다.

                    아래가 그대로 복사한 것입니다!

                    jihong@jihong-VirtualBox:~$ mysql -uroot -p
                    Enter password:
                    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
                    jihong@jihong-VirtualBox:~$
                    대화보기
                    • egoing
                      엔터치면 그런 메시지가 바로 뜨나요? 캡쳐 부탁이요
                      대화보기
                      • 박홍홍
                        mysql -uroot -p을 하고 엔터치면 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)이런 에러가 뜹니다 ㅜ 뭐가 문제일까요?
                      • 김궁금
                        한 일주일에 걸쳐서 클라이언트 부분까지는 꼭꼭 씹어 섭취했는데

                        서버에서는 그냥 코드 복붙같은 느낌이어서 뭘 이해해야하는지 모르겠습니다.

                        db관리도 어떻게 수정해야되는지 잘 모르겠고, 잘 입력한건지 아닌지도 모르겠고..

                        윈도우처럼 파일 열어서 관리할 수 있는 방법은 없을까요?
                      • 찐똥구리구리
                        \r\n은 무엇인가요?? db에 인서트 하면 그대로 올라가서 보여집니다...ㅠㅜ
                      • 코드러너
                        스키마의 영어철자가 틀렸습니다. scheme->schema
                      • 딩코
                        제가 실수해서 id값이 바뀌었습니다 1번쨰 javascript란? 하고 2번째 변수와상수가 바뀌어서 id:1이 변수와 상수가 되고 id2가 javascript란? 이 되었는데 id 바꾸는 명령어는 뭔가요 ㅠㅠ
                      • 김한희
                        중간에 헤메느라 제가 잘 못 따라한건지..

                        마지막에 데이터 입력하는 명령어 복붙하니까 서버를 찾을수 없다는 에러가 뜹니다..

                        데이터베이스 생성, 테이블 생성까진 성공한것같은데.. 서버는 어떻게 해야하죠? ㅠㅠㅠ
                      • zoeas
                        신민호 / 각 메뉴마다 내용이 있죠.

                        변수와 상수
                        연산자
                        json

                        이렇게 있는데 예를들어 `연산자`를 클릭한다면 그 내용이 오른쪽 페이지에 보여야됩니다
                        이것을 DB로 구현할려면 DB에
                        연산자라는 항목에 내용을 넣어놓고
                        변수와 상수라는 항목에 내용을 넣어놓고
                        json이라는 항목에 내용을 넣어놓고 있다가
                        클릭시 DB에서 항목 이름을 검색해서 만약 json이면 json에 넣어져 있던 내용을 꺼내서
                        오른쪽에 보여주는 것입니다
                      • 신민호
                        왼쪽 NAV에 리스트되어있는 부분을 웹 페이지를 만들고 링크를 하는것과
                        데이터베이스로 관리하는것에 대한 이해가 부족하네요.
                        설명좀 해주세요
                      • 심드렁
                        공부를 할 수록 감사함을 느낍니다. 오늘도 열심히!
                      • asp.net으로 실습을 하고 있습니다. 완전 초보라ㅜㅜ
                        MySQL을 설치하고 insert 구문을 실행해서 데이터를 입력하는데 에러가 납니다. (provider: Named Pipes Provider, error: 40 - SQL Server에 대한 연결을 열 수 없습니다.) *.mdf에는 insert 잘되구요 mssql에도 잘 됩니다. 헌데, mysql이나 mariadb에는 안됩니다.

                        워크벤치를 써서 세팅을 바꿔보려 하고 있는데요 일단 tcp/ip, named pipe 조절을 잘 했는지 안했는지 사용법이 에매해서... 터미널을 이용해 명령어를 입력하는 것도 낮설어 메뉴얼대로 치고는 있는데 잘하는건지 아닌지 모르겠고 합니다. ㅜㅜ 이런 상황을 벗어날 방법이 있을까요?
                      • 왕초보자
                        그누보드를 MySQL이나 PHP 버전이 다른 서버로 이전할 경우 로그인도 안되는 증상이 있던데,
                        높은 버전에서 낮은 버전으로 변경하는 법과 낮은 버전에서 높은 버전으로 변경하는 법 좀 부탁드립니다.


                        높은 버전
                        PHP 버전 5.3.8
                        MySQL 버전 5.5.18

                        낮은 버전
                        PHP 버전 5.2.17
                        MySQL 버전 5.0.90
                      • JPARK
                        윈도우 버튼 + R 그런다음 검색어 창에 cmd 라고 치면 됩니다.
                        대화보기
                        • beaver
                          윈도우 8 에서는 터미널을 어떻게 실행시키나요? ctrl + alt + T 단축키 눌렀는데 안되요
                        • egoing
                          저장된 정보는 데이터베이스가 설치된 서버쪽 컴퓨터에 사실은 파일로 저장이 됩니다. mysql은 인터넷을 통해서 접속할 수 있는 컴퓨터에 있어야 하고요. 그것을 제어할 때만 인터넷에 접속을 하시면 됩니다. 한번 설정을 끝내면 혼자서 돌아가면서 서비스를 제공하겠죠? ^^
                          대화보기
                          • Paul
                            데이터 베이스를 만들면 거기에 들어가는 테이블 같은 데이터는 어디에 저장이 되는 건가요? 데이터 서버가 제 컴퓨터에 있는건가요? 그리고 mysql에 접속한다고 하셨는데 그럼 인터넷이 없으면 sql은 쓰지 못하는건가요? 너무 기초적인 질문 드려서 죄송합니다 ㅠㅠ 처음 배우는 거라서...
                          • 김세광
                            똑같이 따라하는데, MySQL에서 데이터베이스를 만드는 부분, 즉
                            CREATE DATABASE opentutorials CHARACTER SET utf8 COLLATE utf8_general_ci;
                            명령어를 입력하면 ERROR 13 (HY000): Can't get stat of './epik' (Errcode: 13) 에러가 발생하는 분은

                            http://dba.stackexchange.com......ase

                            위의 링크를 참조하세요.

                            /var/lib에 MySQL이 존재하는데 배웠던 ls -al로 권한을 보면 MySQL의 유저가 root로 되어 있어서 쓰기 권한이 필요한 에러라는 말 같습니다. 위의 링크에 나온대로 sudo를 사용해 MySQL의 유저를 root에서 MySQL로 바꿔주면 데이터 베이스 생성이 됩니다.
                          • 강산
                            복사 붙여넣기 했을 때 에러가 자꾸 떠서 진행이 안되네요
                            네 줄 모두 한꺼번에 복사해서 붙여넣기하면 자꾸 터미널이 꺼져서 첫 줄 에러 내용만 여기에 올릴께요

                            INSERT INTO `topic` (title,description,created) VALUES ('JavaScript', '<h2>\r\n $m^A,k&=m
                            '> 8k
                            '> </h2>\r\n<ul>\r\n <li>\r\n k8^Lk^]<l^Z0l warnings l
                            '> ^\ l^K$m?k^Xk
                            '> l?l?</li>\r\n <li>\r\n j0l^^% k'? l^]4 l^B,l^Z)k^Xk
                            -> l?l?</li>\r\n <li>\r\n l#<k!^\ htmll^]
                            ERROR 2005 (HY000): Unknown MySQL server host '<li>rn' (0)
                            mysql> m
                            -> k!^\j78k^^^Xk0
                            -> ^Xj80 l^\
                            -> 4l
                            -> ^\ l^B,l^Z)k(</li>\r\n</ul>\r\n<h2>\r\n ll ^\</h2>\r\n<ul>\r\n <li>\r\n l^^0kl
                            ERROR 2005 (HY000): Unknown MySQL server host 'll' (0)
                            mysql> $m^A,k&=m
                            -> 8k
                            -> 3j0l' k0)l^K^]l^\<k!^\ l^B,l^Z)k(</li>\r\n <li>\r\n lm8k6l^]^X m^L^Ll^]<l^]
                            '> k!^\k^\</li>\r\n <li>\r\n &lt;script&gt;m^C^\j78 warnings j80 </li>\r\n <li>\r\n warnings l'^Al ^Q j80 </li>\r\n</ul>\r\n<h2>\r\n l08j3 k'^Am^A,</h2>\r\n<ul>\r\n <li>\r\n <a href=\"http://www.maroon.pe.kr/webmaster/java/java_study.html\" target=\"_blank\">l
                            ERROR 2005 (HY000): Unknown MySQL server host 'l08j3' (0)
                            mysql> $m^A,k&=m
                            -> 8 l
                            -> 8l^C^A</a></li>\r\n <li> \r\n</ul>\r\n', now());
                            ERROR 2005 (HY000): Unknown MySQL server host '<li>' (0)



                            도와주세요 ㅜㅜ
                          • roo_o
                            저도 html과 css 위주로 배우려고 왔는데, 서버나 commit하는 부분 그리고 mysql은 선행 및 필요한 부분을 따로 공부하지 않으면 따로 알수 없는 내용입니다. egoing님이 일부 필요한 부분만 가져다가 사용하시는 것이니 어려우시더라도 그냥 이렇게 쓰는거구나 하고 따라하시고 넘기시면 좋을 것 같네요.
                          • egoing
                            여기서 이해가 안되면 나중에 작심 40시간 등을 통해서 공부하시면 이해가 될꺼예요. http://opentutorials.org......029

                            그러니 계속 전진하시면 됩니다. 지식이라는 것이 벽돌처럼 쌓아나가는 맛도 있지만, 고인물처럼 스며드는 면도 있거든요. 계속 노출되면 언젠가는 알게 됩니다!
                            대화보기
                            • leeta
                              여기 토픽 부분들이 ..그냥 아~ 이렇게 흘러가는 구나 만 알면 될까요?
                              ....html css듣고 여기 오니 좀 어렵네요 ㅜ 우분투도 설치가 잘 안되고 해서 직접적으로 들어야 이해가 갈것 같습니다 ㅠ
                            • egoing
                              타이핑이 안되는 것 같지만 실제로는 되고 있는 것입니다.
                              믿음을 가지시고 입력하고 엔터를 쳐보세요. ^^
                              http://youtu.be......22s
                              대화보기
                              • dudegi
                                이고잉님께서 알려주신대로 아마존 웹서비스 환경을 사용하고 있습니다.
                                자바ssh로 접속후에
                                mysql -uubuntu -p 입력한뒤에
                                enter password 입력하는 창에서 비밀번호를 입력해도 타이핑이 안됩니다.ㅠㅠ
                                명령어 입력하는 걸로 봐서 키보드가 작동하지 않는 것도 아닌데
                                비밀번호 입력하라는 곳에서 비밀번호 111111 가 입력이 안되는 건 무슨 문제인 걸까요? ㅠㅠ
                              • dudegi
                                이고잉님께서 알려주신대로 아마존 웹서비스 환경을 사용하고 있습니다.
                                자바ssh로 접속후에
                                mysql -uubuntu -p 입력한뒤에
                                enter password 입력하는 창에서 비밀번호를 입력해도 타이핑이 안됩니다.ㅠㅠ
                                명령어 입력하는 걸로 봐서 키보드가 작동하지 않는 것도 아닌데
                                비밀번호 입력하라는 곳에서 비밀번호 111111 가 입력이 안되는 건 무슨 문제인 걸까요? ㅠㅠ
                              • storys
                                버릇처럼 SQL Monitor 명령어 입력중에 컨트롤+C 눌러 버리는 경우가 있습니다.
                                이럴때 sql Monitor가 백그라운드로 스톱해서 들어가 버리고 그냥 터미널로 빠져 나오게 되는데요.
                                오랜만에 리눅스 쓰다보니 다 잊어 버려서
                                백그라운드 프로세스를 중지 시키지 못해 고민하다가
                                터미널 상에서 jobs 명령어와 fg 명령을 때려잡아서 찾아냈네요.

                                행여 같은 고민 하시는 분이 계시까봐 이렇게 적어 봅니다.
                              • manta
                                cut & paste가 되지 않다 보니 '테이블 생성'의 터미널 입력 예제를 보고 했는데 AUTO_INCREMENT가 빠져 있어, 그 다음의 INSERT 명령이 모두 에러가 났습니다. 무사 돌파하고 다음으로 나갑니다.^^
                              • Huck
                                똑같은 현상이네요 ㅎㅎ 저도 걍고
                                대화보기
                                • egoing
                                  에러내용을 공유해주세요
                                  대화보기
                                  • gyun
                                    안녕하세요... 강의 감사히 잘 듣고 있습니다~

                                    저두 INSERT 를 이용해서 데이터 입력하는 부분에서 막히는데요..ㅠ
                                    일일이 메모장으로 옮겨 세미콜론 있는지 확인해보고 해도
                                    자꾸 warning이 뜨네요. 4줄 한꺼번에 해도 뜨고, 하나씩 해도 뜨고,,

                                    뭐가 문젠지 잘 모르겠습니다!
                                  • buffy
                                    헤헤, 감사합니당~!
                                    대화보기
                                    • egoing
                                      exit라고 입력하시면 됩니다~
                                      대화보기
                                      • buffy
                                        저도 insert 연습 할 때 마지막 행 맨 끝의 /></p>\r\n', now()); 부분이 복사가 안되어서 계속 다시 했네요;;;; 메모장에 옮겨서 확인해가면서 했어요....

                                        그리고, 저 진짜 아무것도 몰라서 여쭙는데요, mysql에서 연습 다하고 나올 때 어떤 명령어를 쓰나요? 저 어째야하나 몰라서 그냥 터미널 꺼버리고 끝냈거든요 ㅠㅠ
                                      • egoing
                                        id 값은 입력하는 순서대로 자동으로 1씩 증가하기 때문에 달라질 수 있습니다. (Auto increment) 입력하신 데이터의 현재 상태와 수업의 데이터 사이의 차이는 전혀 중요한 문제는 아니기 때문에 걱정 마시고 나머지 수업 잘 완주하시길 바래요 :)
                                        대화보기
                                        • 서봉
                                          안녕하세요 강의 정말 잘 보고 있습니다. 다만 이번 강의에서 궁금한점이 생겨서 질문드립니다.
                                          토픽 테이블을 생성하고 데이터를 입력했는데요, 도중에 잘려서 오류 발생하는건 아래 리플대로 해결했습니다. 근데 데이터 값이 좀 다른 것 같아서 질문드립니다.
                                          음 일단 첫번째로 저희가 입력하려는 데이터 중에 4번째 것이 'JSON이란?' 이 맞나요? 결과 예시의 내용과도 달라서요. 그리고 결과예시에는 3번이 함수인데 3번에는 연산자가 와야 맞는 것 아닌가요? 헷갈려서 질문합니다.
                                          일단해봤는데 php 실습시에 index.php 파일이 파이어폭스에서 열리지 않던데 혹시 데이터베이스를 잘못 형성해서 그런 것은 아닌지도 질문합니다..
                                        • leessosso
                                          답변 감사합니다 ^^
                                          대화보기
                                          • egoing
                                            그냥 하셔도 됩니다!
                                            대화보기
                                            • leessosso
                                              저... 복사를 잘 못해서 등록하다가 7줄을 등록해버렸어요...3줄 등록하고 잘못된거 같아서 다시 4줄을 복사해서 붙였더더니 7줄이네요...다시 지우고 실습하고 싶으면 어떻게 해야되나요??
                                            버전 관리
                                            egoing
                                            현재 버전
                                            선택 버전
                                            graphittie 자세히 보기