[개요] : 백엔드 개발을 하다 보면 ‘빌드(Build)’, ‘패키징(Packaging)’, ‘배포(Deployment)’ 같은 단어를 많이 듣게 된다. 하지만 처음 접하면 복잡해 보이고, 어디서부터 이해해야 할지 막막할 때가 많다. 이번 글에서는 이러한 개념들을 차근차근 정리하고, 실제로 Maven을 사용해 프로젝트를 빌드하는 방법까지 알아보자.
그런데 우리는 왜 빌드에 대해서 공부해야할까?
- 하나, 실제 서비스를 만들고 운영할 수 있어야 하기 때문이다
- 서비스 개발은 단순 코드 작성에서 끝나는 것이 아니기 때문이다
- 개발한 코드를 사용자에게 잘 전달하는 것도 개발의 하나이기 때문이다.
- 둘, 효율적인 협업을 위해서이다.
- 서비스 개발은 협업을 통해 진행되는데 빌드 도구를 통해 동일한 환경에서 개발할 수 있기 때문이다.
- 또한 잘 활용한다면 배포 속도를 줄일 수도 있을 것이다.
그럼 실습을 하기 전에 우선적으로 필요한 지식들을 정리해보겠다.
개발은 직접 해보는 것이 중요하기 때문에 바로 실습으로 넘어갔다가 필요한 개념을 봐도 좋을거 같다
배포는 개발 -> 빌드 -> 패키징 -> 테스트 -> 배포 -> 운영의 흐름을 가지고 있다.
빌드를 이해하기 위해 필요한 개념들은 [페키지, Jar , 빌드 도구, Maven] 이다.
패키징이란?
- 정의 : 패키지란 클래스들의 모음이고 패키징이란 클래스들을 모아 정리하는 것을 말한다.
- 왜 필요할까? : 프로젝트가 커지면서 코드도 많아지고 파일도 많아지기 때문에 정리할 필요하 있기 때문이다.
- 특징 :
- 고유성 : 협업을 하다보면 같은 서비스이기 때문에 특정 클래스명이 동일한 경우가 발생할 수 있다. 이 때 패키징을 통해 패키지의 이름을 달리하면 같은 이름이더라도 충돌이 나지 않는다. 패키지는 이러한 고유성을 갖는다.
- 도메인의 주소로 바꿔서 사용한다 : 최상위 패키지 명은 도메인 주소를 앞뒤고 바꿔서 사용한다.
nhn.com이라는 도메인이라면 최상위 패키지는 com.nhn이 된다. - 계층적이다 : 패키지의 구조는 폴더 구조형태로 계층적이다.
- 사용방법 :
- 직접 주소 명세 : java.util.Collections.shuffle(list);
- import : import java.util.*; -> Collections.shuffle(list);
- import Static : import static java. util.Collections.*; -> shuffle(list);
Jar파일이란 무엇인가?
패키지를 통해 파일을 정리한 후 우리는 Jar을 통해 실행 가능한 파일로 다시 패키징을 하게 된다.
- 정의 : Jar은 컴파일한 클래스들의 묶음을 말한다. 쉽게말해 Java의 실행 파일이다.
- Jar은 왜 실행 파일일까 : 수많은 파일을 하나씩 컴파일 하면 비효율적이기 때문에 컴파일 된 결과물을 하나로 묶어서 관리하면 더 편리하다. 그래서 컴파일한 클래스들을 하나로 묶어서 실행시키려고 Jar이라는 파일로 묶은 것이다.
- 패키지와의 차이점 : 패키지는 파일을 정리를 위해 하나로 묶은 것을 말한다. 하지만 Jar은 단순 파일의 묶음이 아닌 .java파일들 .class파일로 컴파일 한 후, 여러개의 파일을 하나로 묶은 압축파일이다. 그렇기 때문에 jar파일이 실행 파일의 의미를 갖게된다.
빌드 도구란?
프로젝트가 커질수록 .java-> .class -> Jar 과정이 복잡해진다. 그래서 우리는 빌드 도구를 사용한다.
- 빌드란 무엇인가? :
- 정의 : 프로젝트가 커질수록 .java-> .class -> Jar 과정이 복잡해지기 때문에 자동으로 컴파일, 패키징, 의존성 관리까지 해주것을 말한다.
- 대표적으로 Maven과 Gradle이 있다.
Maven이란?
빌드 도구 중 Maven을 활용해서 빌드에 대해서 이해해보겠다.
Maven은 Pom.xml파일을 통해 의존성을 넣어서 사용하는 대표적인 빌드 도구입니다.
pom.xml은 프로젝트의 기본 정보, 의존성, 빌드 설정 등을 정의하는 설정 XML 파일입니다.
- Maven 플러그인 (<plugins>)
- Maven 플러그인은 빌드, 테스트, 패키징 등을 자동화하는 기능이다.
- Maven 의존성 (<dependencies>)
- Maven은 프로젝트에서 필요한 라이브러리를 자동으로 다운로드하고 관리한다.
- ...
maven의 장점으로
- 의존성 자동 관리 : 필요한 라이브러리를 추가만 해주면 자동으로 관리해주기 때문에 편리하다
- 빌드 자동화 : 의존성 뿐만 아니라 빌드, 테스트, 배포 등의 과정을 자동으로 해준다.
- 확장성 : 필요한 내용만 pom.xml에 추가만 해주면 되기 때문에 확장이 편리하다.
정리한 개념들을 활용해서 직접 실습을 해보도록 하겠다.
실습은 2가지로 진행한다.
첫번째는 Jar를 통해 파일을 빌드하는 방법
두번째는 빌드 도구 중 Maven을 통해 파일을 빌드하는 방법.
[ Jar 실습하기 ]
목표:Calulator프로젝트에 있는 Calulator.java파일을 Hello프로젝트에 있는 Main.java파일에서 사용할 수 있도록 적용하기

