Starter란 무엇인가?
Starter는 Spring Boot가 제공하는 의존성 묶음(Dependency Bundle)입니다.
Spring 애플리케이션을 개발할 때, 특정 기능을 추가하려면 다양한 라이브러리를 가져와야 합니다. 그런데 어떤 라이브러리를 가져와야 할지 모르거나, 각 라이브러리의 버전을 맞추는 게 매우 번거로울 수 있습니다.
Spring Boot Starter는 이 문제를 해결해줍니다. Starter는 여러 라이브러리를 하나의 패키지로 묶어 놓은 것입니다. 이를 통해 하나의 의존성만 추가하면 관련된 라이브러리들이 함께 추가됩니다.
라이브러리를 묶어서 패키지 형태로 제공한다는 것이 중요한 포인트!
(* Lombok 이나 DevTools 같은 Starter가 아닌 단순 라이브러리도 있음)
Starter의 특징
- 간편함
- 하나의 Starter를 추가하면 관련된 라이브러리들이 한 번에 가져와집니다.
- 호환성
- Spring Boot Starter는 모든 라이브러리 버전을 자동으로 맞춰줍니다.
- 일관성
- Starter 이름은 spring-boot-starter-XXX 형태로 되어 있어서 직관적입니다.
Starter의 구조
Starter는 Maven이나 Gradle과 같은 빌드 도구에서 사용하는 의존성입니다. 주로 다음과 같은 구조를 가집니다.
- spring-boot-starter-XXX 형태로 이름이 구성됩니다.
- XXX는 해당 Starter가 지원하는 기능이나 라이브러리의 이름을 나타냅니다.
예시:
Starter 이름 | 기능 |
spring-boot-starter-web | 웹 애플리케이션 개발 |
spring-boot-starter-data-jpa | 데이터베이스 JPA 지원 |
spring-boot-starter-test | 테스트 기능 제공 |
spring-boot-starter-security | 보안 기능 제공 |
Starter 추가 방법
(1) Maven 프로젝트
pom.xml 파일에 Starter 의존성을 추가합니다.
<dependencies>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(2) Gradle 프로젝트
build.gradle 파일에 의존성을 추가합니다.
dependencies {
// Spring Boot Web Starter
implementation 'org.springframework.boot:spring-boot-starter-web'
}
주요 Starter와 그 기능
Spring Boot에서 자주 사용하는 Starter는 다음과 같습니다.
Starter에는 필요에 의해 다른 Starter가 포함될 수 있습니다.
1. spring-boot-starter-web
- 기능: 웹 애플리케이션 개발용 Starter입니다. 내장된 Tomcat 서버를 사용하여 웹 서버를 쉽게 실행할 수 있습니다.
- 포함된 라이브러리:
- Spring MVC
- Tomcat
- Jackson (JSON 처리)
- spring-boot-starter, spring-boot-starter-json, spring-boot-starter-tomcat 은 spring-boot-starter-web 을 프로젝트에 추가할 때 자동으로 포함됩니다.
2. spring-boot-starter-data-jpa
- 기능: 데이터베이스와 JPA(Java Persistence API)를 쉽게 사용할 수 있도록 지원합니다.
- 포함된 라이브러리:
- Spring Data JPA
- Hibernate (JPA 구현체)
- HikariCP (DB 커넥션 풀)
3. spring-boot-starter-test
- 기능: 테스트를 위한 Starter입니다. 단위 테스트, 통합 테스트 등을 지원합니다.
- 포함된 라이브러리:
- JUnit 5
- Mockito
- Spring Test (스프링 기반 테스트)
4. spring-boot-starter-security
- 기능: 보안 기능을 제공하는 Starter입니다. 로그인, 권한 관리 등을 구현할 수 있습니다.
- 포함된 라이브러리:
- Spring Security
5. spring-boot-starter-thymeleaf
- 기능: Thymeleaf 템플릿 엔진을 사용할 수 있도록 지원합니다.
- 포함된 라이브러리:
- Thymeleaf
- Spring MVC (뷰 렌더링 지원)
의존성 관리 자동화
Spring Boot는 Starter를 통해 의존성 관리 자동화를 제공합니다. 의존성 충돌이 발생하지 않도록 모든 라이브러리의 버전을 자동으로 맞춰줍니다.
버전 관리 예시
spring-boot-starter-web을 추가하면 Spring Boot는 자동으로 다음 버전의 라이브러리를 가져옵니다:
- Spring MVC: 5.x.x
- Tomcat: 9.x.x
- Jackson: 2.x.x
개발자가 별도로 버전을 지정하지 않아도 호환성 있는 버전이 사용됩니다.
Custom Starter 만들기
Spring Boot에서는 필요에 따라 Custom Starter를 만들 수도 있습니다. 예를 들어, 특정 기능을 여러 프로젝트에서 재사용하고 싶을 때 사용합니다.
Custom Starter를 만드는 방법은 다음과 같습니다:
- 빈(Bean)과 설정 클래스를 작성합니다.
- 라이브러리 패키징(Maven/Gradle 프로젝트로 생성)
- 프로젝트에 의존성을 추가해서 재사용합니다.
결론
Spring Boot의 Starter는 복잡한 설정과 의존성 관리를 단순화하여 빠르고 효율적인 개발을 가능하게 합니다.
- Starter 이름은 spring-boot-starter-XXX 형태로 제공되며, 기능에 맞게 선택하면 됩니다.
- 개발자는 필요한 기능에 맞는 Starter 하나만 추가하면 관련된 모든 라이브러리를 사용할 수 있습니다.
Spring Boot Starter를 잘 활용하면 개발 속도를 크게 높일 수 있으며, 복잡한 설정에 시간을 낭비하지 않고 비즈니스 로직에 집중할 수 있습니다.
프로젝트 빌드(관리) 도구인 Maven, Gradle은 메이븐 중앙 레퍼지토리에서 (Maven Central Repository) 라이브러리를 다운로드를 한다. 이게 디폴트인거고, 다른 라이브러리를 필요로 한다면 다운로드하면 된다.
라이브러리 의존성관리는 Maven, Gradle 이 거의 한다고 생각하면 된다.
Docker Image 저장소처럼 생각하면 이해가 쉽겠다.
예를 들어,
Lombok 라이브러리를 추가한다고 생각해보자.
사용하고자 하는 버전을 클릭해보면,
의존성 라이브러리를 다 외울 수 없기 때문에, 저기서 검색을 해서 확인해서 복사해서 붙여넣기 해서 사용하면 된다!
실습한 프로젝트에서, pom.xml 을 확인해보면, 여러가지 starter 가 보일 것이다. lombok 도 보이고.
어쨌든, 저것들이 라이브러리 패키지라서, External Libraries에 보면 라이브러리가 엄청 많이 다운로드 되어 있는 걸 확인할 수 있을 것.
spring-boot-starter-web 을 다운로드 했는데, 거기에 포함된 여러 라이브러리가 다 다운로드가 되는 것이다.
그렇다면, 어디에 다운로드가 되어 있는 것일까? 컴퓨터 로컬 어디에?
저기 repository에, Maven 에서 다운로드 받은 라이브러리가 저기 안에 만들어진다.
기본 repository 경로가 저렇게 설정이 되는데, 경로를 바꾸고 싶으면 바꿀 수도 있다.