글 작성자: juyoungit

이번 실습에서는 라즈베리파이에 DB Engine을 설치해서 이를 운용하는 실습을 진행해보도록 하겠다.

1. 라즈베리파이의 IP 주소 찾기

ping juyoungit.local

라즈베리파이서버의 IP 주소가 192.168.0.14 임을 ping 명령을 통해서 알아냈다.

 

2. 라즈베리파이 서버에 접속

ssh pi@192.168.0.14

알아낸 IP 주소를 바탕으로 ssh 프로토콜을 이용하여 라즈베리파이 서버에 접속하였다.

 

3. mariadb engine 설치

순서대로 제시하는 명령어들을 입력하면서 설치과정을 따라가 보도록 하자

sudo su -

sudo su - 를 입력하여 관리자 권한을 획득하였다.

apt-get -y install mariadb-server

여기에서 사용되는 -y 옵션은 패키지 설치를 진행할 때 사용자에게 물어보는 모든 과정에 대해서 yes 입력을 부여하는 옵션이다. 해당 옵션을 사용하면 사용자에게 별도 확인을 받지 않고 설치과정이 바로 진행되기 때문에 편리하다.

다음과 같이 설치과정이 진행된다. 조금만 기다리면 완료된다.
설치가 완료된 모습, 다음과 같이 나타났다면 정상적으로 설치를 마친 것이다.

그리고 추가적으로 php와 mysql을 연동해주는 패키지를 설치해야한다. 해당 과정을 수행해주지 않으면 DB가 제대로 동작하지 않게되니 꼭 잊지말고 수행해주도록 하자. 다음과 같이 명령어를 입력해서 설치해주면 된다.

apt install php-mysql

설치가 진행되는 모습, 잠시 기다려주면 완료된다.

그리고 마지막으로 nginx를 재시작해주면 된다.

3. mariadb 기본 설정파일 수정

​이 단계에서는 mariadb의 기본 설정파일을 수정하는 단계이다. mariadb는 전세계에서 사용되는 공용오픈소스 소프트웨어 이기 때문에 한글 입력이 가능하도록 설정을 변경해줘야 DB 상에서 정상적으로 한글입력을 처리할 수 있다. 이를 위해서는 다음 경로의 2개의 파일을 수정해야 한다.

/etc/mysql/mariadb.conf.d/50-server.cnf

/etc/mysql/mariadb.conf.d/50-client.cnf

각 파일들에 대한 수정 내용은 다음과 같다.

50-server.cnf 수정 전
50-server.cnf 수정 후

위에 제시한 캡쳐처럼 기존의 설정값인 104, 105번 라인을 주석문 처리하고 그 아래에 다음 5줄 라인을 추가해주면 된다.

init_connect=SET collation_connection = utf8_general_ci 
init_connect=SET NAMES utf8
character-set-server=utf8
collation-server=utf8_general_ci
lower_case_table_names = 1

다음으로 50-client.cnf 파일은 다음과 같이 수정한다.

50-client.cnf 수정 전

 

50-client.cnf 수정 후

 

기존의 8번 라인의 내용을 주석문 처리해주고 그 아래의 다음의 내용을 추가시켜주면 된다.

default-character-set = utf8

이렇게 기본 설정파일 수정이 완료되었다. 현재 mariadb는 기본설정파일을 수정해줬기 때문에 mariadb를 재시작해야할 필요성이 있다. mariadb 재시작은 다음의 명령어을 사용한다. 지금까지 실습을 해오면서 지속적으로 해왔던 것이지만 설정값을 변경한 후에는 항상 서비스를 재시작 해주어야 한다는 사실을 잊지 않도록 하자.

service mysql restart

service restart가 정상적으로 이루어진 모습

그런데 여기서 한 가지 궁금증이 들 수도 있다. '분명 재시작하는 것은 mariadb인데 왜 mysql을 restart 하는 것인가?' 이에 대한 설명은 다른 글에서 다루는 것으로 하고 본 글에서는 현재의 실습에 대하여 더 집중하도록 하겠다.

3. mariadb root 비밀번호 생성

