━━━━ ◇ ━━━━
유니티(Unity)/툴 개발

[Unity gRPC 서버 개발(2/4)] MySQL 게임 DB 구축

📌 개요

 

 

 

 

gRPC 서버를 본격적으로 개발하기 전에 MySQL로 DB를 구축해보도록 하겠습니다.

왜냐하면 로그인/회원가입 기능을 만들기 위해선 유저 데이터를 관리할 DB가 필요하기 때문입니다.

저는 오라클 클라우드 컴퓨팅을 활용한 가상머신에 MySQL DB를 구축할 계획입니다.

 

※ 이번 포스터는 MySQL에 집중된 포스터입니다. gRPC 통신만 보고 싶은 분은 다음 포스터로 넘어가주세요.

 

 

 

 

 

 


📌 Linux 환경으로 MySQL 설치하기

 

1단계: MySQL 설치 및 서비스 시작

 

 

먼저 MySQL을 설치합니다. 터미널을 키고 다음 명령어를 입력합니다.

 

sudo apt update : Ubuntu 환경에서 사용 가능한 패키지 목록 최신화

sudo apt install mysql-server : MySQL 데이터베이스 서버 패키지 설치

 

 

 

설치가 완료되면 다음 명령어로 MySQL 데이터베이스 서비스를 백그라운드로 실행합니다.

 

sudo systemctl start mysql : MySQL 테이터베이스 서비스를 백그라운드로 실행

 

※ MySQL은 기본적으로 3306 포트를 사용하여 클라이언트의 연결을 기다립니다. 

 

 

 

 

 

2단계: MySQL 서비스 상태 확인 및 자동 실행 설정

 

 

sudo systemctl status mysql : MySQL 서비스의 현재 상태를 출력합니다. 만약 정상적으로 실행 중이라면 위 사진처럼 출력됩니다. 저는 가상머신을 재부팅할 때마다 자동으로 MySQL이 실행되도록 설정해주도록 하겠습니다.

 

sudo systemctl enable mysql : 시스템 재부팅 시 MySQL이 자동으로 시작되도록 설정하는 명령입니다. 개발 환경의 편의성을 위해 추천하며, 서버 운영 환경에서는 필수적입니다. 필요에 따라 선택하시면 될 것 같습니다.

 

 

 

 

 

3단계: MySQL 접속 및 종료

 

 

sudo mysql : MySQL 쉘(shell)에 접속할 수 있습니다. root 권한으로 MySQL에 접속할 수 있으며, 초기 설치 후 비밀번호가 설정되지 않은 상태라면 바로 접속할 수 있습니다.

 

 

 

\q 명령어를 입력하면 MySQL 쉘에서 나와 터미널로 돌아갈 수 있습니다.

 

 

 

 

 

추가 단계: MySQL 보안 설정 (권장)

 

이 단계는 서버를 외부에 노출하는 경우에 설정해두는 것이 좋습니다.

 

sudo mysql_secure_installation : MySQL 보안을 설정할 수 있습니다. 

 

 

Validate Password Plugin : 비밀번호 강도 검사 활성화 여부 (학습용이니 No)

 

 

Remove anonymous users : 익명 사용자를 제거할 지에 대한 여부 (Yes)

 

 

Disallow root login remotely : root 사용자의 원격 접속 허용 여부 (Yes)

 

 

Remove test database : 기본적으로 생성되는 test DB 삭제 여부 (Yes)

 

Reload privilege tables : 위에서 변경한 권한을 즉시 반영할 지에 대한 여부 (Yes)

 

 

위 사진처럼 출력됐다면 보완 설정이 완료된 것입니다.

 

 

 

 

 


📌 MySQL 명령어 - DB 관련

 

MySQL 설치를 완료했으니 MySQL 명령어를 살펴보도록 하겠습니다.

 

sudo mysql 명령어로 MySQL 쉘로 들어갑니다.

 

 

SHOW DATABASES;

 

현재 DB 상태를 확인할 수 있습니다. 최소 DB 상태는 위 사진과 같습니다.

 

 

 

CREATE DATABASE {db-name};

 

DB를 생성합니다. 저는 mygame 이라는 DB를 생성했습니다.

 

 

DROP DATABASE {db-name};

 

DB를 삭제합니다. 지금은 이 명령어를 사용하지 않습니다.

 

 

USE {db-name};

 

작업을 수행할 DB를 선택합니다.

 

 

※ 만약 DB를 선택하지 않고 테이블 작업을 하면 위 사진처럼 에러가 발생합니다.

 

 

 

 

 


📌 MySQL 명령어 - Table 관련

 

 

USE 명령어로 방금 생성한 DB로 진입합니다.

 

이제 테이블 관련 명령어를 알아보고, gRPC 개발을 위한 유저 정보 테이블을 세팅하도록 하겠습니다.

 

 

SHOW TABLES;

 

현재 DB에 존재하는 모든 Table을 조회합니다. 현재는 아무것도 없다고 출력됩니다.

 

 

 

