1. Gradle 역할
- 빌드 자동화 도구: 소스코드에서 실행 가능한 파일로 변환하는 과정을 자동화함
- 프로젝트를 빌드, 실행 가능한 JAR 파일을 생성, 필요한 의존성 라이브러리를 관리, 테스트를 실행, 코드 컴파일러를 설정하는 등 다양한 작업을 자동화할 수 있음
- 빌드 스크립트(build.gradle)를 통해 프로젝트르 구성
- 빌드 태스크 정의, 의존성 관리, 플러그인 설정, 환경 변수 설정 등을 구성
- Groovy나 Kotlin 같은 JVM 기반 언어를 사용해서 작성함
- 예시) spring boot 프로젝트의 build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.5'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.lets'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
}
tasks.named('test') {
useJUnitPlatform()
}
1.1 plugins
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.5'
id 'io.spring.dependency-management' version '1.1.0'
}
- gradle task의 집합
- task: 빌드 프로세스를 실행하는데 사용되는 작업 단위
- ex1) compileJava: 자바 소스 코드를 컴파일하여 클래스 파일 생성
- ex2) test: 'compileJava' task에 의존함
- task: 빌드 프로세스를 실행하는데 사용되는 작업 단위
- plugin을 적용하면 미리 plugin 형태로 묶여 있는 task들이 gradle 파일 안으로 들어옴
- ex) id 'java': java 프로젝트를 실행하는데 필요한 task들을 적용
1.2 group/version/sourceCompatibility
group = 'com.lets'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
- group: 프로젝트의 groupId
- version: 애플리케이션 버전명
- sourceCompatibility: 프로젝트 소스를 컴파일하는 JDK 버전
- targetCompatibility: 빌드된 byte 코드(class 파일)의 호환 JVM 버전
- ex) sourceCompatibility: 1.8, targetCompatibility: 1.7인 경우
- Java 8을 사용해 컴파일하지만, 컴파일된 클래스파일은 Java 7에서도 실행될 수 있음
- ex) sourceCompatibility: 1.8, targetCompatibility: 1.7인 경우
1.3 configurations
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
- build.gradle 내부에서 사용되는 설정을 정의
- compileOnly가 annotationProcessor를 상속함
- 컴파일 타임에 annotation processor를 사용할 수 있음
- compileOnly: 컴파일 시에만 사용, 빌드 결과물에 포함 x
- annotation processor도 컴파일 시에만 사용, 빌드 결과물에 포함 x
- 컴파일 타임에 annotation processor를 사용할 수 있음
1.4 repositories
repositories {
mavenCentral()
}
- 의존성을 가져올 repository를 정의함
1.5 dependencies
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
}
- keyword 'group:name:version' 형태
- keyword
- implementation: 컴파일 & 런타임 시 클래스패스에 추가됨. 빌드 결과물에 포함
- compileOnly: 컴파일 시에만 사용, 런타임 시 클래스패스에 추가되지 않음, 빌드 결과물에 포함되지 X
- runtimeOnly: 런타임 시에만 사용, 컴파일 시 클래스패스에 추가되지 않음, 빌드 결과물에 포함되지 X
- testImplementation: 테스트 소스코드에서 사용, 컴파일 및 런타임 시 클래스패스에 추가됨
- testCompileOnly: 테스트 소스코드 컴파일 시에만 사용, 런타임 시 클래스패스에 추가되지 않음
- testRuntimeOnly: 테스트 소스코드 런타임 시에만 사용, 컴파일 시 클래스패스에 추가되지 않음
- annotationProcessor: 컴파일 시 어노테이션을 찾아서 코드를 자동으로 생성하는 프로세서(java annotation processor)를 활성화하고, 컴파일러에게 해당 프로세서를 실행하도록 지시함
- class path
- compile: 소스코드를 컴파일하는데 필요한 클래스 파일들이 위치한 경로
- jdk 설치하고 환경변수 등록할 때 사용하는 그 경로임
- runtime: 실행 중인 프로그램에서 필요한 클래스 파일들이 위치한 경로
- jvm이 시작될 때 시스템 속성으로 지정 or 실행 시 경로를 지정해줄 수 있음
- compile: 소스코드를 컴파일하는데 필요한 클래스 파일들이 위치한 경로
* 마지막
tasks.named('test') {
useJUnitPlatform()
}
- tasks.named('test')
- Task 객체의 이름을 사용해서 해당 task를 참조하는 방법
- 여기서는 'test' Task를 참조하고 있음
- useJUnitPlatform()
- JUnit 5를 사용해서 테스트를 실행하기 위한 설정을 추가하는 메서드
2. build 과정
Gradle은 build.gradle에 정의된 설정 정보를 이용해서 프로젝트를 빌드함
- 1. 의존성 라이브러리 다운로드: 라이브러리의 버전이나 종속성에 따라 다른 라이브러리를 함께 다운로드 할 수 있음
- 2. 소스 코드 컴파일
- 소스코드와 빌드 설정정보를 바탕으로 컴파일러를 실행
- 컴파일된 클래스는 build 디렉토리에 저장
- 3. 테스트 실행
- src/test 디렉토리에 있는 테스트 코드를 실행함
- 이때, 테스트를 실행하기 위해 필요한 의존성 라이브러리들을 자동으로 다운로드함
- 테스트 결과는 XML 파일 형식으로 build 디렉토리에 저장됨.
- 4. 빌드 결과물 생성
- src/main에 있는 파일을 포함하여 실행 가능한 JAR, WAR, ZIP 파일 등 결과물을 생성함
- 결과물은 build 디렉토리에 저장함
- 5. 빌드 결과물 배포
- Gradle은 bulid 디렉토리에 있는 빌드 결과물을 지정한 위치로 복사하거나, 외부 서버에 업로드하는 등의 작업을 수행함
3. Java 프로그램 실행 과정
- 1. 컴파일: 컴파일러가 소스코드를 byte 코드로 변환함
- 컴파일러는 JDK에 포함되어 있음
- 2. 컴파일 결과로 class 파일이 만들어짐 (byte 코드)
- class의 메서드, 필드, 인터페이스 등의 정보가 포함됨
- 3. byte 코드를 jvm이 읽고 실행함
- Java는 JVM 위에서 동작함
- C같은 경우 HW에 맞는 기계어를 만들어내지만, Java는 JVM위에서 동작하는 class 파일을 만들고 JVM에서 그 파일을 읽어서 실행가능한 기계어로 변환하기 때문에 HW에 종속적이지 않음
- JVM 구성요소
- Class Loader: .class 파일을 로딩
- Runtime Data Area: 메모리
- MethodArea: 클래스 파일의 정보를 저장하는 영역
- 클래스의 멤버 변수, 메서드, 생성자 등의 정보를 저장함
- 모든 thread에서 공유
- 이 영역에 저장된 코드들은 JVM에 의해서 기계어로 변환됨
- Heap Area
- 동적할당으로 만들어진 객체들이 저장됨 ('new')
- 모든 thread에서 공유
- 공간이 부족하면 garbage collector가 실행됨
- Stack Area
- 메서드 안에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)이 저장됨
- 각 thread마다 하나씩 생성됨
- PC Register
- 현재 실행 중인 스레드가 다음에 실행할 명령어의 주소를 가리키는 레지스터
- 각 thread마다 하나씩 생성됨
- Native Method Stack
- java app. 외부에 구현된 native code를 실행할 때 사용됨. native method란 자바가 아닌 다른 언어로 작성된 코드를 의미함
- native method를 호출할 때 스택 프레임을 native method stack에 생성하게 됨. stack area와 따로 관리.
- 각 thread마다 하나씩 생성됨
- JNI(Java Native Interface)라는 표준 규약을 제공함
- MethodArea: 클래스 파일의 정보를 저장하는 영역
- Execution Engine: 자바 코드를 해석하고 실행
- Interpreter: 바이트 코드를 한 줄씩 읽어서 실행하는 역할을 수행함
- Just-In-Time Compiler: 바이트 코드에서 중복 실행되는 코드를 찾고, 이를 기계어 코드로 변환 후 캐싱함. 이후 같은 코드가 실행되면, 캐시된 기계어 코드를 사용하게 됨.
- Garbage Collector: 사용하지 않는 객체를 메모리에서 제거하여 메모리를 관리함
'백엔드 > Spring' 카테고리의 다른 글
Docker(도커) (0) | 2023.03.31 |
---|---|
5. Aspect Oriented Programming with Spring (0) | 2023.03.15 |
1. The IoC container (0) | 2023.03.15 |
JPA와 연관관계 (with MySQL) (1) (0) | 2022.10.20 |
JWT 토큰을 이용한 로그인 구현 (1) (0) | 2022.10.13 |
댓글