아마 스프링 개발을 해보신 경험이 있으신 분이라면 Maven 이나 Gradle 이라는 빌드 툴에 익숙하실것 같습니다. 오늘은 그중 Maven 에 대해서 알아보겠습니다!
빌드(Build)란?
소스코드를 컴퓨터에서 실행할 수 있는 독립적인 형태(war, jar 등등)로 면환하여 JVM이나 WAS가 인식할 수 있는 구조로 패키징하는 과정과 그 결과물을 말합니다. 예를 들어 Java 프로젝트를 생성한다면, 소스코드를 컴파일해서 .class 파일로 변환하고 resource 를 .class에서 참조할 수 있는 적절한 위치로 옮기고 하나로 압축하는 과정을 의미합니다.
빌드 툴(Build tool)이란?
빌드 툴, 빌드 도구는 프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 전용 프로그램입니다. 당연히 직접 모든 라이브러리를 다운받고 여러 과정을 거쳐서 빌드하는 것도 가능합니다...만, 비즈니스로직과는 관련없는 단순반복적인 업무이기 때문에 빌드 툴을 사용한다면 훨씬 좋겠죠? 따라서 빠른기간 계속해서 늘어나는 라이브러리 추가, 라이브러리 버전 동기화의 어려움을 해소하고자 등장하였습니다.
초기에 java의 빌드 툴로는 Ant가 많이 사용되었으나, Ant는 스크립트 작성과 라이브러리 의존관리가 되지않아서 Maven과 Gradle 이 더 많이 쓰이고있습니다.
Maven이란?
Maven은 Apache 사에서 만든 빌드 툴입니다. 특징으로는 pom.xml 이라는 파일을 통해 의존성이 관리가 되는데, 해당 xml 파일에 필요한 라이브러리를 정의해놓으면 내가 사용할 라이브러리 뿐만 아니라 해당 라이브러리가 작동하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운받아줍니다.
Maven 기본개념
Maven 을 이해하기 위해서는 아래 4가지 개념을 알아야합니다.
- Plugin: Maven에서 제공하는 모든 기능은 플러그인을 기반으로 동작합니다. 플러그인은 여러가지 기능을 수행할 수 있는 하나이상의 goal들을 가지고 있습니다.
- Goal: 플러그인에 포함되는 명령입니다. 내가 실제로 실행할 명령이라고 생각하시면 됩니다.
- Phase: Lifecycle에서 특정 단계를 의미합니다. 순서/단계 만을 정의하고 있는 개념으로 각 Phase에는 플러그인의 goal들이 연결되어있고, 실질적으로는 goal들이 빌드작업을 하게됩니다.
- Lifecycle: 일반적으로 프로젝트를 빌드할때 [결과물 삭제] -> [컴파일에 필요한 리소스 복사] -> [소스코드 컴파일] -> [테스트] -> [압축(패키징)] -> [배포(원격저장소에 배포)] 와 같은 과정을 거치는데, 이러한 빌드단계를 Maven은 미리 정의하고 있습니다. Maven에서는 총 3개의 Lifecycle을 제공합니다. 기본(default), Clean, Site
주의할 점
Maven Lifecycle에서 phase는 독립적이지 않습니다. 어떠한 phase는 그 앞에 특정 phase를 반드시 수행해야만 실행이 될 수 있습니다. 따라서 특정 phase를 실행시 앞에 있는 phase들이 자동으로 순차적으로 먼저 실행됩니다.
Lifecycle (Default)
Maven의 기본 Lifecycle로 소스코드 컴파일, 테스트, 압축(패키징), 배포를 담당합니다.
- compile: 소스코드를 컴파일하여 자바코드를 바이트코드(*.class)로 변환합니다.
- test: JUnit, TestNG와 같은 단위테스트 프레임워크로 단위 테스트를 합니다. 단위테스트가 실패하면 빌드 시래로 간주합니다.
- package: pom.xml의 <packaging/> 값 (jar, war 등)에 따라 압축합니다
- install: 로컬 저장소(개인PC)에 압축한 파일을 배포합니다. (기본적으로 {사용자}/.m2/repository/ 경로입니다)
- deploy: 원격 저장소에 압축한 파일을 배포합니다.
Lifecycle (Clean)
Maven의 결과물/산출물을 제거하기 위한 Lifecycle 입니다.
- clean: 기본적으로 Maven은 {project경로}/target 폴더를 새로 생성하여 산출물을 저장하기 때문에 해당 goal이 실행되면 target 폴더를 삭제합니다.
Lifecycle (Site)
프로젝트의 도큐멘트 사이트를 생성해주는 Lifecycle 입니다
- site: Maven 설정 파일 정보를 이용하여 프로젝트를 문서화한 간단한 웹을 만들어줍니다.
- site-deploy: 생성된 문서 사이트를 설정된 서버에 배포하는 역할을 합니다.
실제로 site 를 수행하면 사이트생성에 필요한 여러 라이브러리가 자동으로 로컬 저장소에 다운로드되면서 target 폴더에 이렇게 문서가 생성됩니다.
예시로 dependencies.html 에 들어가면 아래와 같이 프로젝트가 메뉴별로 문서화 된것을 보실 수 있습니다.
출처:
- Maven 이란?
- [Maven] 메이븐 이란? (정의, 예제)
- 빌드(Build)란 무엇일까?
- Maven의 phase, goal , lifeCycle
- MAVEN - plugin, phase, goal, LifeCycle
'Spring' 카테고리의 다른 글
[Cache] EHCache 란? (0) | 2023.04.10 |
---|---|
[Maven] Maven dependency의 Scope 옵션 (0) | 2023.04.09 |
[Spring] @Transactional 어노테이션 동작방식 (0) | 2023.02.21 |
[JPA] 비관적 락(Pessimistic Lock)과 낙관적 락(Optimistic Lock) (0) | 2022.11.01 |
[Spring] Spring AOP 프록시 - JDK Proxy(JDK Dynamic Proxy), CGLib (0) | 2022.10.30 |