System에 대한 Super User가 존재하듯이 DB만의 Super User가 존재한다. 해당 root는 System의 User와 별개이며, DB를 관리할 때 사용하는 계정이다. 초기에 mariadb를 설치한 상태라면 현재 root계정에 대한 비밀번호가 설정되어 있지 않을 것이다. root의 비밀번호를 생성하기 위해서는 다음의 명령을 입력해서 우선 DB로 접속해야 한다.

mysql -u root -p

-p는 비밀번호를 입력하고 들어가겠음을 의미하는 옵션이다.

해당명령을 입력하면 비밀번호를 입력하라는 요청이 나오는데 이 때는 root에 대한 비밀번호가 설정되어 있지 않기 때문에 그냥 엔터키만 입력해도 들어가진다. 정상적으로 DB에 접속했다면 다음과 같은 창이 나타날 것이다.

새롭게 나타난 mariadb 프롬프트에서 다음의 명령어를 입력해서 root의 비밀번호를 생성해주도록 하자.

 

update mysql.user set authentication_string=password('12345678') where user='root';

password 뒤에오는 괄호안에 설정하고자 하는 비밀번호를 입력해주면 된다.

정상적으로 입력된 모습

정상적으로 명령어를 입력했다면 다음과 같이 나타날 것이다.


추가로 참고하기

위에서처럼 update mysql.user set authentication_string=password('12345678') where user='root'; 명령어를 입력했을 때 비밀번호가 제대로 설정되지 않는 경우가 있다. 해당명령을 입력해서 root 계정에 대한 비밀번호를 12345678로 설정했음에도 불구하고 다음에 다시 mariadb의 root 로 접속할 때 비밀번호가 설정되어 있지 않아서 그냥 엔터키만 눌러도 접속이 되는 증상이 있다. 사실 아직 이것에 대한 명확한 원인은 찾지 못하였다. 단, 이것에 대한 해결책만을 우선 제시하는 것으로 하겠다.

위의 상황처럼 동일하게 mysql -u root -p를 입력해서 우선 root로 접속한 뒤에 update가 아닌 다음의 명령어를 입력해 주도록 하자.

alter user 'root'@'localhost' identified by '12345678';

commit;

위의 명령을 순서대로 입력한 모습

위와 같이 입력하면 이제 접속 시 비밀번호를 기반으로 정확하게 사용자의 접속을 통제하는 것을 확인할 수 있다.

설정한 비밀번호를 입력한 경우
설정하지 않은 비밀번호를 입력한 경우

혹시 본 작성자처럼 위의 상황에 대해서 오류를 겪는 분들이 있다면 해당 명령을 사용해서 root에 대한 비밀번호 설정을 수행하도록 하자.


4. 사용자 DB 생성 및 관련설정

이제 사용자에게 할당해줄 DB 공간을 생성하고 이와 관련된 설정을 수행해보도록 하자. 특정 사용자를 위한 DB를 생성하기 위해서는 다음 3가지 정보가 필요하다.

1. 사용자용 DB
2. DB 접급 사용자 명
3. 비밀번호

다음 3가지 정보를 한 그룹으로 해서 사용자에게 DB를 할당해줄 수 있다. 만약 10명의 서로 다른 사용자들에게 DB를 할당해줘야 한다면 다음 3가지의 정보를 하나의 그룹으로 해서 10개의 그룹정보를 생성하면 된다는 뜻이다. 다음 3가지 정보는 다음과 같이 설정한다.

사용자용 DB

create database (원하는 DB명)

DB접근 사용자 명, 비밀번호

grant all privileges on (사용자DB명).* to '원하는 사용자명'@'localhost' identified by '사용하고자 하는 비밀번호'

입력한 사항 저장

flush privileges

위에서와 같이 입력했다면 이전에 언급한 사용자용 DB생성을 위해 필요한 3가지 정보는 각각 다음에 대응한다

사용자용 DB

userdb

DB접근 사용자 명

db_juyoungit

비밀번호

12345678

다음과 같이 3가지 정보를 입력하여 사용자용 DB를 생성해주고 나면 시스템 관리자의 역할은 끝났다. 이제 DB를 사용하는 User의 입장에서 진행된다.

5. 사용자 계정에서 사용자용 DB에 접속

