백엔드 개발자를 희망하는 사람들이라면 한 번쯤은 사용해보거나, 어디서 보거나 뭐 어찌저찌해서 관심을 가질만한 부분이다.
바로 의존성(depencency)부분이다.
스프링부트는 gradle, maven과 같은 도구들을 이용해 의존성을 관리하는데, Gradle을 기준으로 의존성 관련해서 정리를 해볼려고 한다. (Maven은 사용하기 뭔가 귀찮았음 XML이, Gradle이 더욱 간단하고, 익숙함.)
1. Gradle?
소프트웨어는 거의 단독으로 작동하지 않고, 다양한 라이브러리의 형태나 모듈들, 프로젝트등이 서로 의존하며 모듈화된 시스템을 구성하기 위해 분할되는데, 이때 종속성 관리를 통해 자동화된 방식으로 프로젝트에 필요한 종속성을 선언, 해결, 사용 하는 기술이다.
Gradle은 빌드 자동화 도구 中 1개 인데, 이를 통해 프로젝트나 라이브러리 모듈의 의존성을 간편하게 관리가 가능하다.(Ant와 Maven의 단점을 보완했으며 Groovy 기반)
https://docs.gradle.org/current/userguide/dependency_management.html
그래서 Gradle을 사용하기 위해선 스프링의 프로젝트를 만들고 생성되는 build.gradle 파일의 dependencies 설정에 대해 알아야 한다.
2. Gradle의 특징과 장점
1. 우선 앞에서 설명한 것처럼 Ant와 Maven이 가진 장점을 모아 만들어서 의존성을 관리하기 위한 다양한 방법을 제공하며 Maven의 라이브러리도 사용이 가능하다.
2. 기존에 Ant와 Maven은 XML형식을 사용하기에 솔직히 말하면 귀찮고, 정적인 설정 정보를 구성하는데 Gradle은 xml의 구조에서 벗어나 간결한 정의가 가능하다.
3. 프로젝트를 설정 주입방식으로 정의하기에 Maven의 상속 구조보다 재사용에 용이하다.
4. task만 실행함으로써 다른 불필요한 동작을 줄이고 build cache를 사용해 이전의 task output을 재사용이 가능하다.
뿐만아니라 다른 장치에서도 build cache를 공유해 성능을 높일 수 있다고 한다.
5. 다양한 프로그램에서 gradle을 지원하며 빌드를 모니터링 할 수 있는 build scan을 지원한다.
프로젝트를 Maven이 아닌 Gradle로 생성하고 나면 구조이다.
디렉토리 및 파일명 | 설명 |
.gradle | gradle이 사용하는 폴더로, 작업(Task)로 생성된 파일이 저장됨. |
gradle | gradle 환경을 정리한 Wrapper 디렉토리 및 파일들이 저장되어 있음. Wrapper 속에는 .jar와 .properties가 있는데, .properties는 Wrapper 설정 정보 파일로, 버전 등을 관리할 수 있음. .jar은 Jar형식으로 압축된 Wrapper 파일로 gradlew, .bat 파일이 프로젝트 안에 설치되는 이 파일을 사용해 작업(Task)를 실행 |
.idea | |
src | 해당 프로젝트에서 만든 프로그램들 관련 디렉토리로 소스코드, 리소스 파일 등 다양한 파일들이 포함되어 있다. |
build.gradle | 의존성 관리 및 버전 관리, 다양항 Gradle 기본 빌드 설정 파일로 이 속에 빌드 처리에 관한 내용이 기술되어 있음. (빌드 스크립트 파일, Groovy 언어로 작성됨) |
gradlew, gradlew.bat | gradle 명령어로 bat은 윈도우용(배치 스크립트), lew는 맥 및 리눅스 용(배치 스크립트) |
settings.gradle | 프로젝트에 대한 설정 정보를 작성한 파일 |
기본적으로 우리가 환경에서 사용할 플러그인이나 의존성, 라이브러리 등은 build.gradle 파일에서 설정을 하게되는데, 이 스크립트는 기본적으로 언어를 설정하지 않으면 Groovy로 작성된다고 한다.
3. 라이브러리 의존성 관리
- 저장소(Repositories)
위 build.gradle 파일을 자세히 보면 repositories 라는 영역이 있다. Gradle에서는 프로그램이 필요한 라이브러리를 자동으로 다운하고 통합하는 기능을 갖고 있는데 이에 따라 저장소(repository)를 사용한다.
Gralde은 Maven, Ivy 등 저장소를 통해 종속성을 해결할 수있다.
(과거에는 저장소가 3개 있었다. 위 그림과 같이 2개, 나머지 하나는 JCenter이라는 저장소까지 총 3개)
그러나 현재 Jcenter가 지원을 중단해 더이상 사용 불가하고, Maven으로 이전했다고 들었다.
1. Maven Central repository = mavenCentral()
현재 많이 사용하고 있는 인기 저장소이다.
2. Google Maven repository = google()
안드로이드 SDK를 비롯한 안드로이드 관련 아티팩트를 호스팅한다.
이 둘 이외에도 URL로 사용자 정의 저장소를 선언할 수 있으며,
더다양한 종류의 저장소와 형식, 연결 방법들이 있으니 gradle 공식 문서를 참조 하는 것이 좋을 듯하다.
- 종속성 관리(Dependency management)
프로젝트에서 선언된 의존성들은 특정 범위를 가진다.
1. implementation
= compile과 implementaion이 있는데, 차이점은 블로그에 정리한 글이 있으니 찾아보고, implementation은 구현을 위해 사용한다
2. compileOnly
= 원하는 의존성을 컴파일 할 때만 사용한다.
3. runtimeOnly
= 원하는 의존성을 런타임 할 때만 사용한다.
4. testImplementation
= 테스트 할 때만 사용한다.
5. testAnnotationProcessor
= 테스트 환경에서 해당 의존성을 사용하기 위한 프로세서
6. annotationProcessor
= 컴파일 중 사용되는 주석 프로세서로 lombok을 사용할 때 필수로 사용해야 한다( 사용 안하면 인식을 못함)
당연히 이것 외에도 다양한 속성을 가진 플러그인이 있으니 필요에 의해서 찾아서 사용해야 한다.
https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_plugin_and_dependency_management
<<추가 설명 >>
Q : 런타임(runtime)은 뭐고, 컴파일(compile)은 뭐지?
A : 런타임은 컴파일 과정을 끝낸 프로그램이 사용자가 실행할 때
컴파일은 각종 언어로 작성된 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스
(사람이 이해하는 언어를 기계어로 변환하는 과정으로 컴파일 타임이라고 생각하면 편함.)
이때 발생할 수 있는 런타임 에러와 컴파일 에러가 있다
- 런타임 에러는 프로그램이 실행중인데도 어떠한 예외상황으로 인해 실행 중 발생하는 오류의 형태
(메모리 부족, Null 참조 오류, 0 나누기 오류)
- 컴파일 에러는 컴파일 과정 중 발생하는 오류들을 의미
(문법 오류, Type check 오류, 파일 및 문법 참조 과정에서 발생하는 오류)
이것들 외에도 Gradle 관련 내용을 보고싶다면 공식 문서를 참고하는 것이 가장 좋을듯하다.(어렵네..)
'스프링 > 백엔드' 카테고리의 다른 글
Repository와 Service (0) | 2022.06.12 |
---|---|
로깅 간단히 알아보기 (0) | 2022.05.18 |
REST API 기초와 사용법 (2022.12.08 추가) (0) | 2022.03.28 |
스프링 부트의 테스트 코드(부제 : JUnit), 책: 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (0) | 2022.02.10 |
Compile과 implementation의 차이점 (0) | 2022.01.30 |