개요
자바 언어를 쓰는 사람들의 대부분은 웹 프로젝트를 구성하기 위해서 자바 언어를 사용한다. 이 때 우리는 보통 빌드와 배포를 도와주는 Maven 이나 Gradle 과 같은 도구를 활용하여 빌드 및 배포를 진행한다.
배포를 하다보면 생각보다 다양한 문제 상황들이 생기는데, 때로는 프로젝트에서 대부분의 파일은 그대로 두고 몇개의 파일만 새로 배포하고 싶을 때도 있고 때로는 통째로 모든 파일을 뒤엎어버리고 싶을 때도 있다.
도구에서 지원하는 버튼 하나로 매일 배포하다가 특수한 상황에서 배포를 할 때, 배포에 대한 지식이 없으면 혼란스러운 경험을 할 수 있다.
용어 정리
기본적인 용어를 알아야 배포 관련 설명을 이해할 수 있다.
빌드 (Build)
.java
파일을 .class
파일로 컴파일하고, 기존의 파일 저장 형식을 개발형 디렉토리 구조에서 배포용 디렉토리 구조로 만들고, 최종 결과물로 .war
혹은 .jar
확장자를 가진 실행 가능한 배포 파일을 생성하기 위해 수행하는 모든 과정을 말한다.
이 과정에서 테스트 & 테스트 커버리지 체크, 코드 품질 체크와 같은 추가적인 작업도 끼워넣을 수 있다.
위키피디아에서는 대표적인 3가지 기능을 Version control, Code quality, Compilation 으로 꼽고 있다. 이 중 컴파일을 오직 작은 프로세스 중 하나라고 꼽는 부분을 주목할만하다.
아티팩트 (Artifact)
자바 프로젝트에서 아티팩트는 보통 빌드를 통해 얻을 수 있는 .jar
, .war
와 같은 확장자를 가진 배포용 파일을 말한다.
Intellij 에서 Artifact 라는 용어가 쓰인다.
In end-user development an artifact is either an application or a complex data object that is created by an end-user without the need to know a general programming language. Artifacts describe automated behavior or control sequences, such as database requests or grammar rules, or user-generated content. Artifact (software development) from wikipedia
배포 (Deploy)
자바 웹 프로젝트를 서버에 올려 작동 가능한 상태로 만드는 것을 말한다.
개발 환경에서만 사용되던 의존성이나 소스코드의 주석과 같은 부분은 보통 배포 과정에서 제거되고, 이용자가 최적의 환경에서 최적의 속도로 이용할 수 있도록 만들어진다.
패키징 유형
패키징이란 보통 프로젝트 실행에 필요한 모든 파일을 한데 묶어 구성하는 것을 말한다.
Package (archive)
프로젝트 배포에 필요한 .war
혹은 .jar
파일을 만드는 것을 말한다.
Maven 프로젝트의
package
라이프사이클을 실행하면.war
혹은.jar
파일이 생긴다.
Exploded (assemble, expanded)
- 압축된
.war
혹은.jar
파일을 만들지 않고 압축이 해제된 형태의 배포 파일을 만드는 것을 말한다. - Intellij 에서 프로젝트 개발 시에 재생버튼을 누르면, 이 형태의 패키징이 이루어진다.
- Intellij 에서 따로 설정하지 않으면,
/target/프로젝트명
디렉토리에 Exploded 된 빌드된 프로젝트 파일이 존재한다.
- Intellij 에서 따로 설정하지 않으면,
- 원본 소스에서 몇가지 부분만 배포할 때, Exploded 된 빌드 파일에서 몇몇 파일만 덮어씌우기도 한다.
In-place
- 소스 디렉토리 전체 혹은 일부를 그대로 배포하는 방식을 말한다.
- 로컬 서버에 프로젝트를 배포하는 경우 적합하다.
- WAS (Tomcat) 가 런타임 시 생성하는 파일이 소스코드와 섞일 수 있는 문제가 있다.
Intellij 에서 GUI 에서 프로젝트 빌드 및 배포하기
Project Structure > Project Settings > Artifacts
를 클릭하면 위와 같은 화면이 보이고 여기서.war
파일을 추출해 배포할 수 있다.Output directory
의 경로를 수정하면,Exploded
형태로 배포된 프로젝트가 어디에 위치할지 설정도 가능하다.Validation
에서 검증을 추가할 수 있다.Pre-processing
,Post-processing
에서 빌드 전처리 후처리 작업을 추가할 수 있다.
다른 배포방법
개인적으로는 mvnw
나 gradlew
에서 제공하는 명령어로 배포하는 것이 훨씬 더 편하다고 느꼈다.