이제 사용자 입장이다. 우선 사용자의 계정으로 접속해주도록 하자.

실습을 위해서 다음과 같이 dbex_hjy라는 새로운 계정을 생성하였다.
새롭게 생성한 사용자 계정으로 접속한 모습

이제 서버관리자가 생성한 사용자용 DB에 접속해보도록 하자. 이전에 DB에 대한 root 계정으로 접속할 때 사용했던 명령어를 떠올리면 어떠한 형식으로 입력해야할 지 감이 올 것이다.

 

mysql -u (DB접근 사용자명) -p

-p는 비밀번호를 입력하고 들어가겠음을 의미하는 옵션이다.

이후 비밀번호를 입력하고나면 다음과 같이 정상적으로 사용자용 DB에 접속하게 된다.

서버관리자가 설정한 사용자DB 접근 사용자명 "db_juyoungit"을 이용해서 접속한 모습

여기서 간단한 확인을 해보면 다음의 명령어를 이용해서 사용자가 위치한 DB를 변경할 수 있다.

use (DB 명);

다음과 같이 [ ] 안의 내용이 none->userdb 로 변경된 것을 확인할 수 있다.

[ ] 안의 내용은 현재 사용 중인 DB를 의미한다. 현재 사용중인 userdb의 경우 사용자에게 할당하는 사용자용 DB로 생성되었기 때문에 해당 DB를 사용할 수 있어서 다음과 같이 use 명령어를 사용하여 사용하는 DB로 변경할 수 있지만

권한이 없어 변경을 거부당했다.

다음과 같이 서버에 대한 전반적인 중요한 세팅값들을 저장하고 있는 mysql DB는 root가 아닌 DB접근 사용자 명을 사용하니 권한이 부족하여 변경되지 않는 모습을 확인해볼 수 있다.

6. 서버관리자에게 웹서비스 세팅요청

해당 계정에서 웹서비스를 하기 위해서 우선 서버관리자에게 웹서비스 관련 세팅을 요청해야한다. 해당 과정은 이전 실습에서 수행했던 과정들과 동일하므로 간략하게 설명하면서 넘어가도록 하겠다.

관리자 권한을 획득할 수 있는 pi 계정으로 라즈베리파이 서버에 접속
관리자 계정으로 변경(관리자 권한 획득)

해당하는 경로에 다음 파일을 생성한다.

/etc/nginx/sites-available/dbex_hjy.com

입력할 파일의 내용은 다음과 같다. db를 사용하기 때문에 이전 실습과는 작성내용이 다소 다르다.

