회사에서 했던 프로젝트에서 NICE평가정보 사용자 인증을 받아야 되는 일이 생겼다.
web view로 화면을 띄울 수 있었지만 클라이언트 쪽에서 커스텀한 화면을 구성하길 원했고 그렇게 되면 java, php, .net으로 개발을 해야 했는데 사용했던 언어는 java뿐이었기 때문에 spring으로 컨테이너를 올릴 수 밖에 없었고 나와 같은 경우로 어쩔 수 없이 java로 개발해야 하는 분들과 무거운 IDE로 작업하는걸 선호하지 않고 개발환경 구축을 힘들어 하는 분들을 위해 글을 쓰게 되었다.
위와 같이 구성되어 있다.
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