docker spring boot live reload 개발 환경 구성(vs code)

joojong·2022년 12월 10일
0

spring

목록 보기
1/1
post-thumbnail

회사에서 했던 프로젝트에서 NICE평가정보 사용자 인증을 받아야 되는 일이 생겼다.

web view로 화면을 띄울 수 있었지만 클라이언트 쪽에서 커스텀한 화면을 구성하길 원했고 그렇게 되면 java, php, .net으로 개발을 해야 했는데 사용했던 언어는 java뿐이었기 때문에 spring으로 컨테이너를 올릴 수 밖에 없었고 나와 같은 경우로 어쩔 수 없이 java로 개발해야 하는 분들과 무거운 IDE로 작업하는걸 선호하지 않고 개발환경 구축을 힘들어 하는 분들을 위해 글을 쓰게 되었다.

https://start.spring.io/

위와 같이 구성되어 있다.

build.gradle
제일 아래에 추가해준다.

...
// 파일이 변경되면 restart합니다
task buildAndReload {
	dependsOn build
	mustRunAfter build    // buildAndReload must run after the source files are built into class files using build task
	doLast {
		new File(".", "reload.txt").text = "${System.currentTimeMillis()}" // update trigger file in root folder for hot reload
	}
}

// 변경된 파일을 복사합니다.
task updateLib(type: Copy) {
	duplicatesStrategy = DuplicatesStrategy.EXCLUDE
	from configurations.compileClasspath into "libs/"
	from configurations.runtimeClasspath into "libs/"
}

bootRun {
	String activeProfile = System.properties['spring.profiles.active']
	systemProperty "spring.profiles.active", activeProfile
}

Dockerfile

FROM gradle:6.9-jdk11

WORKDIR /usr/src/spring
COPY . /usr/src/spring
VOLUME /tmp

RUN chmod +x run.sh && gradle updateLib

EXPOSE 8080

CMD [ "sh" , "run.sh" ]

root 디렉토리에
reload.txt 생성해줍니다.

run.sh

(sleep 30; gradle buildAndReload --continuous -PskipDownload=true -x Test)&
# src/main/resources/application-development.yml을 실행
gradle bootRun -PskipDownload=true -Dspring.profiles.active=development 

application-development.yml을 생성

application-development.yml

spring:
  config:
    use-legacy-processing: true
  profiles:
    active: development
  datasource:
    url: jdbc:mysql://mysql:3306/SPRING?characterEncoding=UTF-8
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      data-source-properties.useUnicode: true
      data-source-properties.characterEncoding: UTF-8
  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect
  devtools:
    livereload:
      enabled: true
    restart:
      additional-paths: .
      trigger-file: reload.txt
      

docker-compose.yml

version: "3"
services:
  spring:
    build:
      context: ./spring
      dockerfile: Dockerfile
    container_name: spring
    env_file: .env
    environment:
      - ENV=development
    restart: always
    volumes:
      - "./spring:/usr/src/spring"
    ports:
      - 8080:8080
    depends_on:
      - mysql # mysql이 실행되고 spring container가 실행됩니다.
  mysql:
    # platform: linux/amd64 # m1칩일 경우
    image: "mysql:8.0.21"
    logging:
      driver: none
    restart: always
    container_name: mysql
    ports:
      - "3306:3306"
    env_file:
      - ./.env
    volumes:
      - ./mysql/conf.d:/etc/mysql/conf.d
      - ./mysql/data:/var/lib//mysql # mysql/data에 데이터를 담을 때 사용 합니다.
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d #intidb.d의 create.sql을 실행
    environment:
      MYSQL_DATABASE: SPRING
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password

vscode Extension에서
Extension Pack for Java 설치하고

cd spring
./gradlew build
입력

DataSourceBeanCreationException을 뱉는데 test에서 connection을 제대로 맺지 못하고 뱉는 에러로 mysql server도 container로 올라가있어야 하는데 아직 올라가있지 않기 떄문에 BUILD FAILED dependencies는 제대로 받아왔기 때문에 무시하시면 됩니다.

docker-compose up --build 커맨드를 입력 후 실행하면
nodemon과 같이 저장했을 때 변경사항이 다시 반영되는 걸 확인할 수 있습니다.

테스트로 만들어놓은 AuthController.java에서 body값을 변경 후 저장해서 테스트할 수 있습니다.
http://localhost:8080/test

소스코드는 git에 올려놓았습니다
https://github.com/jjh930301/docker-springboot-starter-pack

profile
Back-end developer

0개의 댓글