회사서 자바소스를 k8s 파드에 올리게 되면서 디펜더시 관련해서 문제가 발생해 애를 먹었기에 공부가 필요하다고 생각이 들었다. 그래서 이번 기회에 정확하게 정의를 정확하게 인지하기 위해 블로그에 정리를 할까 한다.
plugins {
id 'org.springframework.boot' version '2.4.3'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok:1.18.16'
annotationProcessor 'org.projectlombok:lombok:1.18.16'
testCompileOnly 'org.projectlombok:lombok:1.18.16'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'
}
test {
useJUnitPlatform()
}
implementation
- The dependencies required to compile the production source of the project which are not part of the API exposed by the project. For example the project uses Hibernate for its internal persistence layer implementation.
종속성은 프로젝트에 의해 노출된 API의 일부가 아닌 프로젝트의 프로덕션 소스를 컴파일하는 데 요구되어 진다...(?)
testImplementation
- The dependencies required to compile and run the test source of the project. For example the project decided to write test code with the test framework JUnit.
종속성은 프로젝트 테스트 소스를 컴파일하고 테스트하는 것이 요구되어 진다...(?)
영어로 이해하기에는 좀 난해해서 구글링한 결과 implementation은 해당 라이브러리에 의존하는 의존성만 재빌드한다는 의미인듯 싶다. 다시 말하자면 의존하는 의존성만 재빌드를 하게되면 파일크기/시간을 절약을 할 수 있는 장점을 가진다. (testImplementation은 테스트 범위에만 한정되는거 제외하고는 implementation 기능과 같다.)
compileOnly
- Declaring compile only dependencies
오직 컴파일할때만 종속성이 선언된다.
What does this do? Well much like the other dependency configurations (implementation, compileOnly etc.), all we’re really doing is defining what will get passed to the Java compiler when the compileJava Gradle task get executed. In the case of annotationProcessor we’re defining what libraries get passed to the -processorpath javac option.
마지막으로 AnnotationProcessor 을 설명하자면, 이것도 역시 컴파일 기준으로 해서 종속성이 포함되는 것 같지만, compileOnly랑은 조금 다른 개념 같다. 라이브러리가 '-processorpath' 옵션에 전달된 부분을 정의 내리는 것을 의미하다고 하는데 해당 부분은 종속성에 따라 포함되어야 할 수도 또는 필요없을 수도 있는듯 하다.(대표적인 dependency : lombok). 해당 키워드를 추가하면 컴파일 클래스 경로와 주석 프로세서 클래스 경로와 분리하여 빌드 성능을 향상이 되는 이점이 있다고 한다.
결론적으로 대략적으로 분석해봤을 시에는 해당 구조를 잘 파악하면 디펜더시가 꼬이지 않으면서도 컴파일/런타임 빌드를 했을 시 파일크기/시간을 단축시킬 수 있을거 같은 이점이 있을 거 같다.
docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph
'spring' 카테고리의 다른 글
Junit 개념 및 활용 (0) | 2021.07.24 |
---|---|
Springboot aop 기본개념 및 예제 (0) | 2021.07.17 |
[Springboot] Logback 사용하기 (0) | 2021.03.21 |
스프링 시큐리티 회원가입 & 로그인 & 로그아웃 (0) | 2020.02.06 |
Spring aop와 로그 예제 (0) | 2018.04.25 |