JavaRush /Java Blog /Random-KO /데이터베이스와 관련된 모든 것을 추가합니다. (1부) - "Java 프로젝트 A부터 Z까지"
Roman Beekeeper
레벨 35

데이터베이스와 관련된 모든 것을 추가합니다. (1부) - "Java 프로젝트 A부터 Z까지"

Random-KO 그룹에 게시되었습니다
우리는 목표를 향해 한걸음 한걸음 나아가고 있습니다. "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 1오늘날 우리는 많은 작업을 해결해야 합니다.
  1. 이동경로를 추가하세요. 여기서는 프로젝트에 대한 데이터베이스 배포를 구성합니다.
  2. 데이터베이스 스키마를 추가합니다.
  3. 저장소 계층을 추가합니다.
  4. 봇 통계 명령을 추가합니다.
  5. 결국 테스트를 작성하세요.
그러니 편안히 앉아 기다리세요. 긴 내용을 읽을 수 있을 것입니다. 우리는 이미 docker 및 docker-compose를 사용하여 애플리케이션을 배포하는 방법을 배웠습니다. 쉽지 않은 일인데, 성공하신 분들께 축하드립니다. 구현에 대해 질문이 있는 경우 이 풀 요청 의 코드를 살펴보세요 .

이동경로 추가

Flyway를 추가하려면 데이터베이스가 있어야 하며, 이를 docker-compose에 또 다른 서비스로 추가할 것입니다. 지난번에 docker-compose에는 특정 인프라, 즉 애플리케이션/데이터베이스/메신저 세트 등을 추가하고 관리하는 서비스 섹션이 있다고 말씀드렸습니다.
나는 이미 Flyway가 무엇인지, 그리고 그것을 SpringBoot 애플리케이션에 추가하는 방법 에 대해 이야기했습니다 . 이 글을 읽기 전에 기억을 되새기시길 권합니다. Flyway + SpringBoot에 대한 기사의 데모와 함께 프로젝트의 README.md 파일을 읽을 수도 있습니다 .
가장 먼저 할 일은 프로젝트의 메인 브랜치를 업데이트하고(git pull) 작업 이름인 STEP_5_JRTB-1(git checkout -b STEP_5_JRTB-1)을 사용하여 새 브랜치를 생성하는 것입니다. 상기시켜 드리겠습니다. 프로젝트의 작업 순서를 이름별로만 정렬할 수 있도록 분기 이름을 변경했습니다. 이를 통해 한 단계에서 다른 단계로 빠르게 이동할 수 있습니다. 이제 안심하고 일하실 수 있습니다. 세 가지 종속성을 추가해야 합니다.
<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
첫 번째 종속성은 프로젝트에 FlyWay를 추가하는 역할을 담당하고, 두 번째 종속성은 MySQL 데이터베이스에 연결하는 기능을 추가합니다. 세 번째는 Spring에서 데이터베이스를 사용하는 모든 마법을 실행하는 SpringBoot 스타터입니다. 그리고 getter와 setter를 작성하지 않도록 lombok도 추가해 보겠습니다.
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
이제 개발을 위한 데이터베이스가 필요합니다. 지금은( 더 나은 아이디어가 떠오를 때까지 ) 이를 별도의 docker-compose 파일과 application.properties에 대한 별도의 파일로 생성하겠습니다 . 개발(특히 Spring 생태계)에는 프로필과 같은 것이 있습니다. 프로필에 따라 작동을 위한 다양한 설정이 시작됩니다. 앞으로는 docker-compose를 하나의 파일로 결합하고 필요한 설정에 따라 개발을 위해 하나의 데이터베이스만 시작되도록 할 것이라고 생각합니다. 지금은 다음을 수행합니다.
  1. 자체 설정이 있는 데이터베이스만 실행되는 docker-compose-test.yml 프로젝트의 루트에 파일을 생성해 보겠습니다.
  2. docker-compose-test.yml 파일의 설정과 일치하는 설정을 사용하여 application-test.properties 파일을 생성해 보겠습니다.
