Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Chore] 프로젝트 초기 설정 #2

Merged
merged 4 commits into from
Nov 25, 2024
Merged

[Chore] 프로젝트 초기 설정 #2

merged 4 commits into from
Nov 25, 2024

Conversation

uijin31
Copy link
Collaborator

@uijin31 uijin31 commented Nov 21, 2024

🔗 관련 이슈

#1

👩🏻‍💻 구현 내용

1️⃣ 예약 기능을 위한 API 스펙 작성

2️⃣ 프로젝트 초기 설정 진행

  • PR 템플릿 추가
  • gitignore 파일 추가
  • spring boot 애플리케이션 생성
  • 멀티 모듈 설정

.gitignore

버전 관리에서 제외할 파일을 설정하기 위한 파일
macOS, IntelliJ, Gradle, Java 등에 의존적인 파일은 제외 (참고. https://www.toptal.com/developers/gitignore)

gradle/wrapper/gradle-wrapper.jar

Gradle Wrapper 코드를 포함하는 jar 파일

gradle/wrapper/gradle-wrapper.properties

Gradle Wrapper의 속성 설정 파일

🐘 Gradle?
빌드 스크립트를 기반으로 소프트웨어의 빌드, 테스트, 배포를 자동화하는 도구입니다. 여기서 빌드란 소스 코드로부터 배포 가능한 결과물(ex. 실행 가능한 파일, 라이브러리)를 만드는 과정입니다.
Gradle은 프로젝트에 필요한 외부 리소스를 선언하고 해결하기 위한 자동화된 기술(의존성 관리)를 제공해 주며, 플러그인을 통해 다양한 빌드 작업(테스크)를 수행하면서 빌드를 진행합니다.

gradlew

Gradle을 호출할 수 있는 Wrapper 스크립트

$ gradlew build     // Linux or OSX

gradlew.bat

Gradle을 호출할 수 있는 Wrapper 스크립트

$ gradlew.bat build  // Windows

nowait-api/build.gradle

빌드 설정, Task(테스크), 플러그인들을 자세하게 설명하는 빌드 스크립트
✔️ 자세한 내용은 Comment 참고!

settings.gradle

Gradle 프로젝트의 entry point이며, 주로 서브 프로젝트를 추가하기 위해 사용

  • 싱글 프로젝트에서는 옵션이지만, 멀티 프로젝트에서는 필수!
  • 현재, nowait 루트 프로젝트 1개, nowait-api 서브 프로젝트 1개로 구성

💡 settings.gradle에 있는 모든 항목은 Gradle API의 Settings 객체에서 메서드를 호출하는 것

💬 PR 포인트 & 궁금한 점

  • PR에 어느정도로 내용을 담아야할지.. 고민이 되네요!😂 Gradle이 생각보다 내용이 많아서 어디를 중점으로 보는게 좋을까요..? (현재 공식 사이트에서 핵심 개념 + a 를 보긴했습니다!)

@uijin31 uijin31 added the ⚙ setting Extra attention is needed label Nov 21, 2024
@uijin31 uijin31 requested a review from f-lab-lyan November 21, 2024 08:22
@uijin31 uijin31 self-assigned this Nov 21, 2024
Copy link
Collaborator Author

@uijin31 uijin31 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gradle 관련 설명 추가

Comment on lines +1 to +5
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✔️ 플러그인 적용

  • java 플러그인
    : 코어 플러그인(Gradle 개발자가 관리하는 플러그인) 중 하나로 자바 라이브러리를 정의하고 빌드하는 데 사용되는 플러그인입니다. java 플러그인이 제공해 주는 테스크에는 compileJava, javadoc, jar 가 있습니다.
  • org.springframework.boot, io.spring.dependency-management 플러그인
    : Community 플러그인(Gradle 커뮤니티에서 공유되는 플러그인)입니다. 두 플러그인 모두 Spring Boot 프로젝트에서 필수적으로 사용되는 플러그인입니다.
    : org.springframework.boot 플러그인은 bootJar, bootRun 테스크를 제공하며, Spring Boot 애플리케이션을 쉽게 실행하거나 배포할 수 있도록 도와줍니다.
    : io.spring.dependency-management 플러그인은 Spring 애플리케이션의 의존성 관리를 도와줍니다.

Comment on lines +16 to +18
repositories {
mavenCentral()
}
Copy link
Collaborator Author

@uijin31 uijin31 Nov 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✔️ 외부 의존성을 가져오기 위한 위치(Repository) 설정

Comment on lines +10 to +14
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Copy link
Collaborator Author

@uijin31 uijin31 Nov 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✔️ java 플러그인을 위한 속성 설정 추가

  • 자바 버전은 17을 사용

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 자바 버전을 명시적으로 지정
  • 만약 지정된 Java 버전이 로컬에 설치되어 있지 않으면, Gradle이 자동으로 해당 버전을 다운로드

Comment on lines +20 to +24
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✔️ 해당 프로젝트(nowait-api)에서 의존하는 외부 리소스 정의

  • implementation: 프로덕션 코드를 컴파일 + 실행하기 위한 의존성
  • testImplementation: 테스트 코드를 컴파일 + 실행하기 위한 의존성
  • testRuntimeOnly : 테스트 코드를 실행하기 위한 의존성

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이러한 의존성에 버전을 명시하지 않아도 되는 이유는 'io.spring.dependency-management' 플러그인 덕분!
플러그인을 통해 Gradle이 알아서 스프링 부트 버전에 맞춰 적합한 버전의 의존성을 주입한다. (링크)

@@ -0,0 +1,3 @@
rootProject.name = 'nowait'

include 'nowait-api'
Copy link
Collaborator Author

@uijin31 uijin31 Nov 21, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✔️ 루트 프로젝트 네임 설정 (없으면, 루트 디렉토리명으로 설정)
✔️ 서브 프로젝트 설정 (루트 프로젝트에 'nowait-api' 프로젝트를 추가하는 Settings 메서드 실행)

@uijin31 uijin31 changed the title Chore/#1 setup [Chore] 프로젝트 초기 설정 Nov 21, 2024
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

필요한 내용만 남기고 정리하시면 좋을 것 같습니다.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -0,0 +1,3 @@
rootProject.name = 'nowait'

include 'nowait-api'
Copy link
Collaborator

@f-lab-lyan f-lab-lyan Nov 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
include 'nowait-api'
include ':nowait-api'

하위 디렉토리가 어디까지를 의미하는 것인지 확인해보면 좋을 것 같네요.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 루트 디렉토리의 바로 아래만 인식합니다! 그래서 멀티 레벨에서는 ":nowait:api"와 같이 명시적으로 지정해야 합니다!
  • :은 경로 구분자로 /와 비슷

@@ -0,0 +1,28 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

루트와 모듈의 버전이 다른 경우에는 어떻게 될까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

서브 모듈 버전이 우선시 됩니다.
Gradle은 각 프로젝트의 plugins 블록에서 명시한 플러그인 버전을 개별적으로 로드하고, 이때 루트 프로젝트에서 명시한 플러그인 버전이 기본 값이 됩니다. 그리고 하위 프로젝트에서 버전을 다시 지정하면 하위 프로젝트 버전이 적용됩니다!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네, 그렇게 만들어야 하위 프로젝트에서 다른 버전을 쓸 수 있게되겠죠. :-)

plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
id 'io.spring.dependency-management' version '1.1.6'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

}

tasks.named('test') {
useJUnitPlatform()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 왜 필요한가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gradle의 기본 테스트 실행 환경이 JUnit 4이기 때문에, JUnit 5로 테스트를 실행하려면 명시적으로 useJUnitPlatform()를 설정해야 합니다!

Copy link
Collaborator

@f-lab-lyan f-lab-lyan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수고하셨습니다.

Copy link
Collaborator Author

@uijin31 uijin31 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코멘트 답변 완료 🤓

Comment on lines +2 to +4
<!--이슈 태스크를 모두 완료하고 닫는다면 Resolves #번호-->
<!--이슈 태스크를 모두 완료하지는 못 했지만 닫는다면 Closes #번호-->
<!--이슈 태스크를 일부 완료하고 열어둔다면 Fixes #번호-->
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gradle 배포 파일을 다운로드할 URL 지정

@@ -0,0 +1,28 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.5'
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

서브 모듈 버전이 우선시 됩니다.
Gradle은 각 프로젝트의 plugins 블록에서 명시한 플러그인 버전을 개별적으로 로드하고, 이때 루트 프로젝트에서 명시한 플러그인 버전이 기본 값이 됩니다. 그리고 하위 프로젝트에서 버전을 다시 지정하면 하위 프로젝트 버전이 적용됩니다!

Comment on lines +20 to +24
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이러한 의존성에 버전을 명시하지 않아도 되는 이유는 'io.spring.dependency-management' 플러그인 덕분!
플러그인을 통해 Gradle이 알아서 스프링 부트 버전에 맞춰 적합한 버전의 의존성을 주입한다. (링크)

Comment on lines +10 to +14
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 자바 버전을 명시적으로 지정
  • 만약 지정된 Java 버전이 로컬에 설치되어 있지 않으면, Gradle이 자동으로 해당 버전을 다운로드

}

tasks.named('test') {
useJUnitPlatform()
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gradle의 기본 테스트 실행 환경이 JUnit 4이기 때문에, JUnit 5로 테스트를 실행하려면 명시적으로 useJUnitPlatform()를 설정해야 합니다!

@@ -0,0 +1,3 @@
rootProject.name = 'nowait'

include 'nowait-api'
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • 루트 디렉토리의 바로 아래만 인식합니다! 그래서 멀티 레벨에서는 ":nowait:api"와 같이 명시적으로 지정해야 합니다!
  • :은 경로 구분자로 /와 비슷

@uijin31 uijin31 merged commit fb8b6a6 into main Nov 25, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
⚙ setting Extra attention is needed
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants