본문 바로가기

Prj PJ

[SpringBoot] build.gradle 설정 정리 및 조사

목적 

springBoot Project의 빠른 설정을 위해 설정에 필요한 정보들을 일괄 추가하고, 

관련된 디펜던시나 항목들이 무슨 활동을 하는지 조사한다. 

 

1. apply plugin :

  - task의 집합이다.

  - gradle어플리케이션의 빌드부터 테스트까지 다양한 작업을 수행하는 작업단위이다.

  - 특정 작업을 하기위해 모아놓은 작업들의 묶음을 의미한다.

  - apply는 커스텀 플러그인을 만들 떄 사용한다.

apply plugin: 'io.spring.dependency-management'

나의설정 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.0'
	id 'io.spring.dependency-management' version '1.1.0'
}

 

io.spring.dependency-management 란?

  - plugins에 추가하는 의존성(디펜던시)이다.

  - maven과 같은 종속성 관리 기능을 제공하는 Gradle 플러그인이다.

 

참고 : https://kotlinworld.com/323 

 

2. group 이름과 version 표시

group: 프로젝트의 groupId 

version: 애플리케이션의 버전명

group = '프로젝트 이름'
version = '0.0.1'

 

3. sourceCompatibility 

-java버전과 일치하는 값

-컴파일에서 사용하는 java버전을 표시

-소스코드에 사용할 수 있는 JAVA버전을 해당 버전값으로 제한한다

-컴파일단계에서 에러를 감지하고 더 높은 버전의 Java기능을 사용하는 것을 방지한다.

sourceCompatibility = '17'

 

4. targetCompatibility

-클래스 파일의 버전을 제어한다.

-프로그램에서 실행할 수 있는 가낭 낮은 java버전을 의미한다. ( 최소 버전 )

-여기에 기재된 버전 이상의 JAVA버전을 사용해야한다.

-컴파일 단계에서 에러를 감지하고, 더 낮은 버전을 사용하는 것을 방지한다.

sourceCompatibility 는 자동으로 추가되지만, targetCompatibility는 자동으로 추가되지 않는다.

targetCompatibility = '17'

 

참고 : https://dlee0129.tistory.com/265

 

5. options.encoding = 'UTF-8' 설정 추가

컴파일 시 한글이 꺠지는 현상 해결을 위한 설정을 추가한다.

아래의 설정을 추가한다.

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
	options.encoding = 'UTF-8'
}

 

참고 : https://strawberry-smoothie.tistory.com/51,https://fordeveloper2.tistory.com/7974

 

6. maven repository 추가

0 ) maven repository란?

- 의존성을 가져올 중앙저장소를 정의한다.

- maven을 이용하여 원하는 라이브러리를 손쉽게 프로젝트에 추가하도록 돕는다.

- 다양한 라이브러리가 저장되어 있고, 쉽게 다운로드받을 수 있도록 경로를 제공한다.

( https://devocean.sk.com/blog/techBoardDetail.do?ID=163830 )

 

6-1) mavenCentral() 

메이븐 리포지토리를 기본경로로 지정한다.

로컬 레포지토리에 jar 파일이 없다면 원격 레포지토리인 Maven Central Repository로부터 다운로드 한다. (https://repo.maven.apache.org/maven2/)

repositories {
	mavenCentral()
}

 

6-2) maven{}

커스텀 maven으로 저장소를 지정할 수 있다.

예 ) maven { url "https://jitpack.io" }   // jitpack.io를 저장소로 지정한다

 

