본문 바로가기
Develop/Spring Framework

스프링 서버를 Docker, Docker-compose로 멋들어지게 띄워보기

by 제이._ 2023. 1. 9.

안녕하세요.

Docker와 Docker compose는 개발을 하다 언젠가 쓰게 됩니다,.

한 번 쓰면 너무 편해서 이전으로 돌아가기 힘든 것 같습니다.

저는 처음에 Docker에 대한 개념도 잘 몰랐고, 왜 쓰는지에 대해도 몰랐습니다.

따라서 이번 글을 보시고 프로젝트에 적용하시기 전에 도커에 대한 개념은 유튜브나 다른 블로그 포스팅을 보고 참고하고 보시는 것을 추천드립니다.

처음에 저 같은 경우는 도커 세팅에 관한 글은 많지만, 실제로 너무 두루뭉실한 얘기들이 많아서 따라하기가 너무 힘들었습니다.

그래서 노드 개발하는 친구에게 많이 물어보고 귀찮게 했습니다.

오늘 글을 통해서 우리가 배워볼 건 다음과 같습니다.

  1. Docker, Docker-compose, .env 민감 정보 감추기, yml 설정하기
  2. 서버 띄워보기

 

Docker, Docker-compose, .env 파일을 이용해 민감 정보 감추기, application 파일 설정하기

먼저 Docker, Docker-compose.yml 파일을 세팅해줘야합니다.

이 파일들의 위치는 프로젝트 최상단 폴더에 위치합니다. (사진 참조)

 

 

 

먼저 Dockerfile부터 설정해주겠습니다.

FROM openjdk:11
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

위와 같이 해주시면 되는데, 주의할 점은 openjdk 부분은 자신 버전과 맞는 jdk를 적어주셔야합니다.

보통 프로젝트를 빌드하게 되면 /build/libs 디렉토리에 .jar 파일이 생기게 됩니다.

Dockerfile은 이를 캐치해주는 역할을 합니다.

docker-compose.yml 파일을 설정해주겠습니다.

version: '3.8'
services:
  mysqldb:
    image: mysql
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    ports:
      - 3306:3306

  redis:
    image: redis
    ports:
      - 6379:6379

  backend:
    build: .
    restart: always
    environment:
      SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
      SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}
    ports:
      - 8080:8080
    depends_on:
      - mysqldb
      - redis

저는 mysql, redis, 서버 총 3개를 돌리기 때문에 위와 같이 설정했습니다.

만약에 redis를 안 쓰신다면 redis부분만 쭉 지워주시면 됩니다.

반대로 추가하고 싶으시다면, 추가 해주시면 됩니다.

그리고 데이터를 감추었는데, 이는 .env 파일을 통해 세팅이 가능합니다.

MYSQL_DATABASE=디비명
MYSQL_ROOT_PASSWORD=디비패스워드
SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/디비명
SPRING_DATASOURCE_USERNAME=db유저네임
SPRING_DATASOURCE_PASSWORD=디비패스워드

위와 같이 .env 파일에 설정을 자신 프로젝트에 맞게 해주시면 됩니다.

여기까지 하셨다면 기존 데이터베이스와 연결한 application 파일을 고쳐주면 됩니다.

이 게시글에서 저는 properties가 아닌 yml 확장자를 사용합니다.

appllication.yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/디비이름적어주세요?useSSL=false&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true
    username: 아이디
    password: 패스워드
    driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    host: localhost
    port: 6379

  jpa:
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      use-new-id-generator-mappings: false
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        #use_sql_comments: true
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher # about swagger

위와 같이 설정해주시면 됩니다.

참고로 저는 profile 속성을 이용해서 더 관리하게 편하게 만들었습니다.

이에 대한 내용은 아래 포스팅 참고해주시면 됩니다.

https://blog.naver.com/sosow0212/222922713513

 

스프링에서 properties 파일을 통해 민감 정보 감추는 방법

개발을 하고 서버로 배포를 하면, 민감한 값을 숨겨야 하는 경우가 생깁니다. 데이터베이스 키 값을 숨긴다...

blog.naver.com