Hello, Freakin world!

[docker-compose] 스프링 부트 + MySQL 환경 구성하기 본문

도커

[docker-compose] 스프링 부트 + MySQL 환경 구성하기

johnna_endure 2021. 3. 5. 17:08

간단하게 service-a 라는 MySQL 기반의 스프링부트 프로젝트를 만들어 보자.

 

우선 스프링 이니셜라이저를 이용해 프로젝트를 생성한다.

 

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'springboot.web'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

 


 

application.yml

spring:
  datasource:
    url: jdbc:mysql://${DB_HOST:db}:3306/testdb
    username: sa
    password: sa

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect

ddl-auto 옵션을 create로 주고 엔티티 클래스들이 DB 내에서 자동으로 테이블을 생성하도록 하자.

DB와 제대로 연결됐는지 확인하기 위해 도커 내에서 실행중인 mysql 서버에 접근해 테이블 생성 여부를 확인할 것이다.


간단한 엔티티 클래스를 하나 생성하자.

import lombok.Getter;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Getter
@Entity
public class Member {

    @Id @GeneratedValue
    private Long id;

    protected Member() {}
}

이제 프로젝트를 빌드한 다음 mysql-docker 라는 폴더 내에 빌드한 jar 파일을 복사한다.

그리고 같은 위치에 Dockerfile, docker-compose.yml 파일을 생성한다.

 

Dockerfile

FROM openjdk:11
RUN mkdir /app
ADD servicea-0.0.1-SNAPSHOT.jar /app
CMD [ "java", "-jar", "/app/servicea-0.0.1-SNAPSHOT.jar" ] 

docker-compose.yml

version: "3.0"
services: 
  db:
    image: mysql:8
    environment: 
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_USER: sa
      MYSQL_PASSWORD: sa
      MYSQL_DATABASE: testdb
    ports: 
      - 3306:3306
  service-a:
    build: .
    restart: on-failure
    links: 
      - db
    depends_on: 
      - db

    

mysql 이미지의 자세한 사용법은 도커 허브의 mysql 공식 리포지토리의 내용을 읽어보면 알 수 있다.

 

 

mysql - Docker Hub

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

 

주의해야 할 점은 service-a의 restart 옵션을 반드시 사용해야 된다는 점이다.

 

service-a 는 DB 커넥션이 없으면 예외를 던지면서 애플리케이션이 종료되고 컨테이너도 종료되버린다.

이를 방지하기 위해 depend-on 이라는 옵션을 이용해 service-a 컨테이너가 db 컨테이너에 의존하고 있다는걸 사실 명시했지만 이것만으로는 대처가 안된다. 이유는 db 컨테이너가 생성되고 다른 접속을 받을 수 있도록 소켓 대기 상태를 만든 뒤에 service-a 컨테이너가 만들어져야 되는데, 소켓 대기 이전에 service-a 컨테이너를 실행해버리기 때문.

그렇기 때문에 service-a가 실패하더라도 다시 db 컨테이너에 연결을 시도하도록 restart 옵션을 줘야 된다.

 

이제 docker-compose up 명령어를 통해 컨테이너를 띄우고 실행중인 db 컨테이너에 접속해 테이블이 생성됐는지 확인해보자.

 

docker container ls 명령어로 컨테이너 리스트를 볼 수 있다.

mysql-docker-db_1 이라는 이름의 mysql 컨테이너가 실행중이다.

 

실행 중인 컨테이너에 접근하기 위해 다음의 명령어를 이용한다.

docker exec -it mysql-docker_db_1 /bin/bash

db 컨테이너의 쉘에 접속했다면 mysql username, password 를 이용해 mysql에 연결한다.

 

 

 

testdb가 생성됐다.
member 테이블 역시 생성된 걸 확인

Comments