Spring-Boot + mysql + docker-compose + AWS

YeJin Lee·2024년 10월 16일

Spring Boot

목록 보기
11/11

version

Categoryversion || option
ProjectGradle-Grrovy
LanguageJava
Spring Boot3.3.4
PackaginJar
MYSQL8.0.39
Docker-composev2.29.2-desktop.2

Directory structure

프로젝트 build

├── build
│   └── libs
│       └── *SNAPSHOT.jar

database 연동 정보

├── build
│   └── resources
│       └── main
│           └── application.yml

Dockerfile

├── .
│   └── Dockerfile

docker-compose.yml

├── .
│   └── docker-compose.yml

Docker Compose와 Dockerfile의 차이점

Dockerfile
사용자가 이미지를 조립하기 위해 호출할 수 있는 명령을 담은 간단한 텍스트 파일

Docker Compose

  • docker-compose.yml에서 앱을 구성하는 서비스를 정의하여 격리된 환경에서 함께 실행할 수 있도록 함
  • docker-compose up을 실행하기만 하며 하나의 명령으로 앱을 실행
  • 프로젝트의 docker-compose.yml에 build명령을 추가하면 Docker compose가 Dockerfile을 사용

Docker 워크플로 ▶ 각 이미지에 적합한 Dockerfile을 빌드 ▶ compose를 사용하여 build 명령을 사용하여 이미지를 조립


환경설정

Dockerfile

FROM openjdk:17-oracle
ARG JAR_FILE=build/libs/*SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • FROM : base-image
  • ARG : 변수 설정 (빌드파일의 경로)
  • COPY : 빌드파일을 컨테이너로 복사
  • ENTRYPOINT : jar 파일 실행

application.yml

spring:
  main:
    debug: true
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://[database container name]:3306/[database table name]?createDatabaseIfNotExist=true
    username: [username]
    password: [password]
  jpa:
    hibernate:
      ddl-auto: update
    properties:
      hibernate:
        format_sql: true
        show_sql: true

logging:
  level:
    org:
      hibernate:
        type:
          descriptor:
            sql: trace
  • db-mysql : 도커환경에서 mysql이 구동되는 컨테이너의 이름(호스트)

  • 3306 : Port

  • mydb : 데이터베이스 이름

  • ddl-auto : hibernate가 데이터베이스 스키마를 자동으로 업데이트

  • format_sql : hibernate가 생성한 SQL 쿼리를 포맷팅하여 출력

  • show_sql : 콘솔에 SQL 쿼리를 출력

  • logging:
      level:
        org:
          hibernate:
            type:
              descriptor:
                sql: trace
    

  logger를 이용해 쿼리를 보여줌

docker-compose.yml

version: "3.7"

services:
  db:
    image: [docker hub id]/[repository]:[tag]
    restart: always
    container_name: db-mysql
    environment:
      MYSQL_DATABASE: [database table name]
      MYSQL_ROOT_PASSWORD: [root password]
    ports:
      - "3306:3306"
    networks:
      - [docker networks name]
    volumes:
      - ./db:/var/lib/mysql

  spring-boot-app:
    image: [docker hub id]/spring-boot-demo:springboot1.0
    container_name: springboot
    ports:
      - "8080:8080"
    depends_on:
      - db
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://[database container name]:3306/[database table name]?createDatabaseIfNotExist=true
      SPRING_DATASOURCE_USERNAME: [database username]
      SPRING_DATASOURCE_PASSWORD: [database password]
    networks:
      - springboot-mysql-net

networks:
  [docker network name]:
    driver: bridge

Java Code > 구축환경 블로그 참고

Member

  • @Entity : 데이터의 집합을 의미하며 저장되고 관리되어야 하는 데이터, 실질적으로 DB의 테이블과 매칭
  • @Id : 데이터베이스 테이블의 기본 키(PK)와 객체의 필드를 매핑시켜주는 어노테이션
  • GeneratedValue : 기본 키를 자동 생성해주는 어노테이션
    - @GeneratedValue( strategy = GenerationType.IDENTITY )
     IDENTITY 전략은 기본 키 생성을 데이터베이스에 위임하는 전략
  • @Generated : 사람이 만든 소스가 아닌, 다른 소스 자동 생성기가 생성한 코드를 지칭할 때 사용하는 어노테이션

배포

deploy.yml

name: Deploy To EC2

on:
  push:
    branches:
      - main


jobs:
  Deploy:
    runs-on: ubuntu-latest
    steps:
      - name: docker hub 로그인
        uses: docker/login-action@v2
        with:
            username: ${{ secrets.DOCKER_ID }}
            password: ${{ secrets.DOCKER_PW }}

      - name: SSH(원격접속)로 EC2에 접속하기
        uses: appleboy/ssh-action@v1.0.3
        env:
          APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
          DOCKER_COMPOSE_YML: ${{ secrets.DOCKER_COMPOSE_YML }}
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USERNAME }}
          key: ${{ secrets.EC2_PRIVATE_KEY }}
          envs:
            APPLICATION_PROPERTIES, DOCKER_COMPOSE_YML
          scripts_step: true
          script: |
            # 환경 설정
            cd /home/ubuntu/spring-boot
            rm -rf src/main/resources/application.yml
            rm -rf docker-compose.yml

            git pull origin main
            echo "$APPLICATION_PROPERTIES" > src/main/resources/application.yml
            echo "$DOCKER_COMPOSE_YML" > docker-compose.yml
            sudo ./gradlew clean build -x test
            
            # port kill
            sudo fuser -k -n tcp 8080 || true
            sudo fuser -k -n tcp 3306 || true

            # 실행 중인 컨테이너 삭제
            sudo docker rm -f springboot
            sudo docker rm -f db-mysql
            
            # container pull
            sudo docker pull ${{ secrets.DOCKER_ID }}/spring-boot-demo:mysql1.0
            sudo docker pull ${{ secrets.DOCKER_ID }}/spring-boot-demo:springboot1.0
            
            # container 구동
            sudo docker-compose up -d

            # log
            sudo docker ps -a
            nohup java -jar build/libs/*SNAPSHOT.jar > ./output.log 2 >& 1 &

도움받은 블로그

전체적인 맥락
https://velog.io/@dhk22/Springboot-MySQL-Docker-%EB%8F%84%EC%BB%A4%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1

구축 환경
https://jnsodevelop.tistory.com/90

Dockerfile 및 docker-compose.yml 차이
ttps://velog.io/@s2moon98/dockerFile%EA%B3%BC-docker-compose.yml-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

JPA 기본키
https://ttl-blog.tistory.com/123

profile
안녕하세요, 영문과코딩 입니다.

0개의 댓글