멋쟁이 사자처럼 The Origin/SpringBoot

2주차 - Build Automation Tool

Wonuk 2022. 2. 3. 13:09
반응형

Java와 Build Automation Tool

Java로 이루어진 프로젝트는 '*.java' 파일에 정의된

Java Source 코드로 구성됩니다.

 

JDK에는 Java Source 코드를 Java 바이트코드로 바꾸기 위한

자바 컴파일러 javac가 포함되어 있습니다.

 

javac 사용예시

javac 사용시 에러가 발생한 경우

라이브러리 추가로 맨위의 주황색 박스 오류해결

오류는 위에서부터 차례로 해결해나가는 것이 좋습니다.


javac

javac는 Java Compiler입니다.

즉, 자바 컴파일러는 자바 언어를 기계어로 바꾸는 명령어

혹은 그 명령어로 실행되는 소프트웨어 입니다.

Compile
소스코드를 기계어로 바꾸는 과정입니다.

이러한 스프링부트 프로젝트는 컴파일 단계를 거치고 나면 빌드(build)를 거치게됩니다.

실제로 어떤 기계어가 실행이되서 프로그램이 실행되는지에 대한 부분을 완성합니다.

여기서 필요한 모든 과정을 빌드라고 합니다.

 

빌드과정

1. Java Source 코드를 Java Bytecode로 변환합니다.

2. Java Bytecode를 실행합니다.

3. 실행 가능한 파일로 제작합니다.(패키징)

상황에 따라 과정이 추가되거나 삭제될 수 있습니다.

ex) 테스트코드

 

위에서 보듯 일일이 빌드를 직접 하기에는 과정이 너무 복잡합니다.

그래서 등장하게 된것이 Maven과 Gradle이라는 빌드관리도구 입니다.

SpringBoot initializr에서도 빌드관리 도구를 선택할 수 있습니다.

Maven과 Gradle은 Java프로젝트를 관리함에 있어서 가장 대중적인 툴입니다.


Build Automation Tool

일일이 javac 명령어를 사용했다면 어디에있는 어떤 소스코드인지

모두 적어주어야 합니다.

컴퓨터는 어디에 무엇이 있는지 다 알고있기 때문에

이러한 작업을 빌드관리도구가 대신해줍니다.

Maven

Apache에서 만든 Java를 위한 Build Automation Tool 입니다.

 - Java외에도 C#, Ruby 등의 다른 언어를 위해서도 사용이 가능합니다.

   일반적으로 Java에서만 사용합니다.

 

Project Object Model (POM)

 - xml의 형태로 프로젝트를 정의합니다.

 - pom.xml을 분석해 프로젝트를 빌드합니다.

 

빌드를 자동화하기 위해서 어떤 작업을 해야하는지 알아야합니다.

그 정보를 저장하는 형태가 xml 형태입니다.

 

Maven으로 프로젝트 생성

Maven 프로젝트의 패키지 구조 Pom.xml확인

mvn은 Maven의 약자입니다.

 

pom.xml

xml은 구조화된 데이터를 표현하기 위한 형식중의 하나입니다.

가장 대중적으로 사용되는것은 JSON 그 이전에는 XML을 사용했습니다.

 

<?xml version="1.0" encoding="UTF-8"?>

어떤 형식의 xml 문서인지 명시되어 있습니다.

 

project xmlns=생략 xmlns:xsi=생략 xsi:schemaLocation=생략

xml파일에서 사용되는 key값들이 어디에서 가져오는지 정의되어 있습니다.

key값 예) <modelVersion> 등등

해당 속성의 하위 element들은 같은 속성을 가지고 있습니다.

 

<modelVersion>4.0.0</modelVersion>

Project Object Model에서 Model을 의미합니다.

즉, POM의 구조가 이렇게 될것이다 라고 생각하고 Maven이 작동합니다.

해당 문장은 그 모델의 Version을 의미합니다.

 

<parent>생략</parent>

SpringBoot를 사용한다면 첫번째 요소는 parent가 됩니다.

parent는 부모 즉, 지금 작성하고 있는 프로젝트가

어떠한 프로젝트의 하위 프로젝트인지 나타내고

어떤 프로젝트가 가지고있는 설정을 그대로 가져옵니다.

추가로 설정하여 정의 할 수 있습니다.

SpringBoot는 spring-boot-starter-parent가 포함되어 있습니다.

 

<groupId>생략</description>

Spring Initializr에서 입력한 정보들이 입력되어 있습니다.

 

groupId : 프로젝트를 만들고있는 조직의 도메인을 역순으로 적습니다.

