docker

2. 간단 spring boot app에 mysql연동하기

수학소년 2023. 2. 22. 01:52

1. docker-compose.yml 작성

version: '2.1'

services:
  main:
    build: ../docker-single
    mem_limit: 350m
    ports:
      - "8080:8080"
    depends_on:
      mysql:
        condition: service_healthy

  # $ mongo
  mongodb:
    image: mongo:3.6.9
    mem_limit: 350m
    ports:
      - "27017:27017"
    command: mongod --smallfiles

  # $ mysql -uroot -h127.0.0.1 -p
  mysql:
    image: mysql:5.7
    mem_limit: 350m
    ports:
      - "3307:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=rootpwd
      - MYSQL_DATABASE=review-db
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pwd
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-uuser", "-ppwd", "-h", "localhost" ]
      interval: 10s
      timeout: 5s
      retries: 10

docker-compose.yml의 위치는 일단 프로젝트 root directory에 만들어도 됌.

다른 위치여도 상관없음. build란에 프로젝트를 지정하면 됌.

 

mysql "3307:3306"의 이유는 로컬에 3306은 mariadb가 사용중임.

mysql 환경변수로 database, user, password를 지정했음. 나중에 이대로 app에서 mysql연동해야함.

 

2. build.gradle에 mysql연동을 위한 dependencies추가

...
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'mysql:mysql-connector-java'
...

3. application.properties에 mysql연동 설정

server.port=8080

spring.jpa.hibernate.ddl-auto=create

spring.datasource.url=jdbc:mysql://mysql/review-db
spring.datasource.username=user
spring.datasource.password=pwd

logging.level.org.hibernate.SQL=DEBUG

4. test소스 주석

현재 application.properties로는 mysql에 접속할 수 없음. app 기동할때 mysql container를 올릴꺼라서

로컬에서 빌드 시, fail뜰꺼임.

그래서 테스트 소스 주석.

 

5. 이제 docker-compose 수행

docker-compose.yml 있는 위치로 가서 "docker-compose up" 수행

수행시, app관련 로그만 발췌

docker-single-main-1     | 
docker-single-main-1     |   .   ____          _            __ _ _
docker-single-main-1     |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
docker-single-main-1     | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
docker-single-main-1     |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
docker-single-main-1     |   '  |____| .__|_| |_|_| |_\__, | / / / /
docker-single-main-1     |  =========|_|==============|___/=/_/_/_/
docker-single-main-1     |  :: Spring Boot ::                (v3.0.2)
docker-single-main-1     | 
docker-single-main-1     | 2023-02-21T16:41:57.276Z  INFO 1 --- [           main] com.example.single.SingleApplication     : Starting SingleApplication using Java 17-ea with PID 1 (/app.jar started by root in /)
docker-single-main-1     | 2023-02-21T16:41:57.284Z DEBUG 1 --- [           main] com.example.single.SingleApplication     : Running with Spring Boot v3.0.2, Spring v6.0.4
docker-single-main-1     | 2023-02-21T16:41:57.286Z  INFO 1 --- [           main] com.example.single.SingleApplication     : No active profile set, falling back to 1 default profile: "default"
docker-single-main-1     | 2023-02-21T16:41:58.112Z  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
docker-single-main-1     | 2023-02-21T16:41:58.137Z  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 14 ms. Found 0 JPA repository interfaces.
docker-single-main-1     | 2023-02-21T16:41:58.822Z  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
docker-single-main-1     | 2023-02-21T16:41:58.843Z  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
docker-single-main-1     | 2023-02-21T16:41:58.843Z  INFO 1 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.5]
docker-single-main-1     | 2023-02-21T16:41:58.965Z  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
docker-single-main-1     | 2023-02-21T16:41:58.973Z  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1589 ms
docker-single-main-1     | 2023-02-21T16:41:59.190Z  INFO 1 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
docker-single-main-1     | 2023-02-21T16:41:59.263Z  INFO 1 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.1.6.Final
docker-single-main-1     | 2023-02-21T16:41:59.551Z  WARN 1 --- [           main] org.hibernate.orm.deprecation            : HHH90000021: Encountered deprecated setting [javax.persistence.sharedCache.mode], use [jakarta.persistence.
sharedCache.mode] instead
docker-single-main-1     | 2023-02-21T16:41:59.704Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
docker-single-main-1     | 2023-02-21T16:42:00.245Z  INFO 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@4fe01803
docker-single-main-1     | 2023-02-21T16:42:00.248Z  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
docker-single-main-1     | 2023-02-21T16:42:00.311Z  INFO 1 --- [           main] SQL dialect                              : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
docker-single-main-1     | 2023-02-21T16:42:01.370Z DEBUG 1 --- [           main] org.hibernate.SQL                        : drop table if exists single
docker-single-main-1     | 2023-02-21T16:42:01.383Z DEBUG 1 --- [           main] org.hibernate.SQL                        : create table single (no bigint not null auto_increment, cnt integer not null, rmk varchar(255), primary key
 (no)) engine=InnoDB
docker-single-main-1     | 2023-02-21T16:42:01.410Z  INFO 1 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaP
latform]
docker-single-main-1     | 2023-02-21T16:42:01.428Z  INFO 1 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
docker-single-main-1     | 2023-02-21T16:42:01.502Z  WARN 1 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view ren
dering. Explicitly configure spring.jpa.open-in-view to disable this warning
docker-single-main-1     | 2023-02-21T16:42:01.935Z  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
docker-single-main-1     | 2023-02-21T16:42:01.955Z  INFO 1 --- [           main] com.example.single.SingleApplication     : Started SingleApplication in 5.24 seconds (process running for 5.783)

"HikariPool-1 - Starting...",
"HikariPool-1 - Start completed." 를 볼 수 있음. mysql연결이 잘 됐음.

 

"drop table if exists single"
"create table single (no bigint not null auto_increment, cnt integer not null, rmk varchar(255), primary key
 (no)) engine=InnoDB"

entity로 만든 vo로 table을 만드는 로그가 찍힘. jpa연동이 잘 됐음.

 

docker desktop에서도 docker-compose로 잘 올라간걸 확인할 수 있음.

 

6. 방금 올린 mysql을 DB tool로 접속하기

DBeaver를 선택함.


7.  mongoDB 연동

// docker-compose.yml
version: '2.1'

services:
  review:
    build: docker-single
    mem_limit: 350m
    ports:
      - "8080:8080"
    depends_on:
      - mongodb

  # $ mongo
  mongodb:
    image: mongo:3.6.9
    mem_limit: 350m
    ports:
      - "27018:27017"
    command: mongod --smallfiles
// build.gradle
...
	// implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
...
// application.yml
...
spring.data.mongodb:
  host: mongodb
  port: 27017
  database: recommendation-db
...