build.gradle와 build 과정 살펴보기

    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에 의존함 

    intellij gradle 메뉴

    • 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에서도 실행될 수 있음

     

    1.3 configurations

    configurations {
    	compileOnly {
    		extendsFrom annotationProcessor
    	}
    }
    • build.gradle 내부에서 사용되는 설정을 정의
    • compileOnly annotationProcessor를 상속함
      • 컴파일 타임에 annotation processor를 사용할 수 있음
        • compileOnly: 컴파일 시에만 사용, 빌드 결과물에 포함 x
        • annotation processor도 컴파일 시에만 사용, 빌드 결과물에 포함 x

     

    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 실행 시 경로를 지정해줄 수 있음

     

    * 마지막

    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)라는 표준 규약을 제공함
      • 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

    댓글