1. Calulator프로젝트를 실행성한다.
2. src파일에 패키징을 적용한다. (com.nhnacademy.hello.util)
3. Calulator프로젝트에 java파일을 작성한다.
다음 과정이 다 되었으면 이제 컴파일 하여 jar파일로 만들 것이다.
> javac ./src/com/nhnacademy/hello/util/*.java -d ./out
> cd ./out
> jar --file com.nhnacademy.hello.util.Calculator -C ./com
위의 코드를 통해 out/ 디렉토리에 해당 프로젝트의 자바 파일들의 컴파일된 파일을 담은 Jar파일을 만들 수 있다.
위와 같이 만든 Calulator.Jar을 Main에 적용시키면 된다.

이제 해야하는 과정은
1. Calulator.Jar를 Main에서 사용하기 위해 Hello라는 프로젝트를 새롭게 만들고
2. Calulator.Jar를 Main이 있는 lib이라는 디렉토리에 넣어서 라이브러리로서 사용할 것이다.

다음 사진과 같이 구성이 맞춰지면 이제 calculator.jar을 담은 hello.jar를 만들 수 있는 환경이 완료되었다.
여기서 중요한점 이 차이점을 이해해야한다. 우리는 라이브러리, 즉 hello 프로젝트의 의존성 디렉토리에 caclulator.jar를 넣은 것 뿐이고 hello.jar를 만들기 위해서는 caclulator.jar의 클래스 경로를 지정해줘야한다.
> javac ./src/com/nhnacademy/hello/*.java -d ./out/
(X) 위와 같이 caclulator.jar를 지정하지 않으면 calulator를 찾을 수 없다는 컴파일 오류가 발생하게 된다.
> javac ./src/com/nhnacademy/hello/*.java -d ./out/ --class-path ./lib/calculator.jar
(O) 위와 같이 지정해주면 lib디렉토리에 있는 calculator.jar가 주입된 상태로 함께 컴파일 될 수 있는 것이다.
> jar --file hello.jar --main-class com.nhnacademy.hello.Main -c ./com
이제 위의 코드를 통해 hllo.jar를 만들 수 있다.
하지만 실행할 때도 주의 해야한다.
> java -cp "./hello.jar;./calculator.jar" com.nhnacademy.hello.Main
(실행환경 windows)
hello.jar이 패키징 되었지만 실행하려면 calculator.jar의 위치를 지정해서 실행해야 한다.
왜냐하면 hello.jar 안에는 calculator.jar이 포함된 것이 아니기 때문이다. jar은 다른 jar파일을 포함할 수 없기 때문이다. 그렇기 때문에 실행할 때 calculator.jar의 class path를 포함하여 실행해야하는 것이다.
아무리 보아도 Jar을 통해 실행하면 너무 복잡한 과정을 거치게 될 뿐만 아니라
명령어 하나만 잘 못되어도 실행이 잘 안될수도 있다.
그래서 개발자들은 자동으로 컴파일하고 패키징하고 의존성까지 넣어주는 빌드 도구를 만든 것이다.
이제 Maven을 사용해 빌드하는 실습을 해보겠다.
아마도 실습을 하고 난 후 빌드 도구의 필요성과 편리함을 몸 소 느낄 수 있을 것이다.
[ Maven 실습하기 ]
우선 Maven을 실습하기 위해서 maven을 설치해야한다.
다음 url을 통해 설치를 진행하면 된다. https://maven.apache.org/guides/getting-started/windows-prerequisites.html
Maven과 같은 경우 딱 3가지 과정이다.
1. 프로젝트 생성
2. pom.xml로 의존성 넣어주기.
3. 실행하기
1. 프로젝트 생성
프로젝트를 생성하는 방법에는 2가지가 있는데 cmd를 통해 mvn 패키지로 생성하는 방법과 개발 툴에서 프로젝트를 만드는 방법이 있다. 사실 개발 툴은 클릭으로도 가능하기 때문에 간단하게 CommandLine으로 만드는 방법만 알아보도록 하겠다.
1-1. cmd창에서 프로젝트 생성
> mvn -B archetype:generate -DgroupId=com.nhnacademy.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
위의 의미를 하나씩 살펴보면
mvn을 통해archetype:generate : 미리 정의된 템플릿을 기반으로 새로운 프로젝트를 생성
| 옵션 | 설명 |
| mvn | mvn 실행 |
| archetype : generate | 미리 정의된 템플릿을 기반으로 새로운 프로젝트를 생성한다. |
| -B | Batch 모드 (사용자 입력 없이 자동 실행) |
| -DgroupId=com.nanacademy.app | 프로젝트 그룹 Id |
| -DartifactId=my-app | 프로젝트 ArtifactId로 프로젝트의 이름이며 Jar파일의 이름을 말한다. |
| -DarchetypeArtifactId=maven-archetype-quickstart | 템플릿을 사용하여 빠른 프로젝트 생성 |
| -DarchetypeVersion=1.4 | 사용하려는 템플릿(archetype)의 버전 지정 |

위의 명령어를 실행하면 pom.xml파일을 갖는 프로젝트가 만들어진다.
2. pom.xml로 의존성 넣어주기.
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.10.0</version>
</dependency>
이제 필요한 라이브러리를 다음과 같이 pom.xml 파일에 넣어주기만 하면 된다.
3. 실행하기
maven을 사용해서 실행 가능한 jar파일로 만드는 방법도 2가지가 있다. 바로 plugin을 사용하는 방법이다.
plugin이란
- maven-dependency-plugin + maven-jar-plugin을 활용한 방법
- 의존성 Jar파일을 프로젝트의 빌드 디렉토리인 target 디렉토리 하위 libs다랙토리에 복사하여 포함시키는 것이다
- 그리고 복사한 dependency들을 경로를 인식할 수 있도록 MANIFEST.MF파일에 Class-Path를 추가하여 라이브러리를 참조 가능하게 설정해야한다.
- 설정하게 되면 Manifest.mf 파일에 libs/~~~/~~~/~~~이런식으로 의존성 내용이 들어가게 된다.
- maven-shade-plugin을 활용한 방법
- 모든 의존성을 Jar파일에 포함하는 방법이다.
- 해당 plugin을 사용하면 Jar파일이 생성되는데 해당 파일 하위로 org가 생성되고 내부에 의존성 내용들이 만들어져 포함되는 것이다.
- 위의 1번 방식과 다르게 따로 lib에 의존성들을 설정할 필요가 없기 때문에 유용하다.
> mvn clean package
> java -cp "target/movie-app.jar;target/libs/*" com.nhnacademy.app.movie.MovieMain
1번 방식 : (실행환경 : windows) 위와 같이 실행 시 의존성 경로를 포함하여 실행하면 된다.
> mvn clean package
> java -jar target/movie-app-1.0-SNAPSHOT-shaded.jar
2번 방식 : 1번 방식과 다르게 실성된 jar파일만 실행하면 된다.
jar방식이 아닌 maven을 사용했을 때 pom.xml만 수정해주면 되기 때문에
jar에서의 복잡함이 없어 편리함을 느낄 수 있었을 것이다.
일반적으로 프로젝트에서는 이제 maven과 같은 빌드 도구를 활용해 배포하게 될 것이다.
지금까지 빌드의 전반적인 내용을 이해해보았습니다.
빌드 도구도 다양하고 maven에도 다양한 태그들과 다양한 방식들이 많이 존재합니다.
하지만 이렇게 한번이라도 직접 실행시켜보면 과정을 이해하는데 큰 도움이 될 것입니다.