면접질문중 롬복은 왜 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 등이 있다.
'CS공부' 카테고리의 다른 글
기본기 닦기(2) - 빌드/컴파일, 웹서버/내장서버 (1) | 2023.12.22 |
---|---|
기본기 닦기(1) - 스레드, 동기/비동기, JVM (0) | 2023.12.21 |
지난번 면접후 (0) | 2023.12.18 |
내일 면접보러간다. (0) | 2023.12.12 |
신입 백엔드 개발자의 기준에 대해.. (1) | 2023.12.06 |