MySQL을 사용하기 위해 DockerHub 에서 공식 이미지를 가져왔습니다 . "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 2빠르게 스크롤한 후 필요한 변수를 찾았습니다. MYSQL_DATABASE - 데이터베이스 이름 MYSQL_USER - 데이터베이스 사용자 이름 MYSQL_PASSWORD - 데이터베이스 사용자 비밀번호 그리고 올바르게 작성하는 방법:
jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
그런 다음 프로젝트 루트에 docker-compose-test.yml을 만듭니다.
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
docker-compose와 함께 작동하기 위해 이 특정 파일을 실행하려면 요청에 -f 플래그를 사용해야 합니다 . 이는 표준 docker-compose.yml을 사용하는 대신 실행되는 파일 이름이 제공된다는 의미입니다. 따라서 요청은 다음과 같습니다: docker-compose -f docker-compose-test.yml up -d 먼저 어떤 파일을 가져올지 말한 다음( -f docker-compose-test.yml ) 서비스를 활성화하고 이 작업을 데몬 모드( up -d )에서 수행해야 한다고 가정해 보겠습니다. 즉, 프로세스가 이 명령이 시작된 터미널 세션 외부에서 실행되도록 해야 합니다. 우리는 데이터베이스를 시작하고 연결을 시도하여 데이터베이스가 작동 중이고 사용할 수 있는지 확인합니다. 이렇게 하려면 친숙한 MySQL Workbench( 여기서 설명 )를 열고 새 연결을 만듭니다. "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 3다음 필드를 채워야 합니다.
  • 연결 이름 - 연결 이름 - 선택적으로 DEV_JRTB_DB;
  • 호스트 이름 - 데이터베이스가 배포되는 주소입니다. 우리의 경우 모든 것이 127.0.0.1 또는 localhost로 유지됩니다.
  • 사용자 이름 - docker-compose에 작성한 대로 루트가 됩니다.
  • 비밀번호 - 루트이기도 합니다.
그런 다음 연결이 있는지 확인해야 합니다. 이렇게 하려면 연결 테스트를 클릭합니다 . "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 4결과적으로 MySQL에 연결하지 못했습니다... 이유가 무엇입니까? 터미널로 가서 도커 컨테이너에 무슨 일이 일어났는지 확인합니다. 터미널에 다음과 같이 작성해 보겠습니다. "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 5터미널이 59분 전에 생성되었고 다시 시작하는 데 55초가 걸렸다는 것을 알 수 있습니다. 왜일까요? 확실하지 않습니다. 로그를 살펴봐야 합니다. 터미널의 프로젝트 루트로 이동하여 다음 명령을 실행합니다. docker-compose -f docker-compose-test.ymllogs
우리는 다음을 얻습니다:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

이제 데이터베이스가 우리 설정으로 시작된 적이 없다는 것이 분명해졌습니다. 오류는 동일하므로 시트에서 격리해 보겠습니다.
2021-02-28 11:03:37+00:00 [ERROR] [진입점]: 데이터베이스가 초기화되지 않았고 비밀번호 옵션이 지정되지 않았습니다 dev-jrtb-db | MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD 및 MYSQL_RANDOM_ROOT_PASSWORD 중 하나를 지정해야 합니다.
즉, 그는 기본 사용자인 루트 사용자의 비밀번호를 결정해야 합니다. 좋습니다. 이제 파일을 업데이트하겠습니다.
version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
사용자 및 비밀번호에 대한 변수를 제거하고 루트 사용자에 대한 비밀번호만 추가했습니다. 이는 이제 루트 사용자가 루트 비밀번호를 갖게 된다는 의미입니다. 적어도 그것이 우리가 가정하는 것입니다. 이제 실행하여 무슨 일이 일어나는지 살펴보겠습니다. docker-compose -f docker-compose-test.yml up -d 그리고 로그가 우리에게 말하는 내용을 즉시 확인합니다. docker-compose -f docker-compose-test.yml 로그
한번 보자:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

