Java

[JAVA, Eclipse, Mysql, Docker] Mysql 컨테이너 생성 및 연동, 초기화, 데이터 삽입

ride-dev 2024. 7. 21. 18:27

제목

[JAVA, Eclipse, Mysql, Docker] Mysql 컨테이너 생성 및 연동, 초기화, 데이터 삽입

관련 게시글

[JAVA, JDK, Tomcat, Eclipse, JSP] JDK, Tomcat 및 이클립스 환경 구축, JSP 프로젝트 생성

[JAVA, Eclipse, Mysql, Docker] Mysql 컨테이너 생성 및 연동, 초기화, 데이터 삽입

[Troubleshooting, Eclipse, docker-compose.yml] Multiple markers at this line- Property xxx is not allowed.- Tabs are not allowed as indentation

목차

1. docker-compose.yml 작성

2. mysql-connector 설치 및 설정

2. db 초기화 sql 파일 작성

3. docker container 생성 및 확인

1. docker-compose.yml 작성

프로젝트 루트 경로에 docker-compose.yml 파일을 작성합니다.

 

IDE로 Eclipse를 사용한다면, tab 대신 공백문자를 사용해야 합니다.

그렇지 않으면, tab을 공백으로 자동 변환하는 설정을 해야합니다.

version: '3.8'
services:
    jsp-bbs-db:
        image: mysql:8.0
        container_name: jsp_bbs_mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: jsp_bbs_db
            MYSQL_USER: admin
            MYSQL_PASSWORD: admin
        ports:
            - "3306:3306"
        volumes:
            - jsp_bbs_db_data:/var/lib/mysql
            - ./init__V1_schema_user.sql:/docker-entrypoint-initdb.d/init__V1_schema_user.sql
            - ./init__V2_data_user.sql:/docker-entrypoint-initdb.d/init__V2_data_user.sql

volumes:
    jsp_bbs_db_data:

위 스크립트 내용은 찬찬히 보겠습니다.

 

mysql 8.0 버전 이미지를 pull 하고, jsp_bbs_mysql 이라는 이름의 컨테이너로 빌드합니다.

        image: mysql:8.0
        container_name: jsp_bbs_mysql

root password는 root로,

'jsp_bbs_db' DATABASE를 생성합니다.

user, password를 admin으로 생성합니다.

        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: jsp_bbs_db
            MYSQL_USER: admin
            MYSQL_PASSWORD: admin

외부 접근 port는 3306으로 합니다.

        ports:
            - "3306:3306"

볼륨을 설정하여,

컨테이너가 중단되어도 데이터가 휘발되지 않도록 합니다.

또한, 컨테이너가 생성될 때, 초기화 sql문을 동작시킵니다.

        volumes:
            - jsp_bbs_db_data:/var/lib/mysql
            - ./init__V1_schema_user.sql:/docker-entrypoint-initdb.d/init__V1_schema_user.sql
            - ./init__V2_data_user.sql:/docker-entrypoint-initdb.d/init__V2_data_user.sql

volumes:
    jsp_bbs_db_data:

2. mysql-connector 설치 및 설정

2.1 mysql-connector 설치

검색창에 mysql-connector-java를 검색하여 다운로드 페이지로 진입합니다.

OS에 독립적으로 사용할 수 있도록 하여 설치합니다.

만약 특정 버전을 설치하고자 한다면, Archives에 진입하여 다운로드합니다.

2.1 mysql-connector 설정

다운로드한 zip 파일을 압축해제하고 작업 공간으로 이동시킵니다.

디렉토리 내부의 mysql-connector-java-x.x.x.jar 파일을 프로젝트 내부 경로로 복사합니다.

일반적으로 프로젝트의 WEB-INF > lib에 jar 파일을 저장하면,

프로젝트가 자동으로 jar 파일을 탐지하지만,

문제가 생기는 경울 수동으로 탐지합니다.

 

프로젝트 우클릭 > Properties 또는, Alt + Enter를 통해,

프로젝트의 프로퍼티 설정을 합니다.

Java Build Path > Libraries > Classpath > Add JARs...에서,

mysql-connector-java-x.x.x.jar 파일 선택 후 OK, Apply합니다.

3. db 초기화 sql 파일 작성

sql 파일을 만들고 db 생성 시 실행될 sql문을 정의합니다.

table 생성 sql 파일, 더미 데이터 삽입 sql 파일을 생성합니다.

파일 이름에 따라 실행 순서가 정해지므로 네이밍에 신경쓰도록 합니다.

