build.gradle에 대하여

하윤철·2024년 7월 19일

개발을 하다 여러 기능을 사용하려면 의존성 추가를 해줘야한다. 그럴때는 Gradle을 통해 의존성선언을 해줘야 한다.
그럼 의존성 추가 시 어떤 옵션이 있는지 알아보자.

  • implementation:
    • 의존성을 컴파일 타임과 런타임에 모두 포함시킨다.

    • 이 명령으로 추가된 라이브러리는 이 라이브러리를 사용하는 다른 모듈에 전달되지 않는다.

    • 주로 외부 라이브러리를 추가할 때 사용

      dependencies {
          implementation 'com.squareup.okhttp3:okhttp:4.9.0'
      }
  • api:
    • implementation과 유사하지만, 이 명령으로 추가된 라이브러리는 이 모듈을 사용하는 다른 모듈에도 전달된다

    • 주로 라이브러리 모듈에서 다른 모듈로 노출하고자 하는 API 의존성을 정의할 때 사용된다.

      dependencies {
          api 'com.google.guava:guava:29.0-jre'
      }

💡 build.gradle 에서 모듈이란?

root-project
├── settings.gradle
├── build.gradle
├── moduleA
│ └── build.gradle
└── moduleB
└── build.gradle
이런 식으로 여러 모듈이 나누어져 있을 때를 말한다.
api 같은 경우 modelA, modelB에도 의존성이 추가된다.

  • compileOnly:
    • 의존성을 컴파일 타임에만 포함하고, 런타임에는 포함하지 않는다.
    • 주로 어노테이션이나 컴파일 시에만 필요한 라이브러리를 추가할 때 사용된다.
```groovy
dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.12'
}
```
  • runtimeOnly:
    • 의존성을 런타임에만 포함하고, 컴파일 타임에는 포함하지 않는다.

    • 주로 테스트 라이브러리나 런타임 시에만 필요한 라이브러리를 추가할 때 사용된다.

      dependencies {
          runtimeOnly 'mysql:mysql-connector-java:8.0.22'
      }

💡 왜 compileOnly, runtimeOnly를 따로 만들었을까?

롬복 라이브러리의 소스코드는 지정된 클래스에 Getter, Setter등의 메소드를 만들어주는 로직'을 수행한다.이런 메소드가 만들어지는 단계는 **컴파일 단계**임. 

즉, Lombok의 소스코드는 컴파일 단계에서만 사용됨.

따라서 Lombok의 소스코드는 애플리케이션 런타임시에는 사용되지 않기 때문에 빌드 결과물에 포함되지 않음.
따라서 굳이 런타임 시에도 사용 할 필요가 없다.

이와 별도로 Lombok이 생성해준 소스코드는 빌드 결과물에 포함됨근거로 빌드된 .class파일을 열어보면 lombok 어노테이션은 사라지고 작성하지 않은 getter, setter 메소드가 존재하는 것을 볼 수 있음.

  • testImplementation:
    • 의존성을 테스트 컴파일 타임과 테스트 런타임에만 포함한다.
    • 주로 테스트용 라이브러리를 추가할 때 사용된다.
```groovy
dependencies {
    testImplementation 'junit:junit:4.13.1'
}
```
  • testCompileOnly:
    • 의존성을 테스트 컴파일 타임에만 포함하고, 테스트 런타임에는 포함하지 않는다.

      dependencies {
          testCompileOnly 'org.projectlombok:lombok:1.18.12'
      }
  • testRuntimeOnly:
    • 의존성을 테스트 런타임에만 포함하고, 테스트 컴파일 타임에는 포함하지 않는다.

      dependencies {
          testRuntimeOnly 'org.testcontainers:junit-jupiter:1.15.1'
      }
  • annotationProcessor
    • 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할

      dependencies {
          annotationProcessor 'org.projectlombok:lombok'
      }

      **💡보통 Lombok이 되지 않는 다면 annotationProcessor도 추가를 해주자**


추가: 기본 어노테이션 외 다른 어노테이션은 어떻게 동작할까?

Annotation Processor 가 Lombok 어노테이션을 인식하고 실제 코드를 생성해주는 과정은 아래와 같다.

  1. 어노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행
  2. 어노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 어노테이션 프로세서를 실행
  3. 어노테이션 프로세서 내부에서 어노테이션에 대한 처리
  4. 자바 컴파일러가 모든 어노테이션 프로세서가 실행 되었는지 검사하고, 모든 어노테이션 프로세서가 실행되지 않았다면 반복
profile
선순환을 만드는 개발자

0개의 댓글