개발자 준비를 하면서 진행했던 모든 스프링 프로젝트는 gadle 빌드 도구와 JPA를 사용했었고, 개발 툴은 IntelliJ를 사용했었다.
지금 다니는 회사에서는, maven 빌드 도구와 mybatis를 사용하며, 개발 툴은 VSCode를 사용하는 중이다.
내가 익숙하게 사용하던 툴, 빌드도구, OS가 아닌 새로운 환경에서 개발환경을 세팅하고 프로젝트를 빌드, 배포하기까지 꽤나 삽질을 많이 했다. 익숙한 환경과 개발 도구만을 사용해서 개발할 수는 없기에, 상황에 맞춰 적절하게 개발할 수 있는 내공을 갖춰야 하는데, 이번 기회에 내공을 조금은 쌓을 수 있었던 것 같다.
그럼 지금부터 VSCode를 사용해서 Spring boot + maven 개발 환경을 세팅하고, 프로젝트를 실행하고 도커를 사용해 배포하는 과정들을 기록해본다.
IntelliJ는 Java를 비롯한 JVM 언어에 특화되어 있고, VS Code는 다양한 언어를 지원하며 확장 기능을 통해 원하는 언어나 도구를 추가로 설치해 사용할 수 있다.
Java Spring boot 프로젝트를 실행하기 위해 필요한 Extension들을 설치해야 한다. 이 때, Java 언어 사용을 위해 jdk와 JAVA_HOME 환경변수 설정은 따로 세팅해줘야 한다.
Extensions 메뉴를 선택하고 아래 두 개의 Extension Pack을 설치한 후 VS Code를 재실행한다.
Maven 다운로드 페이지(https://maven.apache.org/download.cgi)에서 Binary zip archive 파일을 다운로드한다.
그 다음, 압축을 푼 경로를 시스템 환경 변수에 Path 환경변수로 설정해야 전체 경로 입력 없이 mvn 명령어만 사용하여 Maven을 빌드할 수 있다.
1) “내PC” > “속성” > "고급 시스템 설정"에서 “환경 변수” 버튼 클릭
2) "시스템 변수" 섹션에서 "새로 만들기" 클릭
3) 변수 이름을 MAVEN_HOME
으로 설정하고, 변수 값에 Maven 설치 디렉토리 경로 지정
4) "Path" 시스템 변수 내에 %MAVEN_HOME%\bin
추가
cmd에서 mvn -version
명령 실행하여 제대로 설정되었는지 확인할 수 있다.
properties
는 프로젝트의 설정이나 빌드에 사용되는 값을 정의하고 관리할 수 있다. 한 프로젝트에 여러 properties를 정의할 수 있다.activatedProfile
을 사용하여 특정 프로파일을 활성화하면 해당 프로파일에 정의된 설정들이 적용된다.activeByDefault
는 해당 프로파일로 기본적으로 활성화되어 빌드된다.<profiles>
<profile>
<id>dev</id>
<properties>
<activatedProfile>dev</activatedProfile>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>prod</id>
<properties>
<activatedProfile>prod</activatedProfile>
</properties>
</profile>
</profiles>
<activeByDefault>true</activeByDefault>
로 설정된 프로파일로 빌드된다.mvn clean install -P dev # dev 프로파일로 빌드
mvn clean install # activeByDefault = true 프로파일 설정
[프로젝트_루트_디렉토리]/target/
위치에 .war 파일이 생성된다.컨테이너 생성 및 실행
docker run [옵션] <이미지_이름> [명령]
docker run -d -it -p 6007:8080 --name dev_api tomcat:9-jdk11
docker run -d -it -p 6006:3306 --name dev_db -e MYSQL_ROOT_PASSWORD=password1234! mysql:8.0.17 --lower_case_table_names=1
docker run
: 컨테이너 생성 및 실행d
: 백그라운드 실행it
: 상호 작용 모드(interactive mode) 활성화, 터미널 할당p [호스트 포트]:[컨테이너 내부 포트]
: 호스트 포트와 컨테이너 내부 포트 연결-name [컨테이너 이름]
: 컨테이너의 이름 설정[이미지이름]:[버전]
: 컨테이너를 생성할 때 사용할 도커 이미지의 이름 지정(tomcat:9-jdk11, mysql:8.0.17)e MYSQL_ROOT_PASSWORD=
: 컨테이너 내부에서 실행되는 MySQL 서버의 루트 사용자의 비밀번호 설정. e
옵션 사용하여 환경 변수를 설정-lower_case_table_names=1
: MySQL 서버 설정 중 하나인 lower_case_table_names
값을 1로 설정. 테이블 이름의 대소문자 구분하지 않음컨테이너 목록 보기
docker ps
컨테이너 내 명령 실행
docker exec -it <컨테이너_이름_또는_ID> <실행할_명령>
docker exec -it dev_api /bin/bash
docker exec
: 실행 중인 컨테이너 내에서 명령 실행it
: 컨테이너의 셸과 상호 작용dev_api
: 접근하려는 컨테이너 이름/bin/bash
: 컨테이너 내에서 실행하려는 명령으로, Bash 셸 시작컨테이너 내부로 파일 복사
docker cp <로컬 파일 경로> <컨테이너 이름 또는 ID>:<컨테이너 내부 경로>
docker cp /home/user/docker/project.war dev_api:/usr/local/tomcat/webapps
webapps 폴더에 war 파일이 옮겨지면, 개발서버IP에 컨테이너 생성시 설정했던 포트번호로 프로젝트 파일 배포가 완료된다.