ex) google에서 만든 프로젝트라면 com.google

 

artifactId : 그룹에있는 하위 프로젝트에 상세한 아티팩트(프로젝트)입니다.

 

version : 만들 프로젝트의 버전을 의미합니다.

메이저.마이너.패치

메이저는 대규모 변경사항이 있을때 올라갑니다.

ex) 처음으로 사용자에게 공개될 경우 1.0.0 버전이 됩니다.

마이너 버전이 올라가도 메이저 버전이 같다면 상하위 호환이 가능합니다.

주로 새로운 기능의 추가에서 변경되는 부분이 마이너 버전이 됩니다.

패치는 기능적인 부분은 없고 일반적으로 버그를 수정하거나

사소한 변경사항을 변경할 때 발표하는 버전입니다.

SNAPSHOT은 안정된 버전이 아닌 자주 변경된다는 의미를 가지고 있습니다.

 

<properties><java.version>11<java.version></properties>

java 버전을 정의합니다.

<test.version>1.0.0</test.version>을 추가해도 사용이 가능합니다.

프로퍼티에 정의되는 내용은 하단에서도 사용 가능합니다.

<dependencies>생략</dependencies>

프로젝트에 사용할 외부 프레임워크

또는 라이브러리에 대한 내용이 정의되어 있습니다.

<dependency>태그가 소속 될 수 있습니다.

여기에는 버전이 없는데 <parent>에 버전이 있기 때문에

하위 버전들을 자동으로 지정해주기 때문에 버전값이 필요 없습니다.

 

<build>생략</build>

의존성 항목이 끝나면 빌드를 실제로 어떤식으로 진행할것인지 정의되어 있습니다.

<plugins> 플러그인을 추가합니다.

 

Maven의 Lifecycle

install을 사용하게 된다면

target 디렉토리가 생성됩니다.

Maven에서 결과물을 저장하는 디렉토리 입니다.

maven-demo-0.0.1-SNAPSHOT.jar

SpringBoot 프로젝트의 결과물입니다.

clean을 사용하게되면 이 target 디렉토리가 삭제됩니다.

 

 

Maven을 사용할 때 실제로 프레임워크, 라이브러리들이 저장되는 경로

repository

org

springframework boot

위의 파일들은 Maven Repository에서 가져오게 됩니다.

Maven은 단순히 빌드뿐만이 아니라

서로서로 라이브러리를 공유하기 위한 도구로서 사용되고 있습니다.

Spring과 관련된 것들도 다 포함되어 있습니다.

사용법 

사용하고자 하는것을 클릭하여 들어가면 아래의 명령어가 나옵니다.

해당 명령어를 xml파일에 입력해주면 됩니다.


Gradle

Java를 위한 Build Automation Tool

 - C, C++, Javascript 등을 위해서도 사용할 수 있습니다.

실제로는 JAVA에서만 사용합니다.

 

build.gradle

 - grooby라는 언어로 프로젝트를 정의합니다.

 - Sub-project 등을 포함시키는 용도의 settings.gradle도 있습니다.

 - Kotlin을 사용하여 정의할 수도 있습니다.(build.gradle.kts)

kts = KoTlinScript의 약자입니다.

 

Gradle로 프로젝트 생성

build.gradle

plugins{}

어떤식으로 빌드를 하게될것인지 task를 정의하기 이전에 정의됩니다.

group과 version도 설정되고 name은 settings.gradle에 존재합니다.

gradle의 장점은 단계적인 빌드입니다.

쉽게 말해서 일정한 지정까지 빌드가 성공한다면

그 지점까지는 다시 할 필요가 없습니다.

조금씩 조금씩 늘어나는 방식이지만

초기단계에서는 Maven보다 조금 느립니다.

 

사용법 - 아까와 같은 Maven 저장소 사이트에서 확인합니다.

실제 사용시 버전은 지워주면 됩니다.

implementation, testImplementation, runtimeonly() 등과같이

정의하는 방식이 여러가지 입니다.

Maven의 pom의 dependency scope와 비슷한 역할을 합니다.

어느 시점에서 라이브러리가 필요한지 정의하기 위함입니다.

 

Maven과의 또 다른점은

Gradle은 자신만의 빌드과정을 정의할 수 있습니다.

상세한 내용은 따로 알아보면 됩니다.

 

build또는 bootJar Task를 실행하면 빌드됩니다.

빌드가 완료되면 build폴더가 생성됩니다.

libs 폴더에 결과물이 저장됩니다.

결과물 jar가 무엇인지 어디에 쓰는지는 다음 포스팅에 정리하도록 하겠습니다.

반응형