일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- python
- Nodejs
- Spring
- 가상면접사례로배우는대규모시스템설계기초
- nestJS
- @Autowired
- C언어
- 파이썬
- 컴포넌트스캔
- 프로그래머스
- thymeleaf
- git
- 코테
- AWS
- @Component
- 카카오 알고리즘
- nestjs auth
- 해시
- 구조체배열
- 코딩테스트
- OpenCV
- 시스템호출
- nestjs typeorm
- 카카오
- 카카오 코테
- 스프링
- spring boot
- TypeORM
- 알고리즘
- C++
- Today
- Total
공부 기록장 💻
[Spring] Gradle 빌드와 실행 (컴파일, 링크, 빌드의 차이점과 Gradle build 설정) 본문
[Spring] Gradle 빌드와 실행 (컴파일, 링크, 빌드의 차이점과 Gradle build 설정)
dream_for 2023. 1. 4. 16:51
vscode, intellij 등 프로젝트 실행을 편리하게 해주는 도구와 IDE를 사용하다 보니 컴파일과 빌드의 개념에 대한 이해가 부족한 경우가 많다. 개발 생산성 향상을 위해 IDE 내에서 소스 코드를 작성하고 run을 실행하면 알아서 모든 과정이 자동으로 실행되기 때문이다.
컴파일과 빌드가 무엇인지와 그 차이점을 다시 이해해본 뒤, Spring boot Application 빌드 파일을 직접 생성하여 실행해보도록 하자.
빌드, 컴파일, 링크
1. 빌드 (build)
소스 코드 파일을 실행 가능한 소프트웨어 산출물로 만드는 일련의 과정을 build 라고 한다.
빌드의 단계 중 컴파일 그리고 링크가 포함 되어 있으며, 컴파일과 링크 모두 빌드의 부분 집합이라 할 수 있다.
빌드 과정을 도와주는 도구를 빌드 툴 (Build Tool) 이라고 하는데, Gradle이 바로 빌드 툴 중 하나이다.
2. 컴파일 (compile)
컴파일이란 개발자가 작성한 소스코드를 Binary 코드의 오브젝트 파일로 변환하는 과정을 말한다.
즉 컴퓨터가 이해할 수 있는 기계어로 변환하는 작업이다. 이러한 작업을 해주는 프로그램을 컴파일러(Compiler)라고 하며, 자바의 경우 JVM(Java Virtual Machine)에서 .java 파일을 실행 가능한 바이트 코드 형태의 클래스 파일이 자동적으로 생성한다.
3. 링크 (link)
프로젝트를 진행하다 보면 여러 소스 파일이 생성되고, A라는 소스 파일에서 B 소스 파일에서 존재하는 메서드를 호출하는 경우가 많다. 이때 A와 B 소스 파일을 각각 컴파일만 하는 경우, A가 B에 존재하는 메서드를 찾지 못해 호출하지 못하게 된다.
따라서 A와 B를 연결해주는 작업이 필요한데, 이 작업을 Link 라고 한다.
링크에는 정적 링크(static link)와 동적 링크(dynamic link)가 있다.
정적 링크란 컴파일 된 소스 파일을 연결해서 실행 가능한 파일을 만드는 것이고, 동적 링크는 프로그램 실행 도중 프로그램 외부에 존재하는 코드를 찾아 연결하는 작업이다.
자바의 경우, JVM이 프로그램 실행 도중 필요한 클래스를 찾아 classpath에 로드해주는데, 이는 동적 링크의 예이다.
Gradle이란?
Gradle은 간단하게 말하자면 오픈소스 빌드 도구로, 예전 Maven과 같은 구조화된 build 프레임워크이다.
멀티 프로젝트의 빌드를 지원하기도 하며, 의존성을 관리하는 다양한 방법을 제공한다.
Gradle 빌드에 권장되는 사용 방법은 Gradle Wrapper를 사용하는 것으로, Java 프로젝트를 CI (Continous Integration) 환경에서 빌드할 때 프로젝트 빌드 환경에 종속되지 않고 프로젝트를 빌드할 수 있게 해준다는 점이 Gradle이 가진 강력한 특징 중 하나이다.
Gradle은 JAVA 6 버전 이상의 VM 환경에서 사용이 가능하며, 설치를 하거나 gralde wrapper을 이용해 실행 환경을 구성할 수 있다.
Gradle Project의 구조를 다시 살펴보면 다음과 같다.
디렉토리, 파일 | 설명 |
/.gradle /gradle |
gradle 버전별 엔진 및 설정 파일 |
/.idea | editor 관련 파일들 |
/gradlew /gradlew.bat |
gradle 명령 파일 |
/settings.gradle | 빌드할 프로젝트 정보 설정 (트리 형태로 멀티프로젝트 구성) |
/build.gradle | 프로젝트 빌드에 대한 모든 기능 정의 |
/src | 자바 소스 파일들 |
Gradle의 Build LifeCycle 3단계는 다음과 같다.
1. 초기화(Initialization) - 빌드 대상 프로젝트를 결정하고 각각에 대한 Project 객체를 생성한다. settings.gradle 파일에서 프로젝트를 구성한다.
2. 구성(Configuration) - 빌드 대상이 되는 모든 프로젝트의 build script를 실행하여 프로젝트 객체를 구성하고, configured Task를 실행한다.
3. 실행(Execution) - configuration 단계에서 생성하고 설정된 프로젝트의 태스크 중에서 실행 대상을 결정한다. gradle 명령행에서 지정한 태스크 이름 인자와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 task들을 실행한다.
build.gradle 파일의 내용을 살펴보자.
아래와 같이 plugins, repositories, dependencies 크게 3가지의 빌드 기능들을 정의할 수 있다.
plugin 설정
plugin은 미리 구성해 놓은 task들의 그룹으로, 특정 빌드 과정에서 필요한 기본 정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용할 수 있다.
build.gradle 파일에서 확인할 수 있는데, spring initializer을 사용하여 spring boot 기본 프로젝트 생성 시 만들어진 gradle의 설정은 다음과 같다.
Java 프로젝트를 위해 정의한 'JAVA plugin' 에서는 compileJava, classes, test, jar 등의 task를 제공하고,
Web 프로젝트를 위한 'War plugin' 에서는 어플리케이션 소스를 war 파일로 묶어주는 war task를 제공한다.
저장소 설정
Gradle은 다양한 저장소를 지원하는데 아래의 경우 maven 중앙 저장소를 나타내는 mavenCentral() 이 지정되었다.
의존관계 설정
Gradle은 java의 의존성(dependencies) 관리를 위해 다양한 '구성'(configuration)을 제공하고 있다.
의존 관계는 group, name, version 순으로 의존성을 기술하게 된다.
아래의 implementation은 프로젝트 컴파일 과정에서 필요한 라이브러리를 관리하며,
testImplementation은 test 시 필요한 의존성을 관리하게 된다.
테스팅
Gradle을 통해 테스트를 간편하게 할 수 있는데, 테스트 시 특정 테스트만 진행하거나 테스트의 결과를 확인하거나, 테스트를 detection 하고 그룹화하여 테스트를 진행할 수 있는 기능들을 제공하고 있다.
아래의 경우 junit5를 사용할 수 있다.
Spring Boot 프로젝트 빌드 및 실행
이제 기존에 만들었던 Spring Boot 프로젝트를 빌드하고 실행해보도록 하자.
우선 간단한 과정은 다음과 같다.
(Windows 사용자 cmd 터미널 창)
프로젝트 위치로 이동 후,
1. gradlew 또는 gradlew.bat 명령어 실행
2. cd build/libs
3. java -jar hello-spring-0.0.1-SNAPSHOT.jar
우선 해당 프로젝트 위치로 이동하여 gradlew 를 실행하면 다음과 같이 빌드가 성공했다는 BUILD SUCCESSFUL 문구가 마지막에 나타난다.
dir 명령어를 이용해 디렉터리를 확인해보자.
build를 하게 되면 build 폴더가 생기는데, 해당 폴더 내에 어떤 파일들이 있는지 확인해보자.
build 내 libs 폴더로 이동하여 파일들을 확인해보자.
hello-spring-0.0.1-SNAPSHOT-plain.jar, hello-spring-0.0.1-SNAPSHOT.jar 두 파일이 생성되었음을 확인할 수 있다.
이제 java -jar hello-spring-0.0.1-SNAPSHOT.jar 명령어를 실행하면 자바 애플리케이션이 실행된다.
나중에 서버 배포 시 이 jar 파일 하나만을 이용해 실행하게 되면 해당 스프링 어플리케이션 배포가 완료된다.
마지막으로 jar 파일이란 무엇인가? 간단하게만 살펴보도록 하자.
JAR (Java ARchive Files)
JAR는 일종의 자바 프로젝트의 압축 파일이다. ZIP 파일 압축 알고리즘을 기반으로 만들어졌으며, 반디집, 알집과 같은 zip 프로그램과 호환도 가능하다. JAR 파일은 웹 브라우저에서 빠르게 다운로드할 수 있도록, 자바 애플릿을 위한 클래스, 이미지 및 사운드 파일 등을 하나의 파일에 압축하여 담고 있는 파일이다.
프로그램 개발 후 하나의 파일로 묶어 실행하게 해주는 압축 파일로, 이 JAR 로 묶어 배포하게 되면, 경로나 파일의 위치에 상관없이 프로그램 실행이 가능하다.
[참고자료]
https://freezboi.tistory.com/39
https://ninetynine-2026.tistory.com/503
https://willbesoon.tistory.com/93
https://jungseob86.tistory.com/21
'# Tech Studies > Java Spring • Boot' 카테고리의 다른 글
[Spring] MVC와 템플릿 엔진을 이용한 웹 개발 (0) | 2023.01.05 |
---|---|
[Spring] Spring Boot의 정적 컨텐츠 기능 (0) | 2023.01.05 |
[Spring] View 환경 설정 (Thymeleaf 템플릿 엔진 동작 방식, Controller 작성, 내장 Tomcat local Server 로드) (0) | 2023.01.04 |
[Spring] Spring Boot Gradle의 라이브러리와 의존성 (0) | 2023.01.04 |
[Spring] 프로젝트 환경 설정 & Spring Boot 3.0 이후 Java SDK 버전 차이로 생기는 에러 해결 (0) | 2023.01.04 |