예컨대 생성은 V1, 삽입은 V2와 같이 구분지을 수 있습니다.

3.1 테이블 생성 sql 파일 생성

-- init__V1_schema_user.sql
CREATE DATABASE IF NOT EXISTS jsp_bbs_db;

USE jsp_bbs_db;

CREATE TABLE IF NOT EXISTS USER (
    userID VARCHAR(20),
    userPassword VARCHAR(20),
    userGender VARCHAR(20),
    userEmail VARCHAR(20),
    PRIMARY KEY (userID)
);

3.2 데이터 삽입 sql 파일 생성

삽입 데이터는 gpt를 활용했습니다.

-- init__V2_data_user.sql
USE jsp_bbs_db;

INSERT INTO USER (userID, userPassword, userGender, userEmail) VALUES
('user1', 'password1', 'male', 'user1@example.com'),
('user2', 'password2', 'female', 'user2@example.com'),
('user3', 'password3', 'male', 'user3@example.com');

각 파일명과 docker-compose.yml에 작성한 파일 명을 일치시키도록 합니다.

        volumes:
            - jsp_bbs_db_data:/var/lib/mysql
            - ./init__V1_schema_user.sql:/docker-entrypoint-initdb.d/init__V1_schema_user.sql
            - ./init__V2_data_user.sql:/docker-entrypoint-initdb.d/init__V2_data_user.sql

volumes:
    jsp_bbs_db_data:

4. docker container 생성 및 확인

4.1 docker container 생성

터미널로 docker-compose.yml 파일이 있는 경로에 진입합니다.

이후 명령어를 사용하여 docker 이미지를 pull, build, run 합니다.

docker-compose up -d

docker 데스크탑 또는 터미널의 docker ps 명령어를 사용하여,

가동 중인 컨테이너를 확인할 수 있습니다.

4.2 docker container DB data 확인

docker container 내부에 접근하여 DB data를 확인합니다.

docker desktop 또는 터미널 명령어를 사용할 수 있습니다.

4.2.1 docker desktop Logs

생성된 컨테이너를 클릭하고 Logs 메뉴로 접근합니다.

Logs 에선 sql 파일이 실행되었는지 확인 가능합니다.

2024-07-21 13:13:46+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init__V1_schema_user.sql
2024-07-21 13:13:46+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init__V2_data_user.sql

4.2.2 docker container 내부에서 확인

컨테이너 내부로 진입하는 방법은 두 가지가 있습니다.

Docker Desktop, terminal 이 두가지 방법을 통해,

컨테이너화된 DB 내부에 진입하는 방법을 알아보고,

내부 데이터를 확인해보겠습니다.

 

4.2.2.1 docker desktop Exec로  컨테이너 진입

생성된 컨테이너를 클릭하고 Exec 메뉴로 접근합니다.

Exec 에선 table을 확인할 수 있습니다.

아래 명령어를 통해 mysql 내부로 진입합니다.

mysql -u root -p
Enter Password: root

이후에 입력할 명령어는 docker desktop이 아닌,

터미널로 진입했을 때 사용할 명령어와 동일하기 때문에,

터미널 항목과 함께 작성하도록 하겠습니다.

 

4.2.2.2 terminal로 컨테이너 진입 

아래 명령어를 입력하여 컨테이너 내부로 진입합니다.

winpty docker exec -it jsp_bbs_mysql bash

위 명령어를 통해,

윈도우 환경에서 jsp_bbs_mysql 컨테이너에 접속하여 bash 셸을 실행합니다.

이제 root 관리자를 택하여 비밀번호를 입력합니다.

mysql -u root -p
Enter password: root

 

4.2.2.3 DB 데이터 확인

아래 명령어를 사용하여,

DB를 확인한 뒤,

DB에 내부에 접속하고,

테이블을 확인합니다.

SHOW DATABASES;
USE jsp_bbs_db;
SHOW TABLES;

아래는 git bash 에서 실행한 예시입니다.

user@MINI MINGW64 /c/JSP/projects/JSP-BBS
$ winpty docker exec -it jsp_bbs_mysql bash
bash-5.1# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.38 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jsp_bbs_db         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.04 sec)

mysql> use jsp_bbs_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------+
| Tables_in_jsp_bbs_db |
+----------------------+
| USER                 |
+----------------------+
1 row in set (0.00 sec)

이제 테이블 내부에 데이터가 삽입되었는지 확인합니다.

SELECT * FROM USER;

 

728x90