더 이상 오류가 없는 것으로 보여서 접속이 되는지 확인하실 수 있습니다. 하지만 불행하게도 다시는 접근할 수 없습니다... 아무 것도 없습니다: 더 자세히 알아 보겠습니다! "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 6docker-compose를 종료하고 모든 컨테이너를 삭제하려면 다음을 작성해야 합니다. docker-compose -f docker-compose-test.yml down 여기서는 삭제할 파일을 지정했습니다. 무엇을 해야 할까요? Google에 검색해 보세요. 누군가가 더 잘했을 수도 있습니다. 가장 간단한 쿼리인 "docker-compose의 mysql 예제"는 매체 리소스에 대한 링크를 찾는 데 도움이 됩니다. 그들은 다음과 같은 예를 제시합니다.
version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
우리는 그것을 우리의 필요에 맞게 조정하고 다음을 얻습니다.
version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
이미 알려진 명령을 사용하여 이 옵션을 시작합니다. docker-compose -f docker-compose-test.yml up -d MySQLWorkBench를 통해 데이터베이스에 다시 액세스하려고 합니다. "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 7마지막으로 액세스가 나타났습니다. 하지만 이제 무엇이 이것에 영향을 미쳤는지 궁금합니다. 나는 이 부분에서 죄를 짓고 있습니다:
expose:
   # Opens port 3306 on the container
   - '3306'
