Spring Project 자원관리도구
- Build Tool(빌드도구) :
。소스코드의빌드 과정을 자동으로 처리해주는프로그램
▶ 개발자의 Source code를 실행 가능한 Application으로 구축해주는 역할을 수행.
▶ 각 개발언어에 맞는Project를 build 및Dependency를 관리.
。필요한 외부라이브러리를 자동 추가 및 관리.
- Maven :
XMLScript 기반으로pom.xml을 이용해 자동으로 library 와 dependency를 관리.
。Maven clean,install
view - Tool Windows - Maven - 프로젝트명 - Lifecycle - clean 우클릭 - Run Maven Build
- Gradle :
。Maven이후 출시한Java,Kotlin,Android의Project Build Tool로서build.gradle에 script를 작성하여 dependency를 관리.
▶groovy 언어를 사용하여설정을 수행하며 유연하게빌드 스크립트(build.gradle)를 작성
Build Tool을 사용하는 이유?
。개발자가 어플리케이션 개발을 위해 새 프로젝트를 생성 시 매번 공통적으로 사용하는 다양한Spring MVC,Spring Web,Hibernate등의 Dependency를 추가, 삭제등의 관리 및Versioning을 수행하여 쉽게 최신버전의 Dependency를 Project에 적용할 수 있도록 설정.
。어플리케이션을 Server로 Production을 수행하기위해 Project를.JAR,.WAR,Docker Image의 파일로 Build하는 역할을 수행.
▶Tomcat,Jetty는Web Server에서 Application을 Local환경에서 실행.
。Unit Test실행
Apache Maven Project :
。POM(Project Object Model) 개념을 기반으로pom.xml를 통한Java Project의 Build 자동화 및 Project 관리를 수행하는Build Tool
▶Project의Compile,Test,Production,Documentation자동화 및Dependency관리에 강력한 기능을 제공
▶ 전통적인Java Project에서 많이 활용되며, 현재는Gradle을 사용하여 Android 또는 최신 Java Project를 Build.
Project Object Model(POM):pom.xml
。Maven Project의 핵심구성파일로서,Project의Dependency,Build,Plugins설정을 정의하여 프로젝트를 구성하고 관리하는XML파일.
▶ Project의build, 실행,Test,Packaging을 통합관리.
pom.xml의 Dependency 원리
。 선행적으로spring-boot-starter-web를 예로 들때,org.springframework.boot팀이spring-boot-starter-web의 이름의 Project를 JAR파일로서 생성하여Maven Central Repository에 게시.
▶ 해당 Project는 여러Version을 가진다.<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
pom.xml에groupId와artifactId,version을 정의함으로써 자동으로Maven Central Repository에서 게시되어 보관하는 특정Version의Project의 JAR파일을 현재 Project의Local Repository에 자동으로 참조 및 다운로드하여 설치하여Local Repository에 저장된JAR파일을 현재 Project에서 활용.
。임의로Spring Project를 생성 및.JAR로 배포하여Maven Central Repository에 게시하는 경우, 다른 Project에서 단순히groupId와artifactId,version를 기입하는것만으로 게시된Project를 Dependency로서 추가가능.
pom.xml의 주요특징
- Project의 Metadata를 정의
。Project의Metadata( 이름, version ,groupId등 )
Dependency관리의 자동화
。Project에서 필요한Framework또는Library를pom.xml에 정의 시Maven이 해당Library를 자동으로 다운로드 및 관리를 수행.
▶pom.xml에서 정의된 dependency를 삭제하는 경우, 해당 Project 파일내에 존재하는External Libraries의 저장된 dependency가 자동으로 삭제됨.
。특정Dependency를 설치한 경우 해당Dependency과 의존관계에 존재하는Transitive Dependency도 추가로 설치.
。 단순히groupId와artifactId,version을 정의하여Maven Central Repository에서 Project에 Dependency을 참조 및 다운로드하여 설치가 가능.
。Maven Dependency는Spring Dependency와 다르다.
▶Maven Dependency는Project Build에 관련된 의존성 ,Spring Dependency는Java의Class에 관련된 의존성을 정의
- 전이적 의존성 (
Transitive Dependency)
。직접적인 의존관계가 아니더라도 Library 또는 Package가 다른 Library를 통해 간접적으로 의존관계에 포함되는 경우를 의미.
▶Spring Web을Maven의 Dependency로서 정의한 경우,Spring, Spring MVC, Jackson, Tomcat등이Transitive Dependency로서 자동으로 다운로드되어 설치.
Maven Life Cycle관리
。mvn clean,mvn compile,mvn test,mvn package등의 명령어를 제공하여Build Process를 간소화.
▶Project의 실행, Test , Packaging 전 과정을 체계적 관리.
- Project의 상속 (
Inheritance) , 다중모듈(Multi-Module),Plug-in확장
。다양한plug-in을 추가하여 기능을 확장
maven-surefire-plugin: 테스트 자동화
maven-compiler-plugin: Compiler 설정.
Maven ProjectStructure
。대부분의Java Project는 해당Maven Structure를 따른다.
▶Project간 일관성을 유지하여 다른 Project의 구성도 쉽고 익숙하게 확인가능.
Maven Central RepositoryMaven Central Repository
。Maven에서 공식적으로 제공하는 기본 원격저장소
▶Project에서Dependency를 정의할 경우, 해당 라이브러리를Maven Central Repository에서 해당하는Project의JAR파일을 찾아서 자동으로 다운로드하는 기본저장소.
。Maven Central Repository에서spring-boot-starter-jdbcdependency를 찾을 경우, 다음처럼Project로서 여러Version의Project의JAR파일들이 존재함을 확인 가능.
▶groupId:org.springframework.boot에서spring-boot-starter-jdbcProject를 찾아야한다.
Maven Repository종류
- 로컬저장소 :
Local Repository
。~/m2/repository에 위치한 개인저장소
。현재Project에Maven을 통해 Dependency를 추가 시,Maven Central Repository에서 자동으로 다운로드한 해당 Dependency의JAR파일을 저장.
。mvn install명령어 실행 시 해당 저장소에Project의 Package파일 (JAR,WAR등 )이 저장됨.
- 중앙저장소 :
Central Repository
。Maven이 기본적으로 사용하는 공식 원격저장소
。Dependency로 사용될Project들을JAR파일로 보관.
▶ Project에 dependency 추가 시 해당 저장소로부터 저장된Project의JAR파일을 Dependency로서 자동으로 다운로드 및 설치
▶Release Version의JAR은Maven Central Repository에 존재하며,Milestone Version,Release Candidate Version의JAR은Spring Milestone Repository에 존재.
- 원격저장소 :
Remote Repository
。기업 또는 개인이 운영하는 별도의 원격저장소
(ex.Nexus등)
▶mvn deploy명령어 실행 시 해당 저장소에Project의 Package파일 (JAR,WAR등 )이 저장됨.
Maven기본 명령어
。Build Process를 간소화하여Project의실행, Test , Packaging의 전 과정을 체계적 관리
▶Life Cycle을 효율적으로 관리한다.
。Intellij에서는 우측 Control Pane에서Maven-Execute Maven Goal에 다음 명령어를 입력하여 수행 가능.
mvn archetype:generate -DgroupId=com.example -DartifactId=myproject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
。프로젝트 생성
。groupId: 프로젝트의 그룹 ( 도메인기반 )
▶Java의Package와 유사
。artifactId: 프로젝트 이름
▶Java의Class이름과 유사
。archetypeArtifactId: 초기 Project Template 선택.
mvn clean
。Project를Build하여 생성된target폴더와 해당 내부의 Project의 모든Build의 결과를 삭제.
mvn clean compile
▶mvn clean수행 후mvn compile실행하여 Project를 Compile
mvn compile
。Java Project를Install할 필요없이,Java SourceCode만 Compile시 사용.
mvn test-compile
。Java Source Code,Java Test Code모두 Compile.
mvn test
。Project의JUnit,Mockito등의 Unit Test를 실행
▶Source Code와Test Code를 모두 Compile 한 후Test를 수행.
mvn package
。프로젝트를 Packaging하여.jaror.war파일로서 생성
mvn install
。Project를JAR파일로 생성하여 로컬Maven저장소(~/.m2/repository/)에 설치
。mvn clean install
▶mvn clean수행 후mvn install실행하여 Project를 로컬Maven저장소로 저장.
mvn install순서( LifeCycle )
Java Source Code(src/main/java) CompileJava Test Code(src/test/java) CompileUnit Test실행JAR파일 생성
。Spring Boot사용 시spring-boot-maven-plugin을 활용해JAR파일을 Repackaging.- 생성된
JAR파일을Maven로컬저장소로 복사
mvn exec:java -Dexec.mainClass="com.example.Main"
。프로젝트 실행
mvn dependency:tree:
。Project의 모든Dependency를Tree구조로 출력하는 명령어.
▶ 직접 추가한 Dependency와 그에따른Transitive Dependency도 한눈에 파악이 가능.
mvn help:effective-pom:
。현재 Project의Effective POM을 출력.
mvn --version:
。현재 사용되는Maven의 버전,home폴더 경로,Java Version,OS정보를 지시.
mvn spring-boot:build-image:
。Spring Boot Maven Plugin을 활용하여Container의image를 build.
Project Object Model(POM):pom.xml
。Maven Project의 핵심구성파일로서,Project의Dependency,Build,Plugins설정을 정의하여 프로젝트를 구성하고 관리하는XML파일.
▶ Project의build, 실행,Test,Packaging을 통합관리.
Maven Parent POM
。여러Maven Proejct에서 공통으로 사용하는 의존성을 상속 및 Versioning을 수행할 수 있도록 정의된 부모 Project의pom.xml파일.
▶AOP의Aspect와 비슷한 역할을 수행하여 코드중복을 감소시킬 수 있다.
。추가적으로 다양한Java Version과Plugin을 제공.
spring-boot-starter-parent:
。Spring boot Project에서Parent POM역할을 수행하는POM.
▶ 해당Parent POM을 정의하여 사용하는 경우,Maven Dependency,Plugin등을 자동으로 관리 할 수 있음.<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.4</version> <relativePath/> <!-- lookup parent from repository --> </parent>
spring-boot-dependencies
。spring-boot-starter-parent의 상위POM으로서 , 의존성관리기능을 수행.
▶spring-boot-starter-parent을 통해 해당 기능을 가져와서Project의Dependency를 관리.
Effective POM:
。Maven이 최종적으로 적용하는pom.xml파일의 내용을 보여주는 개념.
▶pom.xml에 정의된parent POM,plugin등을 포함하여 실제 적용되는POM을 확인가능.
。mvn help:effective-pom명령어를 실행하여 현재 Project의Effective POM을 출력.
▶pom.xml에 정의되지않은 정보도 포함됨.
Maven Build Life Cycle
。Maven은 일련의 단계 (Phases)로 구성된Build Lifecycle을 정의하여Project를Compile,Test,Packaging,Production할 수 있도록 한다.
。Maven명령어가 실행될 경우,Maven Build Life Cycle이 자동 실행.
▶mvn clean , mvn compile , mvn test , mvn package등의 명령어를 제공하여Build Process를 간소화하여Project의실행, Test , Packaging전 과정을 체계적 관리.
Maven의 주요 BuildLife Cycle
Default LifeCycle:
。Maven의 가장 핵심의Lifecycle
。Project의Compile-Test-Packaging-Production하는 전체 과정.
▶ 해당 Lifecycle은 총 23개의Phase로 구성되지만핵심Phase는 다음과 같음.
Default Lifecycle의핵심Phase
validate
。Project가 문제없이 올바르게 구성되었는지 검증
compile
。Java 소스코드를 Compile.
Integration Test
。Unit Test를 실행.
▶src/test/java활용
package
。JAR,WAR파일로 Packaging.
verify
。Packaging된 파일이 유효한지 확인
install
。Project를JAR파일로서Local Repository(~/.m2/repository)에 설치
deploy
。Project를JAR파일로서Remote Repository(Nexus등 )에 배포
clean lifecycle:
。Build전 기존 생성된 파일 제거.
site lifecycle:
。Project의 문서( site ) 생성
JAR(
.jar: Java ARchive) :
。여러 개의 Java Class 파일, 메타 데이터, Resource 파일 등을 하나의 파일로 묶은 Archive 파일.
。필요한 기본적인 dependency들을 전부 구성하여 간편하게 사용가능하게하는 Starter Project 역할 수행.
- Spring JAR파일
Version Schema
MajorVersion번호.MinorVersion번호.PatchVersion번호.MODIFIER
。Modifier은 Option으로 기입.
▶ 보통RELEASEVersion의 경우 기입하지 않는다.
。SNAPSHOTVersion의 사용은 반드시 지양해야하며,Production환경에서는RELEASEVersion만을 사용해야한다.
。Major Version Update:Version Upgrade시 작업량이 많을 경우.
ex )10.0.0->11.0.0
。Minor Version Update:Version Upgrade시 작업량이 미미하게 적을 경우.
ex )10.1.0->10.2.0
。Patch Version Update:Version Upgrade시 작업량이 거의 없을 경우
ex )10.5.4->10.5.5
。Modifier:
。Release Version(1.0.0.RELEASEor1.0.0)
。Release Candidate Version(1.0.0-RC1)
。Milestone Version(1.0.0-M1)
。Snapshot Version(1.0.0-SNAPSHOT) 등의 여부를 지시.
▶Release Version의JAR은Maven Central Repository에 존재하며,Milestone Version,Release Candidate Version의JAR은Spring Milestone Repository에 존재.