본문 바로가기
CS공부

Spring boot의 build.gradle 특히 dependencies의 타입

by 티코딩 2023. 12. 18.

면접질문중 롬복은 왜 compileOnly 인가요? 라는 질문을 받았다.

사실 사용만 해봤지 왜 이건 컴파일온리로 되어있을까? 라는 생각은 한번도 해보지 못했었다.

그리고 다른 종류들의 런타임온리, 디벨롭먼트온리 등등 이런것들의 종류는 어떤것들이 있고 왜쓰는지를 알아보자. 더 나아가서 아예 build.gradle의 구성을 한번 알아보자.

 

ㅇ 면접질문

롬복은 왜 컴파일온리 일까? compileOnly로 설정을 해놓으면 해당 라이브러리는 컴파일시에만 필요하며 런타임시에는 프로덕션 코드에 영향을 미치지 않기 때문이다. 이렇게 나눠 불필요한 라이브러리의 크기를 줄이고 런타임 환경에 불필요한 클래스들이 추가 되지 않게 할 수 있다.

 

ㅇ 종류

- implementation : 구성은 주요 의존성을 나타냄. 이 의존성은 컴파일과 실행 시에 모두 사용된다.

- runtimeOnly : 런타임에만 필요한 의존성을 나타냄. 컴파일 시에는 필요하지 않으며, 실행 시에만 필요함.

- compileOnly : 컴파일 시에만 필요한 의존성을 나타냄. 런타임에는 필요하지 않음.

- testImplementation, testRuntimeOnly, testCompileOnly : 테스트 스코프에서 사용됨. 각각 테스트를 위한 컴파일, 런타임, 그리고 컴파일 시에만 필요한 의존성을 나타냄.

 

ㅇ build.gradle의 구성을 알아보자.

plugins {
   id 'org.springframework.boot' version '2.7.1'
   id 'io.spring.dependency-management' version '1.0.11.RELEASE'
   id 'java'
}

group = 'adsds126.com'
version = '0.0.1-SNAPSHOT'

java {
   sourceCompatibility = 11
   targetCompatibility = 11
}

repositories {
   mavenCentral()
}

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-security'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   implementation 'org.projectlombok:lombok:1.18.22'
   runtimeOnly 'com.h2database:h2'
   // runtimeOnly 'mysql:mysql-connector-java'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   testImplementation 'org.springframework.security:spring-security-test'
   implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
   implementation 'org.springframework.boot:spring-boot-starter-validation'
   implementation 'org.springframework.boot:spring-boot-starter-logging'
   implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
   implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2'
   runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.2'
   runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.2'
   compileOnly 'org.projectlombok:lombok'
   developmentOnly 'org.springframework.boot:spring-boot-devtools'

   annotationProcessor 'org.projectlombok:lombok'
}

tasks.named('test') {
   useJUnitPlatform()
}

 

그냥 아무 프로젝트 하나 가져와봤다.

가장먼저 있는 plugins부터 보자.

plugins {
   id 'org.springframework.boot' version '2.7.1'
   id 'io.spring.dependency-management' version '1.0.11.RELEASE'
   id 'java'
}

첫줄은 스프링부트 애플리케이션을 빌드하기위한 플러그인이다. 단독으로쓰면 별거없지만, 맨밑줄의 id ' java'를 넣으면 실행 가능한 jar 빌드 작업이 자동으로 구성된다.

id 'org.springframework.boot' version '2.7.1'

두번째 줄은 의존성관리를 쉽게해주는 플러그인이다. 내가 사용중인 플러그인에 맞는 버전의 의존성들을 가져온다.

id 'io.spring.dependency-management' version '1.0.11.RELEASE'

이 외에도 프로젝트 요구에 따른 플러그인들을 넣을 수 있다.

 

그밑으로 넘어가자.

group = 'adsds126.com'
version = '0.0.1-SNAPSHOT'

java {
   sourceCompatibility = 11
   targetCompatibility = 11
}

group은 spring initializer에서 명시해둔 그룹명이고, version은 이 프로젝트의 버전이다. 배포를 하게되고 업데이트를 거치면 하나씩 올려야한다. 다음으로 그 밑을 보자.

sourceCompatibility = 11

targetCompatibility = 11

이것들은 각각 컴파일된 Java 소스 코드와 생성된 바이트코드의 버전을 나타낸다. 여기에서는 Java 11을 사용하도록 설정되어 있다는 뜻이다.

repositories {
   mavenCentral()
}

이 블록은 의존성을 가져오기위한 저장소를 정의하는 부분이다. mavenCentral() 메서드를 호출하여 Maven Central Repository를 사용하겠다고 선언하는 것이다. 다른 저장소로는 JCenter, MavenLocal, Google Maven Repository 등이 있다.