6-3 ) jitpack.io ? ( https://jitpack.io/docs/ )

jitpacksms JVM및 Android프로젝트를 위한 새로운 패키지 저장소이다.

요청 시 git프로젝트를 빌드하고 바로 사용할 수 있는 jar,aar을 제공한다.

프로젝트 빌드 및 업로드 단계를 거치지 않아도 된다.

이미 github에 프로젝트가 있더라도 누구나 빌드할 수 있게 한다.

=> 프로젝트의 필요에 따라 추가한다.

repositories {
    mavenCentral()
    maven { url "https://jitpack.io" }
}

 

 

7. configurations{} - lombok annotation processor

: configurations 빌드그래들 내부에서 사용되는 설정을 정의한다.

: 롬복 라이브러리를 적용하여 어노테이션을 사용할 수 있게 설정한다.

configurations {
    compileOnly {
	    extendsFrom annotationProcessor
    }
}

dependencies {
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	testCompileOnly 'org.projectlombok:lombok'
	testAnnotationProcessor 'org.projectlombok:lombok'
}

 

8. configurations{} - 빌드 시 발생하는 '전이 의존성'을 해결하기

-외부라이브러리에서 사용한 의존성이 전이되어 빌드버전이 꼬이는 문제현상 발생함에 따라 문제가 발생할 수 있는 라이브러리의 의존성을 배제한다.

- all*.exclude 를 이용하면 해당하는 라이브러리의 전체 모듈/그룹의 의존성을 배제한다.

- 설정에서 제거한 항목

 

build.gradle 파일에 추가

configurations{
	all*.exclude module : 'spring-boot-starter-logging'
	all*.exclude group: "org.apache.tomcat.embed"
	all*.exclude module: "spring-boot-starter-tomcat"
}

 

- spring-boot-starter-logging

: 스프링부트에서 제공하는 로깅 설정이지만 log4j를 사용한다. log4j는 치명적인 보안 취약 결함이 발견되어 사용되지 않기 때문에 'spring-boot-starter-log4j2'를 추가하여 사용하는데 충돌이 발생하므로 제거

 

- org.apache.tomcat.embed

: 전체 tomcat 서버 배포판과 함께 단일 Java웹 애플리케이션을 패키징하는 방법을 제공한다.

: 모든 java웹 애플리케이션을 해당 인스턴스에 배포한다.

: Spring Boot는 서버에 별도의 WAS를 설치할 필요가 없도록 내장 WAS를 사용한다.

따라서 외부에 별도로 추가 서버를 두지 않고 Spring Boot Jar 파일만 실행하면 된다.

: 제거 시 내장 톰캣이 없어 서버 실행시 바로 완료 됨

=> 본 프로젝트에서는 spring undertow를 사용할 것이므로 제거 함

 

-spring-boot-starter-tomcat

: springboot에 내장된 tomcat

: 제거 시 내장 톰캣이 없어 서버 실행시 바로 완료 됨

=> 본 프로젝트에서는 spring undertow를 사용할 것이므로 제거 함

 

? 왜 내장 tomcat을 제거하고 undertow를 쓰나요?

-> undertow가 대규모트래픽 처리 시 tomcat보다 안정적이다. undertow는 netty를 기반으로 만들어 졌다. 가장 기본이 되는 WAS로서 tomcat이 사용될 수 있지만 목적과 규모 측면으로 고려하였을 때 undertow가 많이 쓰이므로 undertow를 적용한다.

 

 

참고 :

https://namget.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%A0%84%EC%9D%B4-%EC%9D%98%EC%A1%B4%EC%84%B1-exclude-transitive-dependency

https://namu.wiki/w/Log4j%20%EB%B3%B4%EC%95%88%20%EC%B7%A8%EC%95%BD%EC%A0%90%20%EC%82%AC%ED%83%9C?from=Log4j#fn-1

https://www.theserverside.com/definition/embedded-Tomcat

 

9. bootJar

: bootJar는 실행가능한 jar를 빌드하는 태스크이다,

: 플러그인에 포함되어 있음

- jar의 이름을 설정한다. ( 필수적인 것은 아니지만 필요한 경우 사용할 수 있다. )

- docker에서 프로젝트를 실행시킬 때 하나의 실행 스크립트로를 여러번 재활용하기 위하여 네이밍 패턴을 일치시키는 경우에 사용된다.

- jar

: java archieve를 의미.

: java 어플리케이션을 배포하고 동작할 수 있는 형태로 합축한 형태.

: java class file, EJB, resource, 설정, 의존성dependencies 파일등을 모두 포함하였다.

: path등의 경로를 유지하기 때문에 JVM위에서 단독실행 가능.

bootJar {
   archiveFileName = "프로젝트이름.jar"
}

참고 : https://velog.io/@jwkim/spring-boot-build-jar

 

10. 의존성 조사 ( 작업중 )

ㄴ프로젝트를 구성하고 실행할 때 필요한 라이브러리 정보를 내려받아 설정한다. 다양한 기능을 제공한다.

ㄴ 프로젝트에 설정해야할 다수의 의존성을 사전에 미리 정의하여 의존성 조합 제공한다.

 

1) implementation 'org.springframework.boot:spring-boot-starter'

