빌드는 무엇이며, 어떻게 동작하는 것일까?
빌드 (Build)
--
빌드는
소스 코드를 최종적으로 실행 가능한 형태로 변환하는 과정을 의미한다.
Java의 빌드는
단순히 컴파일만 하는 것이 아닌 "컴파일", "패키징", "의존성 관리", "테스트", "배포 준비" 등이
포함되어 있는 더 넓은 개념이다.
Java 소스코드 빌드 주요 단계
- 컴파일 : java 소스코드(.java 파일)를 바이트코드(.class 파일)로 변환하는 단계
- 의존성 관리 : 해당 프로그램이 사용하는 "외부 라이브러리" or "모듈"을 추가(관리)하는 단계
- 패키징 : 바이트코드와 관련 리소스 파일들을 하나의 아카이브 파일로 묶는 단계 (jar파일)
- 테스트 : 작성했던 코드가 원했던 동작으로 동작하는지 확인 단계
- 리소스 처리 : 프로그램에서 사용될 "리소스 파일"을 적절한 위치에 복사 및 변환 하는 단계
- 배포 준비 : 빌드의 최종 단계로, 프로그램 배포를 준비하는 단계
빌드 결과물인 JAR, WAR 파일 등을 생성 후 다른 환경(운영체제)에서 배포할 수 있는 형태로 만듬
빌드 도구
원래는 Java의 빌드 과정을 모두 수동으로 처리해야 하지만
빌드 도구를 통해 해당 빌드 과정을 모두 자동화할 수 있다.
빌드 도구의 주요 기능
- 컴파일 및 패키징 자동화
- 의존성 관리
- 테스트 자동 실행
- 배포 준비 자동화
빌드 도구 종류
- Maven
- Gradle
--
Maven 빌드 도구
--
Maven은
Apache에서 개발한 Java 기반의 빌드 도구로,
프로젝트 관리를 표준화하고, 의존성 관리 및 빌드 자동화를 제공하는 도구다.
특징
- POM 파일 (pom.xml 파일 = Maven 설정 파일)을 사용하여 프로젝트의 구조, 의존성, 빌드 설정 등을 정의한다.
- 프로젝트의 디렉토리 구조가 표준화되어 있어, 기본적으로 규약에 따라 설정해야 한다.
(디렉토리 구조와 빌드 과정을 따로 설정하지 않아도 기본 구조를 따름) - 중앙 Maven 레포지토리 or 로컬 저장소에서 외부 라이브러리를 다운받아서 프로젝트에 포함시킨다.
(pom.xml파일에 필요한 의존성만 정의하면 Maven이 자동으로 해당 라이브러리를 다운 및 관리한다.)
pom.xml 파일은
Maven에 대한 설정을 정의하는 XML 파일이다.
해당 파일은 Maven이 해당 프로젝트를 어떻게 빌드할지,
어떤 라이브러리를 사용할 것인지,
빌드 과정에서 어떤 플러그인을 사용할지 등을 지정한다.
(모든 Maven 프로젝트는 pom.xml파일을 가진다.)
pom.xml 파일 구조 예시
<!-- 해당 Maven 프로젝트의 기본 정보 (XML 네임스페이스와 스키마 위치 지정) --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 프로젝트 정보 --> <groupId>com.example</groupId> <!-- 프로젝트 그룹 ID --> <artifactId>my-app</artifactId> <!-- 아티팩트 ID (프로젝트 이름) --> <version>1.0</version> <!-- 프로젝트 버전 --> <!-- 의존성 관리 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> <!-- 테스트 환경에서만 사용 --> </dependency> </dependencies> <!-- 빌드 설정 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
<project> : 해당 프로젝트의 식별자, 버전 정보, 의존성, 빌드 설정, 플러그인 설정 등을 정의하는 큰 틀
- xmlns : XML 네임스페이스를 지정하므로, Maven이 해당 파일을 올바르게 해석 가능
( Maven POM의 기본 네임스페이스 = http://maven.apache.org/POM/4.0.0 )
- xsi:schemaLocation : POM파일의 스키마를 정의하여, 유효한 형식인지 검사
<modelVersion> : POM의 버전
<groupId> : 해당 프로젝트의 그룹 ID (프로젝트를 식별하는 고유한 명칭, 일반적으로 도메인을 반대로 작성)
<artifactId> : 해당 프로젝트 이름 (Maven 저장소에서 해당 이름으로 사용됨)
<version> : 프로젝트 버전
<dependendies> : 외부 라이브러리 의존성을 정의 (외부 라이브러리 다운 후 빌드 과정에서 사용)
<build> : 빌드 과정에서 사용할 플러그인을 정의 (빌드 도구 or 컴파일러 설정 등 지정)
<repositories> : 라이브러리를 다운로드할 "원격 저장소(Maven 레포지터리)"를 정의 (선택 사항으로 생략 가능)
<profiles> : 환경에 따라 다른 빌드 설정 정의 (선택 사항으로 생략 가능)
표준 Maven 디렉토리 구조
my-app/
|-- src/
| |-- main/
| | |-- java/ # Java 소스 코드 파일
| | |-- resources/ # 리소스 파일 (이미지, 설정 파일 등)
| |-- test/
| | |-- java/ # 테스트 코드 파일
| | |-- resources/ # 테스트 리소스 파일
|-- pom.xml # Maven POM 파일
로컬 Maven 저장소는
개발자의 로컬 컴퓨터에 위치한 Maven 캐시 저장소로,
해당 프로젝트에서 사용할 "외부 라이브러리(JAR 파일)를 "중양 저장소(Maven Central)"에 다운로드 후
로컬 저장소에 저장하여 재사용하는 용도다.
빌드 과정
- [src/main/java]에 존재하는 Java 소스 코드를 컴파일하여 바이트코드(.class파일)로 변환
- [src/test/java]에 존재하는 테스트 코드를 컴파일하고, JUnit 같은 테스트 프레임워크를 통해 테스트 실행
- 컴파일된 결과물(.class 파일, 리소스 파일 등)을 JAR 또는 WAR 파일로 패키징
- 패키징된 결과물(JAR 또는 WAR 파일)을 로컬 Maven 저장소에 설치
- 패키징된 결과물을 Maven의 원격 저장소에 배포하여 다른 프로젝트가 해당 의존성을 사용할 수 있도록 한다.
--
Gradle 빌드 도구
--
Gradle은
"Groovy" 또는 "Kotlin DSL"을 사용하는 유연한 빌드 도구로,
Maven이나 Ant와 같은 기존 빌드 도구들의 단점을 보안하기 위해 설계되었으며,
Maven보다 더 유연하고 선응이 좋으며, 확장성이 뛰어난 빌드 도구다.
특징
- Task 기반의 빌드 시스템으로, 각 빌드 과정(컴파일, 테스트, 패키징 등)을 Task로 정의 (조합 및 확장으로 유연)
(Gradle의 설정 파일 = build.gradle 파일 (Groovy DSL 또는 Kotlin DSL로 작성)) - Groovy 또는 Kotlin DSL을 사용하여 빌드 스크립트를 작성 (XML 보다 빌드 스크립트가 간결하고 유연함)
- 빌드 성능 최적화에 많은 기능 제공 (빌드 캐싱, 병령 빌드, 중분 빌드 등)
- 의존성 관리를 자동으로 처리 (Maven 레포지토리를 사용하여 라이브러리 다운도 가능)
build.gradle 파일은
Gradle 프로젝트의 빌드 설정을 정의하는 빌드 스크립트 파일로,
의존성 관리, 빌드 작업(Task), 플로그인 설정 등을 포함하고 있으며,
Groovy DSL 또는 Kotlin DSL을 사용하여 작성된다.
build.gradle 파일 구조 예시
// 플로그인 정의 (Gradle 프로젝트에서 제공하는 특정 기능 확장 모듈 정의) // Java, Kotlin, Spring Boot 등의 언어 및 프레임워크에 맞는 빌드 작업을 자동화 plugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' } // 프로젝트의 그룹 ID, 버전 정보 등을 설정 (Maven/Gradle 저장소에 프로젝트가 배포될 때 사용) group = 'project1' version = '0.0.1-SNAPSHOT' // 사용하는 자바 버전 정의 java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } // 사용하는 "외부 라이브러리"를 다운로드할 저장소 정의 repositories { } // 의존성(외부 라이브러리나 모듈)을 정의 (의존성을 자동으로 관리 및 다운로드) dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-mustache' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } // Task 정의 (Gradle 빌드에서 개별 작업 정의) tasks.named('test') { useJUnitPlatform() }
빌드 과정
- [src/main/java]에 있는 Java 소스 코드를 컴파일하여 바이트코드(.class 파일)로 변환
- [src/test/java]에 있는 테스트 코드를 컴파일하고, 테스트 프레임워크를 사용하여 테스트 실행
- 컴파일된 결과물과 리소스 파일들을 JAR 또는 WAR 파일로 패키징
- 컴파일된 결과물을 로컬 또는 원격 저장소에 배포 가능
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
소 주제
--
--
참고 및 출처
'Language > Java' 카테고리의 다른 글
조건문, 반복문 (+ break, continue, label) (0) | 2024.10.06 |
---|---|
[연산자] 비교, 논리, 그 외의 연산자 (+ instanceof) (0) | 2024.10.05 |
[변수] 변수와 상수 (+ 타입, 진법, 형변환) (0) | 2024.09.22 |
자바 기본 규칙 (0) | 2024.09.21 |
Java라는 언어에 대해서 (+ JDK, JRE, JVM, 바이트코드, jar) (0) | 2024.09.16 |