주제내용Build 는 무엇일까요?Gradle Dependency ConfigurationsJava 라이브러리 플러그인 구성test 구성 설정뜯어보기implementation vs api (compile)
주제
Gradle 에 대해서 알아봅시다.
내용

- Groovy를 이용한 빌드 자동화시스템으로 여러 가지 언어를 지원하고 있습니다.
- 라이브러리 버전관리와 의존성 관리를 해줍니다.
- Maven 보다 적은 양의 스크립트로 짧고 간결하게 작성할 수 있습니다.
Build 는 무엇일까요?
- 프로젝트를 진행하면서 작성한 소스코드나 파일이나 자원등을 jvm이 인식할 수 있는 패키징하는 과정 및 결과물입니다.
Gradle Dependency Configurations
Java 라이브러리 플러그인 구성
- 초록색은 사용자가 종속성을 선언하는데 사용해야하는 구성입니다.
- 분홍색은 구성 요소가 컴파일되거나 라이브러리에 대해 실행될 때 사용되는 구성입니다.
- 파란색은 자체 사용을 위해 구성 요소 내부에 있습니다.
test 구성 설정
뜯어보기
- compileClassPath
- 컴파일 시에 필요한 class path 입니다.
- runtimeClassPath
- 런타임 시에 필요한 class path 입니다.
- compileOnly
- 컴파일 시에만 필요하여 컴파일할 때 종속성을 사용하고 build 결과물에 넣지 않습니다.
- compileClassPath에만 dependency를 둡니다.
- build 결과물의 크기가 작아진다는 장점이 있습니다.

- runtimeOnly
- 런타임 시에만 필요한 경우
- runtimeClassPath에만 dependency를 두는 것
- 컴파일할 때는 사용하지 않기 때문에 컴파일 시간이 빨라집니다.

- annotationProcessor
- 그래들은 compileClassPath와 annotationProcessorClassPath를 분리하여 빌드 성능을 향상시키는데
- 기본적으로 포함되어 있는 어노테이션이 아니라면 annotationProcessor를 통해 명시적으로 추가해줘야합니다.
- lombok 사용시 컴파일러는 lombok 에서 제공하는 어노테이션을 인식하지 못합니다.

⇒ (querydsl 도 사용해줘야하는거 같은데?)
implementation vs api (compile)
class A { B = new B(); } class B { int create { return new C().create(); } } // A 클래스를 사용할 때 // 컴파일 시점에 B 클래스를 의존하고 // 런타임 시점에 B, C 클래스를 의존한다.
- implementation
- C를 변경하면, B와 C만 recompile하면 된다.
- B는 C를 직접적으로 의존하고 있기 때문에
- A 입장에서 compileClassPath에 C가 들어가지 않는다.
- api , compile ( 권장 x)
- A에서 C에 대한 접근이 가능하다.
- A 입장에서 compileClassPath에 C 가 존재한다.
- C가 변경될 경우 A 도 recompile 된다.
- 소비자 유출
- A를 사용하는 소비자 입장에서 compileClassPath에 C가 들엉오면서 노출된다.
- runtimeClassPath에는 C를 사용하기때문에 노출 되는 것이 당연하다.