ㄴ사전에 정리된 의존성 조합을 제공한다. 사용자가 찾아서 설정해야하는 정보를 쉽고 빠르고 정확하게 찾아 의존성 설정을 할 수 있도록 지원한다.

// 포함됨
jakarta.annotation » jakarta.annotation-api
org.springframework » spring-core
org.springframework.boot » spring-boot
org.springframework.boot » spring-boot-autoconfigure
org.springframework.boot » spring-boot-starter-logging

 

2) implementation 'org.springframework.boot:spring-boot-starter-web'

ㄴ 스프링 MVC를 사용해 RESTful이 포함된 웹애플리케이션을 작성하기 위한 스타터다. 기본 임베디드 컨테이너로 톰캣을 사용한다.

// 포함됨
org.springframework » spring-web
org.springframework » spring-webmvc
org.springframework.boot » spring-boot-starter
org.springframework.boot » spring-boot-starter-json
org.springframework.boot » spring-boot-starter-tomcat

 

3) implementation 'org.springframework.boot:spring-boot-starter-jdbc'

ㄴ java object를 연계하기 위해 제공되는 spring Data의 라이브러리 중 하나이다,

ㄴSpring Data JPA가 가진 복잡한 부분을 덜어내었다.

ㄴDB조회를 가볍게 할 수 있다.

ㄴquery를 만들고 domain에 mapping하는 점에 중점을 두었다.

ㄴJDBC template를 제공

참고 : https://luvstudy.tistory.com/174

 

4) implementation 'org.springframework.boot:spring-boot-starter-undertow'

ㄴ> https://hyojaedev.tistory.com/32

- J2EE 규격을 모두 만족하는 WAS,

-대규모 트래픽으로부터 Tomcat보다 안정적이라는 평가를 받고 있다.

-웹소켓과 리버스 프록시, 서블렛 4.0을 지원한다

-비동기방식으로 실행된다.

-톰캣은 동기방식으로 정해진 수만큼만 프로세스를 띄울 수 있음

 

5) implementation 'org.springframework.boot:spring-boot-starter-log4j2'

 

6) implementation 'org.springframework.boot:spring-boot-starter-aop'

 

7) implementation 'org.springframework.boot:spring-boot-starter-webflux'

ㄴ -http 통신을 쉽게 하도록 도와주는 유틸성 클라이언트 라이브러리

 

8) implementation 'org.springframework.boot:spring-boot-starter-validation'

ㄴ>

 

9) jackson lib 

- implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.1'

- implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.1'

ㄴ 데이터 전달 시 text/html 형식이 아닌 json데이터로 구조를 처리하여 반환하는 라이브러리이다.

향후 좀 더 조사하기

참고 :  https://mommoo.tistory.com/83

 

// https://mvnrepository.com/artifact/jakarta.el/jakarta.el-api

implementation 'jakarta.el:jakarta.el-api:5.0.1'

ㄴ> el은 데이터를 표현하기 위한 언어이다. 모델 오브젝트를 뷰에서 출력할 때 JSP의 출력 문법을 대체하는 간결한 표현언어이다.

 

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'

implementation 'com.mysql:mysql-connector-j:8.0.33'

implementation "commons-io:commons-io:2.11.0"

implementation "org.apache.commons:commons-lang3:3.12.0"

implementation 'org.apache.commons:commons-math3:3.6.1'

implementation "org.apache.commons:commons-configuration2:2.7"

implementation "org.apache.commons:commons-collections4:4.4"

implementation 'com.google.code.gson:gson:2.9.1'

 

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'

ㄴ> 스웨거, openapi 를 사용하기 위한 라이브러리

 

compileOnly 'org.projectlombok:lombok:1.18.26'

annotationProcessor 'org.projectlombok:lombok:1.18.26'

 

// https://mvnrepository.com/artifact/org.mapstruct/mapstruct

annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'

ㄴ> mapstruct 오브젝트에서 오브젝트를 카피할 떄 사용한다.

 

implementation 'org.mapstruct:mapstruct:1.5.5.Final'

 

) 테스트 실행을 위한 설정 부분

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'

testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

testCompileOnly 'org.projectlombok:lombok:1.18.26'

testAnnotationProcessor 'org.projectlombok:lombok:1.18.26'