확인하기 쉽습니다. 이것이 없으면 아무것도 작동하지 않습니다. :D. 확인해 보겠습니다. 이 부분을 삭제하고 docker-compose를 다시 시작합니다. docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up 워크벤치를 통해 데이터베이스에 들어가려고 합니다. 모든 것이 정상입니다. . 그렇다면 유일한 옵션은 데이터베이스 버전입니다. 5.7이라고 명시되어 있습니다. 즉, 최신 버전으로 변경하면 작동하지 않아야 합니다. 다시 시작했는데 정말 작동하지 않습니다... "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 8분명히 최신 버전의 도커 이미지에 문제가 있는 것 같습니다. 그래, 문제 없어. 이런 일은 자유 소프트웨어에서 자주 발생합니다. 버전 5.7을 사용하겠습니다. 필요한 데이터베이스(dev_jrtb_db)가 있는지 살펴보겠습니다. 이렇게 하려면 MySQL Workbench SHOW DATABASES 에서 Query 명령을 실행합니다 . "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 9예, 출력에 표시됩니다. 좋습니다. 계속 진행하면 됩니다. 다음으로 첫 번째 마이그레이션을 추가해 보겠습니다. "프로젝트 계획: 두 번 측정하고 한 번 자르기" 기사의 작업을 기반으로 첫 번째 테이블 tg_user를 생성하겠습니다. 모든 마이그레이션은 projectDir/src/main/resources/db/migration 폴더 에 위치하며 이름은 V00001__add_tg_user_table.sql 입니다 . 해당 폴더에 그런 이름이 있는 이유는 Spring + flyway에 대한 기사에서 설명했습니다. 첫 번째 마이그레이션은 다음과 같습니다: V00001__add_tg_user_table.sql:
-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
즉, 여기서는 채팅 ID(테이블에서 ID로 작동하는 데 사용할 수 있는 고유 요소)와 해당 상태(활성 또는 비활성)만 가진 사용자의 테이블을 생성합니다. 따라서 봇이 중지되더라도 구독 정보는 그대로 남아 있어 봇을 다시 이용하고 싶을 때 사용할 수 있습니다. 현재는 사용자에 대한 다른 정보가 필요하지 않습니다. 이제 주요 질문: 이를 확인하는 방법은 무엇입니까? 애플리케이션을 실행해야 합니다. 지금까지 기본 docker-compose.yml 파일은 데이터베이스와 연결되어 있지 않으며 데이터베이스와 함께 애플리케이션을 디버깅하는 방법도 배워야 합니다. 따라서 Intellij IDEA를 사용하여 애플리케이션을 실행해 보겠습니다. 이를 테스트하려면 JavarushTelegramBotApplication에서 기본 메소드를 실행해야 합니다. 배포 작업과 테스트 작업을 분리하기 위해 속성이 있는 다른 파일인 application-test.properties 를 사용합니다 . 이 템플릿을 사용하여 우리는 이 파일이 테스트 프로필 에 사용될 것임을 Spring에 알립니다 . 프로필을 지정하지 않으면 기본 프로필이 사용됩니다(SpringBoot를 실행할 때 로그에서 이를 확인하세요. 이에 대해 첫 번째 줄에 기록됩니다). 다음과 같은 모습입니다.
# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
그리고 기본 application.properties는 약간 다르게 보입니다.
# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
중요한 차이점은 spring.datasource.url 필드에 있습니다. 테스트 프로필에는 localhost 에 대한 URL이 있습니다 . 즉, 애플리케이션은 Docker 외부에서 실행될 것으로 예상됩니다. 디버깅할 때 Intellij IDEA에서 프로젝트를 실행하고 로컬 시스템에서 데이터베이스에 액세스할 수 있을 것으로 예상하기 때문에 이는 사실입니다. 그러나 application.properties URL에는 이미 jrtb-db 라는 다른 URL이 포함되어 있습니다 . 이는 docker-compose의 데이터베이스 이름이 되며, 이 방법으로 docker 애플리케이션이 데이터베이스에 접근할 수 있습니다. 왜? 따라서 동일한 docker-compose 내에서 시작되며 이러한 방식으로 서로에 대해 알게 됩니다. 이는 프로젝트를 위한 하나의 폐쇄형 인프라를 갖추기 위해 필요합니다. 하지만 시작 시 프로필을 시작하는 방법은 무엇입니까? 이를 위해 Intellij IDEA에서 기본 메서드의 시작을 구성할 수 있습니다. 이를 위해 구성 편집이 있습니다 . JavarushTelegramBotApplication의 기본 클래스로 이동하여 기본 메서드 선언 옆에 있는 녹색 화살표를 클릭하고 실행 구성 수정을 선택합니다 . "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 10필요한 변수를 입력하고 프로필을 구성합니다. Intellij IDEA에서는 이 구성 창의 인터페이스가 약간 변경되었으므로 동일한 그림을 볼 수 있도록 IDEA를 최신 버전으로 업데이트하는 것이 좋습니다. 환경 변수"A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 11 필드 에서 다음 을 사용하여 봇 이름과 토큰 변수를 추가해야 합니다. 다음 템플릿: 변수 이름1=값1, 변수 이름2=값2 . 즉, key=value는 세미콜론으로 구분됩니다. 우리의 경우에는 다음과 같습니다: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (봇에 대해 다른 이름과 토큰을 갖게 됩니다) 그런 다음 옵션 수정 버튼에서 VM 옵션 추가 필드를 선택합니다 . 쓰기 : -Dspring.profiles.active =test - 이는 SpringBoot가 테스트 프로필을 사용하도록 지시합니다. 이는 속성이 application-test.properties에서 가져옴을 의미합니다. 결과는 다음과 같습니다. 이제 테스트 데이터베이스를 시작합니다. docker-compose -f docker-compose-test.yml up 정확히 이 방법으로 -d 접두사 없이 로그를 즉시 볼 수 있습니다. 필요한 경우 터미널. 마지막 단계는 간단하게 기본 메서드를 실행하는 것입니다. 내가 설명한 것과 같은 방식으로 모든 작업을 수행하면 다음과 같이 끝납니다. 로그의 두 번째 줄은 테스트 프로필이 획득한 내용에 대한 설명입니다. MySQLWorkbench를 통해 두 가지 명령을 실행하여 마이그레이션이 롤아웃되었고 모든 것이 작동하는지 확인합니다(이는 애플리케이션 실행 로그에서 볼 수 있지만 확실히 확인할 가치가 있습니다)."A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 12"A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 13"A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 14
  1. dev_jrtb_db를 사용하십시오.
  2. 테이블 표시;
결과: "A부터 Z까지의 Java 프로젝트": 데이터베이스와 관련된 모든 것을 추가합니다.  파트 1 - 15예상한 대로 테이블이 두 개 생겼습니다. 첫 번째는 마이그레이션을 설명하는 기술이고, 두 번째는 Telegram 사용자를 위한 테이블입니다. All: 데이터베이스와 함께 Flyway가 추가되었습니다. 이제 새로운 마이그레이션이 시계처럼 진행됩니다. 가장 어려운 것은 프로세스의 첫 번째 설정과 실행입니다. 계속해서 우리는 docker-compose.yml에 데이터베이스 추가, 리포지토리 계층 추가, 봇에 대한 통계, 테스트 및 문서 작성 및 업데이트 등 이 전역 작업에 대한 작업을 완료하고 있습니다.

시리즈의 모든 자료 목록은 이 기사의 시작 부분에 있습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION