# 49.5 자신만의 스타터 생성하기 by ks

라이브러리를 위한 **풀 스프링 부트 스타터**는 다음과 같은 구성 요소를 포함 할 수 있다 :

1. 자동 구성 코드를 포함하는 **autoconfigure** 모듈.
2. 일반적으로 유용한 추가 의존성과 라이브러리 뿐만 아니라 **autoconfigure** 에 의존성을 제공하는 **Starter** 모듈. 요컨대, 스타터를 추가하면 해당 라이브러리를 사용하는 데 필요한 모든 것을 제공해야한다.

> 자동 구성 코드와 종속성 관리를 분리 할 필요가 없는 경우 단일 모듈에 자동 구성 코드와 종속성 관리를 결합 할 수 있다.

### 49.5.1 이름짓기

스타터에 적절한 네임 스페이스를 제공해야한다. spring-boot와 다른 Maven **groupId** 를 사용하더라도, **spring-boot 이름으로 모듈을 시작하지 마십시오.** 앞으로 자동 구성되는 것에 대한 공식적인 지원을 제공 할 수 있다.

경험상, 스타터 후에 결합 된 모듈의 이름을 지정해야한다. 예를 들어, "acme"에 대한 스타터를 만들고 자동 구성 모듈 **acme-spring-boot-autoconfigure**과 스타터 **acme-spring-boot-starter** 이름을 지정한다고 가정한다. 두 모듈을 결합한 모듈이 하나뿐이라면 이름을 **acme-spring-boot-starter** 로 지정하십시오.

또한 스타터가 구성 키를 제공하면, 고유한 네임 스페이스를 사용하십시오. 특히, Spring Boot가 사용하는 네임 스페이스에 키를 (예 : server, management, spring, 등을 포함하지 않는다.) 포함하지 마십시오. 동일한 네임 스페이스를 사용하는 경우 모듈을 손상시키는 방식으로 향후 이러한 네임 스페이스를 수정할 수 있다.

{% hint style="info" %}
구성 키 (configuration key)는 configuration 할 때 사용되는 key들 (프로퍼티에서 스캔하는 키를 의미하는것같아. 검색하면 자세한 내용은 안나오지만 아래 문맥을 유추해보면..) 은 스프링 부트가 사용하는 키들을 사용하면 안되고(중복되니까!) 문서화할 것!
{% endhint %}

메타 데이터 생성을 트리거 하여 IDE 보조 기능을 키에 사용할 수 있도록하십시오. 생성된 메타 데이터 ( META-INF/spring-configuration-metadata.json) 를 검토 하여 키가 제대로 문서화되었는지 확인하십시오.

### 49.5.2 **autoconfigure** 모듈

**autoconfigure** 모듈에는 라이브러리를 시작하는 데 필요한 모든 것이 들어 있다. 또한 구성 키 정의 (가령 **@ConfigurationProperties**) 및 구성 요소 초기화 방법을 사용자 정의하는 데 사용할 수있는 모든 콜백 인터페이스를 포함 할 수 있다.

> **autoconfigure** 모듈을 프로젝트에 보다 쉽게 포함시킬 수 있도록 선택적으로 라이브러리에 대한 dependencies를 표시해야한다. 그렇게하면 라이브러리가 제공되지 않아도, 기본적으로 스프링 부트가 시작된다.

스프링 부트는 **annotation 프로세서**를 사용하여 메타 데이터 파일 ( META-INF/spring-autoconfigure-metadata.properties)의 자동 구성 조건을 수집한다. 해당 파일이 있으면, 일치하지 않는 자동 구성을 열심히 필터링하여 시작 시간을 향상시킨다. **자동 구성이 포함 된 모듈에 다음 종속성을 추가하는 것이 좋다.**

```


   org.springframework.boot
   spring-boot-autoconfigure-processor
   true

```

Gradle 4.5 이하 compileOnly 에서는 다음 예와 같이 구성 에서 종속성을 선언해야한다.

```

dependencies {
   compileOnly "org.springframework.boot:spring-boot-autoconfigure-processor"
}
```

Gradle 4.6 이상 annotationProcessor 에서는 다음 예와 같이 구성 에서 종속성을 선언해야한다.

```

dependencies {
   annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor"
}
```

### 49.5.3 스타터 모듈

스타터는 실제로 빈 jar이다. **유일한 목적은 라이브러리와 작업하기 위해 필요한 종속성을 제공하는 것**이다. **시작하는 데 필요한 것**을 보는거라고 생각하면 된다.

스타터가 추가된 프로젝트에 대해 가정하지 마십시오. **일반적으로 자동 구성중인 라이브러리에 다른 시작 프로그램이 필요하면 이를 언급하십시오.** 선택적 dependencies의 수가 높으면 기본 dependency의 적절한 세트를 제공하는 것이 어려울 수 있다. 이는 **라이브러리의 일반적인 사용에 불필요한 dependency를 포함하지 않아야하기 때문이다**. 즉, 선택적 종속성을 포함하면 안된다.

> **어느 쪽이든, 스타터는 핵심 Spring Boot 스타터 ( spring-boot-starter)를 직접 또는 간접적으로 참조**해야한다 (즉, 스타터가 다른 스타터에 의존 할 경우 추가 할 필요가 없음). 커스텀 스타터만으로 프로젝트를 만들면 코어 스타터의 존재로 Spring Boot의 핵심 기능을 사용할 수 있습니다.
