아래의 키워드들은
implementation, testImplementation, runtimeOnly, compileOnly, annotationProcessor
각각 프로젝트의 빌드 및 배포 단계에서
어떤 의존성이 필요한 지를 선언하는 방법이다.
각 키워드들을 알아보기 전에
컴파일 타임과 런 타임에 대해서 알아보았다.
컴파일 (Compile Time)
무엇인가: 소스 코드를 기계가 이해할 수 있는 바이너리 코드(예: .class, .exe, .o 등)로 변환하는 과정.
목적: 코드에 문법적 오류가 없는지 확인하고, 모든 변수와 함수, 클래스 등이 올바르게 참조되고 있는지 검사.
언제 발생하는가: 개발자가 코드를 작성한 후, 컴파일 명령을 실행했을 때 발생.
예시: Java에서 javac 명령어를 사용해서 .java 파일을 .class 파일로 컴파일.
런타임 (Run Time)
무엇인가: 컴파일된 바이너리 코드가 실제로 실행되는 시간.
목적: 프로그램이 실제로 동작하면서 사용자의 입력을 받고 출력을 제공합니다. 여기서는 런타임 에러가 발생. (예: 나누기 에러, 널 참조 등).
언제 발생하는가: 컴파일이 성공적으로 완료된 후, 사용자가 프로그램을 실행할 때.
예시: Java에서 java 명령어를 사용하여 .class 파일을 실행.
간단히 말해서, "컴파일"은 프로그램을 만드는 단계이며, "런타임"은 프로그램을 실제로 실행하는 단계이다.
implementation
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
프로젝트 코드가 이 의존성을 직접 사용하며,
의존성이 컴파일 타임과 런 타임에 필요하다는 것을 나타낸다.
의존성이 변경되면 컴파일이 다시 수행된다.
cf) 'org.springframework.boot:spring-boot-starter-web' : 웹 어플리케이션 개발에 필요한 여러 라이브러리(ex) Spring MVC, Tomcat 등)를 묶어놓은 스타터.
testImplementation
dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
이 의존성은 테스트 컴파일 타임과 테스트 런 타임에만 필요하다는 것을 나타낸다.
Spring Boot의 테스트 스타터나 JUnit 테스트 라이브러리 등이 이에 해당된다.
cf) 'org.springframework.boot:spring-boot-starter-test' : Spring Boot의 테스트 스타터 패키지. JUnit뿐만 아니라 여러가지 테스트 관련 의존성을 포함한다. 이 스타터는 테스팅에 필요한 여러 라이브러리를 한꺼번에 가져오는 역할을 한다.
runtimeOnly
dependencies {
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
}
이 의존성은 런 타임에만 필요하며,
컴파일 타임에는 필요하지 않는다.
예를들어, JDBC 드라이버 같은 경우가 이에 해당한다.
compileOnly
dependencies {
compileOnly 'org.projectlombok:lombok'
}
이 의존성은 컴파일 타임에만 필요하며,
런타임에는 포함되지 않는다.
주로 어노테이션 프로세싱 라이브러리나,
API 구현체가 제공되는 경우에 사용된다.
annotationProcessor
dependencies {
annotationProcessor 'org.projectlombok:lombok'
}
이 의존성은 어노테이션 프로세서를 위해 사용되며,
컴파일 타임에만 필요하다.
lombok과 같은 라이브러리에 사용된다.
build.gradle 파일의 dependencies 블록에서 의존성을 지정할 때,
의존성의 유효 범위(scope)는 다음과 같이 몇가지로 나뉜다.
Compile Time, Runtime, Test Compile Time, Test Runtime.
의존성은 단순히 컴파일 타임과 런 타임으로만 나뉘는 것이 아니라,
좀 더 세분화된 범주로 나뉠 수 있는 것이다.
이는 의존성이 언제, 어떻게 사용되어야 하는지 명확하게 하고, 불필요한 의존성을 줄이기 위한 방법이다.
'개인 공부 (23.07~' 카테고리의 다른 글
[Java] Generic(제네릭) 개념과 예시 (1) | 2023.08.30 |
---|---|
@Transactional 무엇인가 (0) | 2023.08.30 |
ResponseEntity 사용이유, 개념, 예시 (0) | 2023.08.28 |
HTTP 개념, 특성, 구조 - 기본적인 정리 (0) | 2023.08.27 |
[JAVA] 자바는 다중상속을 지원하지 않는다? (0) | 2023.08.25 |