server{
    listen 80;
    listen [::]:80;

    server_name dbex_hjy.com;

    root /home/dbex_hjy/html;
    index index.html index.php;
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

위의 내용을 입력한 모습

그리고 다음으로 해당 경로에 링크 파일을 생성해주도록 하자.

/etc/nginx/sites-enabled/dbex_hjy.com

ln -s /etc/nginx/sites-available/dbex_hjy.com dbex_hjy.com

정상적으로 생성되었다면 다음과 같이 나타난다.

마지막으로 변경한 사항의 적용을 위해 nginx를 재시작 해주도록 하자.

service nginx restart

7. PHP + mysql 사용하는 웹사이트 소스 제작(clone)

이번에는 웹 서비스를 php, mysql을 사용하는 채팅방 형식의 페이지를 서비스 할 것이다. 이미 만들어져 있는 소스를 clone하여 사용할 것이다.

원본소스(왼쪽), 해당 소스를 나의 github 저장소로 fork한 모습(오른쪽)

이제 해당계정의 root 디렉터리에 해당 파일을 clone 하도록 하자.

다음과 같이 정상적으로 소스를 fork 해온 것을 확인할 수 있다.

8. 서버 관리자에게 받은 DB 정보반영

해당 페이지는 DB를 사용하기 때문에 사용하는 DB 관련 정보를 입력해줘야 정상적으로 사용하는 것이 가능하다. 해당소스의 파일 중에서 connection.php라는 파일을 수정해 줘야 한다.

해당 파일의 내용을 다음과 같이 수정해줘야 한다.

수정 전(왼쪽), 수정 후(오른쪽)

위와 같이 서버관리자에게 전달받은 사용자용 db에 대한 관련 정보들을 입력해주면 된다. 해당 파일에 입력한 정보를 기반으로 웹사이트가 동작할 때 DB를 활용할 수 있게된다.

9. 사용자 DB에 테이블 생성

여기서 테이블(Table) 이라는 개념이 등장하는 데 테이블이라는 개념은 데이터베이스에 데이터를 저장하는 형식, 구조라고 생각하면 된다.건물의 입구에서 표를 하나주고 출입하는 사람의 인적사항, 주소, 연락처, 체온 등의 사항을 기록하라고 하는 개념이라고 생각하면 될 것이다. 이와 관련된 추가적인 내용은 다음의 링크를 참고하기 바란다.

 

https://coding-factory.tistory.com/77

 

[DB기초] DataBase 개념 및 용어 설명

이번 포스팅에서는 프로그래머라면 필수적으로 알고있어야할 데이터베이스(DataBase)란 무엇이며 왜 사용하는지 또 지금 현재 쓰고있는 DBMS(DataBase Management System)들은 어떤것이 있는지에 대해 알

coding-factory.tistory.com

그래서 여기서 말하는 DB 테이블 생성이라는 것은 DB가 웹사이트에서 전송 & 로드하는 데이터를 해당 웹사이트에서 요구하는 형식에 맞게수행할 수 있도록 생성해주는 것이라고 보면 된다. 우리가 이전단계에서 생성한 userdb에는 아무것도 저장되어 있지 않다. 그래서 여기에서 해당 웹페이지가 돌아갈 수 있도록 해주는 기본적인 테이블을 만들어줘야 한다. 여기서 테이블의 데이터를 만들어내는 문장을 포함하는 파일을 전달해줘야 한다.

사용자 DB에 테이블을 생성은 이 명령어를 이용해서 수행한다.

mysql -u db_juyoungit -p userdb < Chat-Room/database/chat.sql

여기서 sql(Structured Query Language)은 DB를 제어, 조작하는 데 사용하는 언어라고 이해하면 된다. 해당 파일을 열어서 일부 내용을 확인해보면

다음과 같이 table에 대한 정보를 포함하고 있는 것을 확인할 수 있다.

다음과 같이 위의 명령어를 입력한 후 해당 DB에 대한 비밀번호를 입력해주면 해당 과정은 완료된다. 이렇게 웹사이트를 위한 모든 과정이 마무리 되었다.

10. 웹사이트 접속 및 테스트

이제 해당페이지에 접속해서 정상적으로 페이지가 동작하는 지 확인해보도록 하자. 다음과 같이 브라우져에 주소를 입력해서 해당 페이지에 접속해보도록 하자

dbex_hjy.com/Chat-Room

그냥 Chat-Room 페이지를 dbex.com의 페이지로 만들고 싶다면 root 디렉터리를 해당경로로 수정해주면 된다.

다음과 같이 채팅방 형식의 페이지가 나타나게 된다.  페이지에서 안내하는 대로 이름, 메시지를 순서대로 입력하고 send를 누르면 메시지를 보내는 스타일의 페이지 이다.

해당 페이지는 DB를 기반으로 동작하기 때문에 해당 페이지를 빠져나온다고 해도 이전의 내용이 날아가지 않고 그대로 유지된다. 그리고 DB에 저장되는 내용을 읽어와서 화면에 표시해주기 때문에 다음과 같이 해당 Chat-Room 페이지를 동시에 2개를 띄워두고 각각의 창에 대해서 메시지를 입력해보면 다음과 같이 각 페이지에서 입력하는 내용이 실시간으로 반영되서 다른 페이지에서도 동일하게 나타나는 것을 확인할 수 있다.

좌우 페이지에 각각 번갈아가면서 메시지를 입력하면 해당 입력한 내용이 반영되어서 반대편 페이지에도 나타난다. 결과적으로 서로 다른 두 창에서 표시하는 메시지 내용은 완전히 동일하게 나타나는 것으로 확인할 수 있다.

 

이렇게 DB를 기반으로 동작하는 웹사이트를 만들어보는 실습을 진행하였다. 이것으로 이번 실습에 대한 글을 마친다.