Spring Boot 프로젝트 구조

naeganugu·2024년 6월 13일
1

스프링 마스터🌱

목록 보기
20/21

Spring Boot 공부하기 전에 프로젝트 구조가 어떻게 되는지 살펴보려고 한다!

여기서 프로젝트 구조라는 건 파일 구조를 어떻게 가져갈지 이런 것들을 이야기 하는 것이 아니라, 진짜 https://start.spring.io/ 로 프로젝트를 만들었을 때 생기는 파일들은 뭐고 이런 내용을 말한다.

Gradle은 뭐고.. 파일은 또 너무 많고 해서 복잡해서 한번 정리해야겠다고 생각했다.

Spring Boot 프로젝트의 다양한 옵션들

처음 프로젝트를 만들 때 선택할 수 있는 옵션들은 다음과 같다.

  • Project
    • Gradle - Groovy
    • Gradle - Kotlin
    • Maven
  • Language
    • Java
    • Kotlin
    • Groovy
  • Spring Boot
    • 3.3.1(SNAPSHOT)
    • 3.3.0
    • 3.2.7(SNAPSHOT)
    • 3.2.6
  • Project Metadata
    • Group
    • Artifact
    • Name
    • Description
    • Package name
    • Packaging
      • Jar
      • War
    • Java
      • 22
      • 21
      • 17

Gradle VS Maven

일단 둘 다 모두 빌드 관리 도구

💡 Build란?
소스코드 파일을 컴퓨터에서 실행할 수 있는 독립적인 형태로 변환하는 것

컴파일 + 링크 단계를 말한다. 소스코드를 컴파일 해서 Java의 경우 .class 파일로 변환한다.
.class 파일은 컴파일러에 의해 만들어진 java bytecode로 구성된 파일이다. JVM이 실행할 수 있는 형태.
JVM은 이 java bytecode를 인터프리터 방식으로 한 줄 씩 기계어로 번역하며 프로그램을 실행한다.

즉, 다시 말해 build는 컴파일 → 링크 → 패키징 → 테스트 단계로 이루어진다. 그 결과물로는 소스코드를 실행할 수 있는 독립적인 산출물이 나온다.

자바에서는 build 산출물이 다음과 같은 종류를 지닌다.

  • JAR(Java Archive) : 자바에서 사용되는 압축 양식, 클래스+리소스 파일로 구성
  • WAR(Web Archive) : 웹 어플리케이션을 압축하고 배포하는데 사용되는 파일 형태. JAR에 비해 Java 서블릿, XML 파일, 정적 파일 등 필요한 자원이 더 많다.

이렇게 빌드를 할 때, 여러 외부 라이브러리를 사용하는데 이런 거를 사용자가 일일이 관리할 필요 없이, 자동으로 필요한 라이브러리들을 관리해주는 게 빌드 도구 라고 한다.

  • 전처리
  • 컴파일
  • 패키징
  • 테스트
  • 배포

이런 빌드 관련 다양한 작업을 수행하고 라이브러리는 자동으로 관리해주어, 빌드를 도와주는 게 빌드 관리 도구

이런 빌드 관리 도구의 종류에 Ant, Maven, Gradle 등이 있다.

  • Ant
    • Maven 방식에 비해 자유도가 높은 편
  • Maven
    • 정해진 라이프 사이클이 있고 그에 따라 작업을 수행함
    • 전반적인 프로젝트 관리 기능이 있다. Build + Project Management
    • 라이브러리를 pom.xml 에 정의한다.
      • pom은Project Object Model
  • Gradle
    • Ant Builder와 Groovy script를 기반으로 구축되어, 기존 Ant 역할과 기능 사용 가능 → 호환
    • Maven을 완전 지원하기에, Maven을 대체할 수 있다.
    • 가독성이 좋다
      • 코딩에 의한 간결한 정의가 가능하기 때문
    • 재사용에 용이하다
      • Configuration Injection(설정 주입)을 사용하기 때문에 재사용에 용이하다.
    • 편리하게 실행 가능하다
      • Gradle로 빌드하기 위해 실행 환경에 직접 설치할 필요가 없이 Gradle wrapper 로 빌드를 할 수 있다.

Gradle 공식 문서에서 제공하는 둘의 비교

Gradle | Gradle vs Maven Comparison

요약을 해보자면

호환성이 좋아서 다른 생태계와 확장에 유리하고, build 시 변경된 파일만 처리하거나 동일한 부분 재사용 등으로 성능을 올리고, CLI를 통해서 더 좋은 user experience를 제공하고 등등.. 좋은 점이 많다고 한다. 아무래도 Gradle 공식 문서니..

