우리가 많이 쓰는 Maven과 Gradle은 빌드 관리 도구이다. 그렇다면 빌드는 뭐고, 빌드 관리 도구란 무엇일까?
빌드와 컴파일은 개념을 혼동하기가 쉬운데, 빌드는 컴파일뿐만이 아니라 소스코드 파일부터 시작해서 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환되는 과정 전체를 말한다.
자바를 예로 든다면, 개발자가 작성한 .java이 컴파일돼서 .class파일로 변환되고 resource를 .class에서 참조할 수 있는 위치로 옮긴다. 또한 META-INF와 MANIFEST.MF 들을 하나로 압축하는 과정이다. 즉, 우리가 작성한 소스코드와 자원을 JVM이나 톰캣같은 WAS가 인식할 수 있도록 패키징하는 과정을 말한다.
소스코드에서는 여러가지 외부 라이브러리를 참조해 사용하는데, 빌드 관리도구는 사용자가 관리할 필요없이 필요한 라이브러리를 자동으로 관리한다.
빌드관리 도구는
- 종속성 다운로드
- 컴파일
- 컴파일된 바이너리 코드를 패키징(Packaging)
- 테스트 실행
- 프로덕션 시스템에 배포
Maven, Gradle이 이러한 빌드 관리도구이다.
메이븐은 대표적인 Lifecycle관리 목적 빌드 도구이다.
아래와 같은 라이프 사이클을 가진다.
(1) clean : 빌드 시 생성되어있었던 파일들을 삭제한다.
(2) validate : 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
(3) compile : 프로젝트 소스코드를 컴파일 하는 단계
(4) test : 단위 테스트를 수행하는 단계. 테스트 실패 시 빌드 실패로 처리하며, 스킵이 가능하다.
(5) package : 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 파일의 배포를 위한 패키지로 만든다.
(6) verify : 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인한다.
(7) site : 프로젝트 문서와 사이트 작성, 생성하는 단계
(8) deploy : 만들어진 package를 원격 저장소에 release하는 단계
또한 Maven은 필요한 라이브러리를 pom.xml에 정의한다.
gradle은 Ant Builde와 groovy script를 기반으로 구축된, maven을 대항(?)하는 빌드 툴이다.
캐시를 사용하고, 빌드 속도가 Maven에 비해 10~100배 가량 빠르며, Java, C/C++, Python 등을 지원한다.
Groovy는 JVM에서 실행되는 스크립트 언어이다. 또한 컴파일 과정이 필요없다. Java문법과 유사하여 if else절등을 사용할 수 있다.
예전에야 Maven을 많이 썼지만, 지금은 속도와 가독성면에서 Gradle이 압도적이기에 Gradle로 많이 넘어온 추세라고 한다. 시간과 비용이 들지만 배워두는게 좋다고 생각하다.
기본적으로 JAR, WAR 모두 Java의 jar 옵션 (java -jar)을 이용해 생성된 압축(아카이브) 파일로, 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성 파일 등)을 패키징 한 것이다.
JAVA 어플리케이션이 동작할 수 있도록 자바 프로젝트를 압축한 파일
-Class (JAVA리소스, 속성 파일), 라이브러리 파일을 포함함
-JRE(JAVA Runtime Environment)만 있어도 실행 가능함 (java -jar 프로젝트네임.jar)
-Servlet / Jsp 컨테이너에 배치할 수 있는 웹 애플리케이션(Web Application) 압축파일 포맷
-웹 관련 자원을 포함함 (JSP, Servlet, JAR, Class, XML, HTML, Javascript)
-사전 정의된 구조를 사용함 (WEB-INF, META-INF)
-별도의 웹서버(WEB) or 웹 컨테이너(WAS) 필요
즉, JAR파일의 일종으로 웹 애플리케이션 전체를 패키징 하기 위한 JAR 파일이다.
스프링부트는 내장WAS가 있어, WAR를 사용할 필욘 없다. 외장 WAS를 이용할 계획이 있다면 WAR를 사용하는 것이 좋겠지만, 그렇계획이 없다면 JAR를 사용하는 게 좋다.