## 프로젝트 생성
![[Pasted image 20231212002041.png]]
- [여기](https://start.spring.io/)에서 스프링 부트 프로젝트를 생성한다. 리눅스나 맥의 경우, 패키지 관리 프로그램을 통해 CLI로 프로젝트를 생성할 수 있지만, 우리의 윈도우는 SDKMAN을 깔아야 가능하다. 그러니 그냥 웹 사이트에서 생성하는 걸 추천한다.
- **프로젝트 빌드 도구**와 **언어**, **스프링 부트 버전**은 필요에 따라 설정하면 된다. 나는 평소에 자주 쓰는 데로 설정했다.
- **프로젝트 메타 데이터**는 작성 요령에 따라 작성한다.
- **그룹**은 프로젝트를 진행하는 팀의 이름을 뜻한다. 작성 요령은 팀 대표 웹 페이지의 도메인을 최상위부터 최하위까지 순서대로 적는 것이다. 예를 들어 그룹의 대표 웹 페이지가 깃허브 페이지 `github.ABC.io`라면 그룹은 `io.github.ABC`로 작성한다. 예시 프로젝트인 ChatGPT 프록시 서버는 gitlab의 red 프로젝트에 포함되기에 나는 `io.gitlab.red`으로 적었다.
- **아티팩트**는 해당 프로젝트의 이름이라고 생각하면 된다. 작성 요령은 이름만 봐도 무슨 내용인지 알 수 있도록 명확하게 적는 것이다. 예시 프로젝트는 ChatGPT 프록시 서버이니 나는 `chatgpt-proxy-server`라고 작성했다.
- 나는 `build.gradle`에 직접 의존성 설정을 추가하는 것을 선호하므로 의존성 설정은 따로 추가하지 않았다. gradle이 익숙하지 않다면 오른쪽에 있는 dependencies를 클릭하여 의존성 설정을 해도 상관없다.
- 설정이 끝났다면, **GENERATE** 버튼을 클릭한다.
## Gradle 설정 🐘
### 플러그인
```groovy
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.7-SNAPSHOT'
id 'io.spring.dependency-management' version '1.1.4'
id 'org.hibernate.orm' version '6.2.13.Final'
id 'org.graalvm.buildtools.native' version '0.9.28'
}
```
- `org.hibernate.orm` 는 JPA 구현체인 hibernate를 사용하기 위한 플러그인이다.
### 의존성
```groovy
dependencies {
// 스프링 부트 스타터
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-hateoas'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// 스프링(or 스프링 부트) 라이브러리
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
// 기타 라이브러리
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.freemarker:freemarker:2.3.32'
}
```
- 의존성 설정은 **스프링 부트 스타터**와 **스프링(부트) 라이브러리**, 그리고 **기타 라이브러리**로 분류했다.
- 스프링 부트를 쓰는 만큼 스프링 부트 스타터를 중심으로 의존성 설정을 한다.
- `spring-boot-starter-webflux`은 서버에 클라이언트 추가할 때 쓰는 스타터다.
- `spring-boot-starter-hateoas`는 REST API에서 HATEOAS 맞출 때 쓰는 스타터다.
- `spring-boot-starter`는 `spring-boot-starter-web`에 포함되어 있어 삭제했다.
- `spring-boot-starter-actuator`는 애플리케이션 모니터링을 할 때 쓰는 스타터다.
- 위 스타터에 포함된 라이브러리는 [[B. Spring Boot 스타터와 의존성 지옥#주요 스타터와 포함된 라이브러리|여기]]에서 볼 수 있다.
- 스타터에 포함되지 않은 기타 스프링(부트) 라이브러리를 추가한다.
- 기타 라이브러리도 추가한다.
- `freemarker`는 Apache에서 만든 자바 기반 템플릿 엔진이다. 프롬프트 템플릿으로 프롬프트를 생성하는데 쓸 예정이다.
- `lombok`의 경우 IDE에 따라 플러그인을 따로 설치해야 할 수도 있다.
### 빌드
```groovy
// ... 생략
tasks.named('bootBuildImage') {
builder = 'paketobuildpacks/builder-jammy-base:latest'
}
bootBuildImage {
imageName = project.name
}
```
- `bootBuildImage`는 애플리케이션을 도커 이미지로 빌드해주는 명령어이다. ([참고](https://emgc.tistory.com/149))