CREATE TABLE {table-name} (

    id INT AUTO_INCREMENT PRIMARY KEY,

    user_id VARCHAR(50) NOT NULL,

    user_pw VARCHAR(255) NOT NULL,

    nickname VARCHAR(255) NOT NULL,

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

 

테이블을 생성하는 명령어입니다. 중요한 것은 스키마를 이해하고 설계하는 것입니다.

CREATE TABLE {table-name} (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id VARCHAR(50) NOT NULL,
    user_pw VARCHAR(255) NOT NULL,
    nickname VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

 

괄호 안에는 테이블에 저장될 각 데이터 항목(컬럼)과 속성(데이터 타입 및 제약 조건)을 정의합니다.

 

id INT AUTO_INCREMENT PRIBARY KEY

{id} 이름의 데이터를 명시합니다. 정수(INT) 타입이며, 새로운 행이 추가될 때마다 값이 1 증가합니다. (AUTO_INCREMENT) 그리고 이 컬럼은 기본 키(Primary Key)로 설정합니다.

 

user_id VARCHAR(50) NOT NULL

{user_id} 이름의 데이터를 명시합니다. 가변 길이 문자열(VARCHAR) 타입이며, 최대 길기는 50입니다. 

 

create_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

{create_at} 이름의 데이터를 명시합니다. 날짜와 시간을 저장하는 데이터(TIMESTAMP) 타입입니다. TIMESTAMP는 'yyyy-mm-dd hh:mm:ss' 형식으로 저장됩니다. 만약 이 값을 명시하지 않으면 현재 시간(DEFAULT CURRENT_TIMESTAMP)으로 설정합니다.

 

저는 users 라는 이름의 테이블을 생성해줄 것입니다. 로그인 및 회원가입 기능을 위해 위 명령어를 그대로 사용하여 스키마를 정의하겠습니다.

 

 

 

 

DESCRIBE {table-name};

 

테이블의 데이터 구조를 출력합니다. 방금 생성한 테이블의 구조를 확인할 수 있습니다.

 

DROP TABLE {table-name};

 

테이블을 삭제합니다. 현재는 사용하지 않습니다.

 

 

SHOW TABLES;

 

현재 DB의 모든 Table을 출력합니다.

 

 

 

 

 


📌 MySQL 명령어 - Data 관련

 

 

INSERT INTO {table-name} (attr1, attr2, ...) VALUES (value1, value2, ...);

 

테이블에 데이터를 추가합니다. 데이터 컬럼과 값을 정확히 매칭하는 것이 중요합니다.

 

예시 코드는 아래와 같습니다.

INSERT INTO users (user_id, user_pw, nickname) VALUES ('id1234', 'pw1234', 'chennyang');

 

 

SELECT * FROM {table-name};

 

테이블에서 모든 데이터를 조회합니다. * 기호는 모든 데이터를 의미하며, 특정 데이터 컬럼만 조회하거나 조건을 걸어 원하는 데이터를 추출하여 조회할 수 있습니다.

 

 

 

 

UPDATE {table-name} SET {attr} = {value1} WHERE {cond} = {value2};

 

테이블의 데이터를 수정합니다. 조건을 통해 원하는 행(튜플)의 데이터 컬럼을 수정할 수 있습니다.

 

예시 코드는 아래와 같습니다.

UPDATE users SET user_pw = 'changed_pw' WHERE nickname = 'chennyang';

 

 

DELETE FROM {table-name} WHERE cond = value;

 

테이블에서 특정 데이터를 제거할 수 있습니다.

 

 

 

 

 


📌 MySQL 명령어 - 사용자 관련

 

 

SELECT user, host FROM mysql.user;

 

MySQL에 등록된 사용자 목록을 확인할 수 있습니다.

 

저는 gRPC 서버가 MySQL에 접속하여 DB를 조회하거나 추가, 수정할 수 있도록 gameapi 라는 이름의 사용자를 추가하여 권한을 부여할 것입니다.

 

 

 

 

CREATE USER {username}@{host} IDENTIFIED BY {password};

 

사용자를 추가합니다.

  • username : 사용자 이름
  • host : 접근을 허용할 IP 또는호스트
  • password : 로그인 시 사용할 비밀번호

예시 코드는 다음과 같습니다.

CREATE USER gameapi@localhost IDENTIFIED BY 'gameapi_pw';

 

 

 

GRANT ALL PRIVILEGES ON {db-name}.* TO {username}@{host};

FLUSH PRIVILEGES;

 

사용자 권한을 부여합니다. 지정한 사용자에게 특정 DB에 관한 권한을 설정할 수 있습니다.

이때, FLUSH 명령어를 통해 권한을 즉시 반영해줍니다.

 

예시 코드는 다음과 같습니다.

GRANT ALL PRIVILEGES ON mygame.* TO gameapi@localhost;

 

※ mygame.*의 의미는 mygame 이름의 DB 내부의 모든 테이블을 대상으로 한다는 의미입니다.

 

 

 

SHOW GRANTS FOR {username}@{host};

 

특정 사용자에 대한 권한을 조회합니다.

 

DROP USER {username}@{host};

 

특정 사용자를 삭제합니다.

 



 

 


📌 번외) MySQL 네트워크 커스텀 설정

 

 

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

 

위 명령어를 실행하며 설정 파일을 열어 보면 port-number가 3306임을 확인할 수 있습니다.

즉, 외부에서 접근하려면 3306 port를 개방해줘야 한다는 의미입니다.

 

하지만 저는 외부(클라이언트)가 mysql에 직접 통신을 거치는 것이 아닌, 서버(mysql을 실행중인 디바이스)가 mysql과 통신하고, 데이터를 처리하여 클라이언트에 전송하는 구조를 원합니다. 그래서 별도의 가상머신 네트워크 설정 없이 진행하겠습니다.

 

※ 만약 외부에서 접근하도록 하려면 bind-address를 0.0.0.0으로 설정하고, 네트워크 설정에서 3306 포트에 접근할 수 있도록 개방해야 합니다.

 

 

 

 

 

COMMENT