본문 바로가기

강의 정리/서버시스템 구축 실습

서버시스템구축실습 (9) 데이터베이스 연결

- 파일 vs DBMS

1) 파일 중 특정 키워드가 포함된 글만 목록으로 보여주는 기능을 추가하려면?

2) 제목, 내용 이외에 저자 이름, 작성 시간, 공개 상태 등 여러가지 정보를 담으려면?

3) 정렬된 정보를 원한다면?

 

 

 

- MySQL을 연동하기 위한 준비.

1. MySQL 서버용 vm 인스턴스 생성

 

컴퓨터 엔진 -> vm 인스턴스 -> 인스턴스 만들기

mysql, 서울

부팅 디스트 - 우분투 설정, 크기를 더 크게 잡을 필요가 있다(DB이기 때문에). 데이터를 담을 수 있을 만큼.

 

모든 Cloud API에 대한 전체 엑세스 허용,

방화벽 모두 허용.

 

추가.

 

 

 

- 별도의 인스턴스를 생성하는 이유는?

기존의 인스턴스를 사용하지 않고 별도의 인스턴스를 생성하는 이유.

 

웹 클라이언트, 웹 서버, WAS, DB가 떨어져 있는 구조.

DB의 역할을 하는 것 = vm 인스턴스.

 

이렇게 분리해놓으면: 작업자 A, B, C가 동일한 DB에 붙어서 작업할 수 있게 된다.

DB = 원격에 있는 서버 하나. A, B, C가 보는 데이터 일관성도 유지.

팀 프로젝트를 할때 DB를 원격으로 구축하고, 세명이 동일한 DB를 사용해 개발환경을 구축.

 

한명이 DB를 로컬에 구축하고 작업한다면, A, B, C의 데이터 일관성이 유지되지 않는다.

=> 피하기 위해 vm 인스턴스를 제작해서 사용. 

 

 

 

- MySQL 설치

외부 IP 복사, 

ssh (계정명)@IP주소

: 새롭게 생성된 인스턴스에 붙은 형태.

sudo apt update

 

- mySQL 관련 업데이트

sudo apt install mysql-server

-> mySQL 서버만을 실행시키기 위한 DB 서버.

 

sudo systemctl start mysql : mysql 서비스 시작

sudo systemctl enable mysql : 자동으로 시작되도록 설정

 

sudo mysql : 클라이언트로 mysql 서버에 접근해서 루트 유저의 패스워드를 변경해줄 것.

-> 루트로 들어왔다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mypassword';

 

루트로 로그인이 가능해짐.

mysql -uroot -p

패스워드를 입력해야 접근이 가능하다. 

 

 

sudo mysql_secure_installation

-> 패스워드 입력

n

n

n

y : 루트로 원격에서 로그인하는 것을 막는다

y

기본적인 세팅 완료.

 

 

루트 말고도 앱에서 사용할 계정을 하나 만들어준다.

mysql -u root -p : 접근

SET GLOBAL validate_password.policy=LOW;

-> 없다고 나온다 (신경쓰지 않는다)

 

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

CREATE USER 'cc'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

계정 생성, cc에 %권한 부여

GRANT ALL ON *.* TO 'cc'@'%' WITH GRANT OPTION;

새로 만든 계정에 권한 부여, 모든 데이터베이스/모든 테이블에 접근이 가능하도록 세팅

허가받은 계정이 다른 계정에게 허가를 줄 수 있다.

exit : 밖으로 나온다.

 

 

기본적인 세팅 종료.

환경설정에서 원격에서도 접근이 가능하도록 수정.

 

sudo vi /etc/mysql/mysql.conf.d/mysql.cnf

bind-adress = 127.0.0.1 : 같은 로컬 호스트에서밖에 접근 가능

0.0.0.0으로 변경

 

system systemctl restart mysql : 재시작해 변경사항 반영

 

 

- 방화벽 설정

GCP는 기본적으로 방화벽이 전부 막혀있음, 새로 뚫어줘야 한다.

 

네트워크 세부정보 보기 -> 방화벽 -> allow-mysql

IP범위 0.0.0/0으로 작성 : 모든 IP주소에 대해서 해당 포트로 접근 가능

 

지정된 프로토콜 및 포트 -> tcp -> 3306

대상: 네트워크의 모든 인스턴스

 

 

외부에서 해당 포트로 접근 가능.

다른 인스턴스에서 접근 가능!

 

 

다른 인스턴스에서도 mysql 클라이언트는 설치되어 있는 상태여야 한다.

mysql -h(호스트 이름 설정, 이 경우 IP주소) -u cc -p

 

다른 인스턴스에 원격에서 접근 성공.

 

 

CREATE DATEBASE recipe_db;

use recipe_db;

CREATE TABLE subscriber (name varchar(40), email varchar(40), zipCode integer); : 테이블 생성 가능

INSERT INTO subscriber (name, email) VALUES ("Jon Wexler", "jon@jonweler.com"); : 인서트

SELECT * FROM subscriber : 데이터 선택

 

mysql -u cc -p

show databases;

use recipe_db;

show tables;

테이블이 만들어져 있는 것을 볼 수 있다. 

select * from subscriber;

 

 

 

=> mysql 준비는 종료.

 

 

- Node.js 설정

 

node.js에서 mysql을 사용할 준비.

mysql2 모듈 설치 -> Node에서 MySQL에 접근하게 하는 모듈.

 

 

recipe_app 디렉토리 생성 > 진입

npm install mysql2 -S

 

- 1과 2의 차이

1) connection pool 지원: 커넥션들이 담겨있는 풀.

TCP 프로토콜 사용(1:1 통신만 가능). 클라이언트와 서버가 1:1로만 통신이 가능하다.

-> 커넥션 풀을 사용하면, 커넥션을 종료시키지 않고 풀에다가 모아놓는다.

똑같은 클라이언트가 여러번의 SQL 커리를 서버로 보낸다고 했을 때, 매번 TCP 커넥션이 필요할 것이다.

tree-hand connection을 사용하기 때문에 3번을 왔다갔다 해야 커넥션이 연결된다 -> 지연시간이 무시할 수 없는 수준.

그것을 없애기 위해 연결을 종료하지 않고 유지한다.

 

무한히 증가시킬 순 없기 때문에, 풀에 최대크기를 정해놓는다.

 

2) promise API, async/await를 지원

=> 비동기 프로그래밍을 쉽게 해준다.

 

 

 

- 동기와 비동기

21:35