이론적 내용빌드 스크립트Maven을 사용하는 이유pom.xml 사용방법Dependency ScopeMaven default LifecycleTransitive DependenciesDependency Diagram쓰면서 알게 된 내용Target folder?classpathclasspath order 변경에 대한 내용자바 컴파일러 소스와 타겟 설정컴파일러 플러그인을 사용한 자바 버전 명시Spring Boot Specification
이론적 내용
빌드 스크립트
- XML기반으로 설정 모델을 제공하고 pom.xml 파일로 작성할 수 있음
- POM : project object model의 약어 (HTML 파싱해서 DOM 만들듯이 POM도 비슷한 방식으로 파싱됨)
Maven을 사용하는 이유
- Maven은 archetypes 라는 프로젝트 템플릿을 제공해서 매번 같은 설정을 반복하지 않게 도와줌
- 프로젝트에서 사용하는 외부 라이브러리인 dependency를 관리해줌
- 플러그인과 외부 라이브러리를 분리하여 관리함
- dependency를 다운 받는 Repository가 로컬이 될 수 도 있고 Maven Central와 같은 공개된 Repository가 될 수 도있음
pom.xml 사용방법
// 서브 프로젝트 구성하는 방법 <modules> <module>service_a</module> <module>service_b</module> </modules>
- 위와 같이 pom.xml에 작성하면 하나의 프로젝트 아래에 서브 프로젝트로 module들이 관리되게 됨
- root project — service_a, service_b, src 와같은 형태로.
// 구성된 서브프로젝트에 대해 parent 프로젝트를 설정할 수 있음 <parent> <groupId>org.prgms</groupId> <artifactId>dev-kdt-maven</artifactId> <version>1.0-SNAPSHOT</version> </parent>
Dependency Scope
// dependency <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> // gradle에서 testImplementation과 같은 것. test 할 때만 쓰겠다~~ // 즉 scope는 해당 모듈을 어느 단계에서 쓸것인지를 명시해주는 부분임 </dependency> </dependencies>
- compile: <scope> .. </scope>을 지정하지 않는 경우, 기본값으로 설정됩니다. 컴파일 의존성은 프로젝 트의 컴파일, 테스트, 실행에 라이브러리가 필요할 때 사용합니다.
- provided: 일반적으로 JDK 또는 컨테이너가 해당 라이브러리를 제공할 때 설정합니다. 즉, 웹 애플리케 이션의 경우 JSP와 Servlet API 등은 provided 의존성으로 설정합니다.
- system : 특정 jar 파일의 위치를 지정할 수 있음. 로컬에서 읽어라
- runtime: 컴파일 시에는 사용되지 않으나, 실행과 테스트 시에는 필요할 때 설정합니다. 대표적인 예가 JDBC 드라이버입니다.
- test: 애플리케이션의 실행에는 사용하지 않으나, 테스트 컴파일 및 실행 시에 필요할 때 설정합니다. 대 표적인 예로는, easymock, junit 등이 있습니다.
- system: provided 의존성과 비슷하지만, 사용자가 jar 파일의 위치를 지정한다는 점이 다릅니다. system 의존성을 사용하려면, <systemPath> .. </systemPath> 엘리먼트를 이용하여 jar 파일의 위치를 지정해 야 합니다. 그러나 사용자마다 개발 환경이 다를 수 있으므로 프로퍼티를 이용하여 jar 파일의 위치를 지 정하는 것이 좋습니다.
Maven default Lifecycle

Transitive Dependencies
- 전이 의존성이라고 해서 내가 의존하고 있는 모듈이 다른 어떤것에 의존하는 것을 Transitive Dependency라고 하는데 이러한 Transitive Dependency에서 cyclic dependency가 생겼을 때는 아래와 같이 결정이 됨

- nearest definition : D를 의존하는 모듈이 E와 C가 있는데 A에서 E까지가 더 가까우므로 D 1.0을 사용하게 됨
- explicit 하게 D 2.0을 사용하겠다고 하면 그것을 사용함
Dependency Diagram

- pom.xml 에서 오른쪽 마우스 누르고 Show Dependencies를 보면 현재의 의존성의 계층구조가 나옴
쓰면서 알게 된 내용
Target folder?
[참조] https://theknowledgeburrow.com/what-is-the-target-folder-for/ — What is the target folder fo?
- Target folder는 maven의 디폴트 아웃풋 폴더임. 프로젝트가 빌드되거나 패키지 될 때 sources, resources and web files의 내용이 거기에 포함이 됨
classpath
- 프로젝트 안에서 resource를 두는 곳의 경로임. build 단계에서 Maven은 classpath에서 필요한 파일을 가져오고 classpath에 runtime classpath에서 사용할 수 있도록 파일을 넣어 두기도 함
- It’s a path inside your project where you place resources. During the build step, Maven will take files in there and place them in the appropriate place for you to use them in your runtime classpath, eg in an executable . jar , some physical file system location used in the classpath (with java ‘s -cp option), etc.
classpath order 변경에 대한 내용
- idea에서 Project Structure → Modules → Dependencies tab 에서 순서를 변경할 수 있음. 위에서 부터 읽게 되니, 우선 순위가 되는 dependency를 위로 올리면 됨
자바 컴파일러 소스와 타겟 설정
컴파일러 플러그인을 사용한 자바 버전 명시
<project> [...] <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> [...] </project>
- 때때로 어떤 프로젝트를 지금 사용하고 있는 자바의 버전과 다른 버전으로 컴파일을 해야 될 필요성이 있을때 이 설정을 사용할 수 있음
- 해당 상황에서 javac 이 -source 와 -target 옵션을 받을 수 있음
- Java 8 언어의 기능 들을 이용하고 싶고(
-source 1.8
) 컴파일된 클래스들이 JVM 1.8에서 호환되게(- target 1.8
) 하고 싶을 때 설정을 해줄 수 있음
Spring Boot Specification
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> </parent> <properties> <java.version>9</java.version> </properties>
- 해당 부모 pom은 default plugin을 담고 있고 자바 버전에 대한 다수의 프로퍼티를 포함하고 있음. 디폴트 java version은 1.8
- 그러나 java version property를 명시함으로써 기본 설정을 덮어 쓸 수 있음