Posts [Java] Gradle Dependency Configurations
Post
Cancel

[Java] Gradle Dependency Configurations

compileClasspath

  • 컴파일 시에 필요한 class path

runtimeClasspath

  • 런타임 시에 필요한 class path
  • 보통, compile하면 compile path에도 있고 runtime path에도 있다.


gradle-configurations

compileOnly

  • 컴파일 시에만 필요하고, 런타임 시에는 불필요한 경우
  • 컴파일할 때는 해당 종속성을 사용하고 build 결과물에는 넣지 X
  • Advantage? build 결과물의 크기가 작아진다는 장점 O
  • compileClassPath에만 dependency를 두는 것
  • ex. Lombok -> 컴파일 시에 lombok annotation을 보고 getter/setter 등 만들어주고 런타임 시에는 사용하지 X

runtimeOnly

  • 컴파일 시에는 불필요하고, 런타임 시에만 필요한 경우
  • Advantage? 컴파일 시간이 빨라진다 -> 컴파일할 때는 사용하지 않기 때문
  • runtimeClassPath에만 dependency를 두는 것
  • ex. JDBC 관련 -> e.g. h2, mysql
  • ex. log 관련 -> log4j
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
예를 들어,

class A {
    B = new B();
}

class B {
    int dani() {
	    return new C().wow();
    }
}

만약 A 클래스를 사용한다고 가정하면,
컴파일 시점에 B 클래스 의존 O
런타임 시점에 B, C 클래스 의존 O

implementation

  • ex. A -> B -> C 와 같은 상황
  • 이때 C를 변경하면, B와 C만 recompile 하면 된다 -> B는 C를 직접적으로 의존하고 있기 때문
  • A 입장에서는 compileClassPath에 C가 들어가지 X
  • 따라서, C가 변경된다고 해도 A를 recompile 할 필요가 X

api

  • 한편, implementation과 동일한 상황에서 api는 A에서 C에 대한 접근이 가능함
  • A 입장에서 compileClassPath에 C가 O
  • 따라서, C가 변경되면 A 또한 recompile O

소비자에게 유출된다 의미?

  • ex. A -> B -> C에서 api를 사용하는 경우
  • A를 사용하는 소비자 입장에서 compileClassPath에 C가 들어오게 되니까 노출된다는 뜻
  • 물론 runtimeClassPath에는 C를 사용하니까 노출되는 게 당연함 -> api, implementation 둘 다 !

compileOnly vs compileOnlyApi

  • compileOnly는 ex. A -> B -> C 경우에 C가 변경되면 A는 recompile 할 필요 X, B랑 C만 recompile 하면 O
  • compileOnlyApi는 ex. A -> B -> C 경우에 C가 변경되면 A, B, C 전부 recompile O -> api 가 붙었기 때문에 !


References

This post is licensed under CC BY 4.0 by the author.

[Spring] JdbcTemplate queryForObject() - Return Value Issue

[우아한테크코스] 다니의 학습 로그 - 레벨 2