본문 바로가기

Gradle

[Gradle] implemetation, api, complieOnly, runtimeOnly

Gradle의 Dependency 4가지

classpath는 클래스나, jar 파일이 존재하는 위치라고 볼 수 있다.

  • compileClassPath : 에러없이 컴파일을 하기 위해 필요한 클래스와 jar들의 위치를 나타낸다(주의할 점은, 컴파일이 완료되었다고 애플리케이션이 정상적으로 실행되는 것이 아니다)
  • runtimeClassPath : 애플리케이션이 정상적으로 실행하기 위해 필요한 클래스들과 jar들의 위치를 나타낸다.

gradle의 dependencies 종류 4가지

 

우선, complie time과 runtime에 대해 알아보자.

컴파일 타임 & 컴파일 타임 에러

  • 코드가 컴파일을 통해 기계어로 변환되는 과정이다.
  • 컴파일 타임 에러는 코드 상의 구문 오류 또는 누락된 파일을 참조하는 것과 같은 문제로 인해 프로그램이 성공적으로 컴파일되지 못하는 상황에 발생합니다. 이때 컴파일러가 컴파일 타임 에러를 발생시키고, 문제의 원인이 되는 소스 코드가 어디인지 알려줍니다.
    • 구문 오류 (Systax Error)
    • 타입 참조 오류 (Type Check Error)
  • 코드에 볼드 표시를 한 이유는, 컴파일에서 필요한 클래스나 jar파일은 작성한 "코드"에 나와있는 표면적인 내용에 관한 것이라는 뜻으로 한 것이다. 예를 들어 class A 안에 new B() 가 있고, class B 안에 new C()가 있고, class A를 컴파일한다고 생각하자. 그럼 class A의 컴파일 타임에 필요한 것은 A와 B에 대한 정보가 필요한 것이다. 런타임에, A,B,C에 대한 정보가 필요한 것이다.

 

런타임 & 런타임 에러

  • 컴파일의 결과인 기계어(프로그램)가, 실행되는 때
  • 프로그램의 소스 코드가 정상적으로 컴파일되어 프로그램이 동작하고 있는 경우에도 오류가 발생할 수 있습니다. 기능이 정상적으로 작동하지 않거나, 예기치 않은 프로그램 동작 또는 충돌이 발생하는 경우입니다. 이러한 유형의 오류를 런타임(프로그램 실행 중)에 발생하므로 런타임 에러라고 합니다. 
    • 0 나누기 오류
    • 널 (Null) 참조 오류
    • 메모리 부족 오류

 

complieOnly vs runtimeOnly

complieOnly

  • compileClassPath 에만 추가하기
  • 즉, 컴파일 타임에만 필요하고, 런타임에서는 사용하지 않는 라이브러리가 이 옵션을 사용한다.
  • 예시
    • lombok : 컴파일 시에, getter, setter 등 필요한 것들을 생성시키고, 런타임 때는 사용하지 않기 때문이다.

runtimeOnly

  • runtimeClassPath 에만 추가하기
  • 즉, 컴파일 타임에는 필요 없는데 런타임에서 의존해야 하는 라이브러리가 이 옵션을 사용한다.
  • 예시
    • DB 관련, 로그 관련 dependency

 

 

api vs implemetation

api

  • 의존 라이브러리 수정시 해당 모듈을 의존하고 있는 모듈들 또한 재빌드
  • 즉, 현재 모듈을 의존하고 있는 다른 모듈들도, 현재 모듈의 라이브러리를 dependency로 갖게 된다
  • C -> B -> A(api) 일 때, C에서 A를 접근할 수 있음
  • A 수정시 B 와 C 모두 재빌드

implemetation

  • 의존 라이브러리 수정 시 본 모듈까지만 재빌드
  • C -> B -> A(implemetation) 일 때, C에서 A를 접근할 수 없음
  • A 수정시 B 까지 재빌드

 

 

gradle의 옵션 정리

 

[참고]

https://bepoz-study-diary.tistory.com/372

 

[Spring] Gradle 파일 implementation, api, runtimeOnly, compileOnly... 등에 대해

Gradle 파일 implementation, api, runtimeOnly, compileOnly ... 등에 대해 아무 생각없이 gradle을 사용해왔는데 우테코 미션에 대한 리뷰 중 다음과 같은 것이 달렸다. 그래서 공부해보았다! 먼저, Classpath에 대

bepoz-study-diary.tistory.com

https://thinkandthing.tistory.com/64

 

SpringBoot 멀티 모듈(Multi Modlue) 설정

- 개발 환경 1. IntelliJ 2. MAC 3. Gradle 4. SpringBoot 멀티 모듈 이란? 멀티 모듈이란 서로 독립적인 프로젝트(인증, 어플리케이션)를 하나의 프로젝트로 묶어 모듈로서 사용되는 구조를 말한다. 멀티 모

thinkandthing.tistory.com

 

'Gradle' 카테고리의 다른 글

[Gradle] dependency의 version을 명시하기 vs 생략하기  (0) 2022.12.07