아예 성능을 비교해놓은 것도 있다.

Gradle이 Maven 보다 최대 100배 빠르다고 한다.

Gradle | Gradle vs Maven: Performance Comparison

Groovy

Java를 발전시킨 객체지향 프로그래밍 언어로, Java에 Python이나 루비 등 다른 언어의 특징을 더한 동적 객체 지향 프로그래밍 언어. JVM에서 실행되는 스크립트 언어.

JVM 위에서 동작하지만 소스코드를 컴파일할 필요가 없다. Java와 호환되어 Java class file을 Groovy class로도 사용 가능하다.

Java 문법과 유사해서 빌드 처리를 관리할 수 있다.

Gradle로 생성한 프로젝트 구조

.
├── HELP.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── demo
    │   │               └── DemoApplication.java
    │   └── resources
    │       └── application.properties
    └── test
        └── java
            └── com
                └── example
                    └── demo
                        └── DemoApplicationTests.java

15 directories, 10 files

start.spring.io로 프로젝트를 만들고 구조를 찍어보면 이렇게 나온다. 하나씩 알아보자.

1. build.gradle

프로젝트 빌드 정보 및 구성을 표현하는 스크립트

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

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

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • compileOnly
    • for dependencies that are necessary to compile your production code but shouldn’t be part of the runtime classpath
    • 컴파일 시점에 꼭 필요한 라이브러리
    • 예를 들어 Lombok
    • 컴파일 시에만 빌드하고 빌드 결과물에는 포함하지 않는다.
  • implementation (supersedes compile)
    • used for compilation and runtime
  • runtimeOnly (supersedes runtime)
    • only used at runtime, not for compilation
    • 컴파일 시점에는 필요 없지만 런타임 시점에 필요한 라이브러리
    • 예를 들어 Logging 관련 라이브러리, DB 관련 라이브러리
  • testCompileOnly
    • same as compileOnly except it’s for the tests
  • testImplementation
    • test equivalent of implementation
  • testRuntimeOnly
    • test equivalent of runtimeOnly

2. gradle

  • gradle-wrapper.jar
    • Gradle 배포판을 다운로드하기 위한 코드를 포함하는 Wrapper JAR 파일
  • gradle-wrapper.properties
    • Wrapper 런타임 동작을 구성하는 속성 파일

3. gradlew / gradlew.bat

  • gradle wrapper의 약자
  • gradle의 선언된 버전을 호출해서 필요한 경우 미리 다운로드 하는 스크립트 ⇒ 빠르게 Gradle 프로젝트를 호출할 수 있다.
  • Gradle을 각 개발자나 CI 서버에 깔지 않고, 프로젝트에 함께 포함시켜 배포할 수 있는 방법을 제공해준다.
  • gradle wrapper를 활용해서 gradle 빌드를 하면, 수동 설치 프로세스를 따르지 않고도 gradle 프로젝트를 빠르게 시작하고 실행할 수 있다.
  • 이미 존재하는 프로젝트를 새로운 환경에서도 바로 빌드할 수 있다. ⇒ 환경에 종속되지 않는다. Java나 gradle도 설치할 필요가 없다.

gradle build 를 써서 빌드하면 컴퓨터에 설치된 gradle과 java를 기준으로 build 된다.

./gradlew build 를 실행하면 build.gradle 파일에 정의된 내용을 기준으로 build 된다.

4. settings.gradle

rootProject.name = 'demo'
  • root 프로젝트 이름
  • 멀티 프로젝트 구성할 수 있다.
    • 서브 프로젝트를 추가하고, build.gradle에 스코프 만들어서 의존성 주입해주면 된다.
  1. src
  • SourceSet
    • gradle로 프로젝트를 생성했을 때 src 구조이다.
    • main은 jar 파일로 만들어지는 코드들이다.
    • test는 테스트를 위한 소스코드로, Junit으로 실행된다.

https://docs.gradle.org/current/userguide/gradle_wrapper.html

https://docs.gradle.org/current/userguide/building_java_projects.html

https://docs.gradle.org/current/samples/sample_building_java_applications.html

profile
seungseung-zanggu

1개의 댓글

comment-user-thumbnail
2024년 12월 3일

와 정리 너무 잘해두셨어요 .. ㅠㅠ 이런 기본기가 중요하드라구요 ㅠ...

답글 달기

관련 채용 정보