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
...