스프링 부트의 각 릴리즈 들은 지원하는 의존성 리스트를 선별해서 제공한다. 이런 의존성들은 전부 스프링 부트가 관리하기 때문에 실제로 빌드 설정에 직접 버전을 지정하지 않아도 된다. 스프링 부트의 자체 버전을 올리면 이 의존성들도 그에 따라 버전이 올라간다.
스타터는 애플리케이션에 포함시킬 수 있는 간편한 의존성 디스크립터셋이다. 샘플 코드를 일일이 물색하고 의존성 디스크립터를 잔뜩 복붙할 필요없이 필요한 스프링과 관련 기술을 모두 한 번에 가져올 수 있다. 예를 들어서 데이터베이스 접근을 위해 스프링과 JPA를 사용하고 싶다면 프로젝트에 spring-boot-starter-data-jpa
의존성을 넣으면 된다.
스타터는 프로젝트를 재빠르게 시작, 실행하는 데 필요한 여러 가지 의존성을 가지고 있다.
스프링 부트가 제공하는 스타터들 목록과 기능은 다음과 같다.
spring-boot-starter
: 기본 스타터로 스프링 애플리케이션에 필요한 기본적인 설정과 의존성을 제공한다.spring-boot-starter-web
: 웹 애플리케이션 개발을 위한 스타터로, 내장 톰캣, 스프링 MVC, RESTful 서비스 등을 포함한다.spring-boot-starter-data-jpa
: JPA(Java Persistence API)를 사용한 데이터베이스 접근을 위한 스타터로, Hibernate와 스프링 데이터 JPA를 포함한다.spring-boot-starter-security
: 스프링 시큐리티를 사용한 애플리케이션 보안을 위한 스타터.spring-boot-starter-thymeleaf
: Thymeleaf 템플릿 엔진을 사용한 웹 애플리케이션 개발을 위한 스타터.spring-boot-starter-test
: 스프링 부트 애플리케이션 테스트를 위한 스타터로, JUnit, Hamcrest, Mockito 등의 테스트 라이브러리를 포함한다.spring-boot-starter-actuator
: 애플리케이션 모니터링 및 관리 도구를 제공하는 스타터로, 다양한 엔드포인트를 통해 애플리케이션 상태를 확인할 수 있다.spring-boot-starter-logging
: 로깅을 위한 스타터로, 기본적으로 Logback을 사용하며, SLF4J를 통한 통합 로깅을 지원한다.spring-boot-starter-batch
: 스프링 배치 기능을 사용한 대용량 배치 처리를 위한 스타터.spring-boot-starter-cache
: 스프링의 캐시 추상화를 사용한 캐시 기능을 제공하는 스타터.spring-boot-starter-mail
: 자바 메일 송신을 위한 스타터로, Spring Framework의 JavaMailSender를 포함한다.spring-boot-starter-validation
: Bean Validation을 사용한 입력 값 검증을 위한 스타터.spring-boot-starter-aop
: 스프링 AOP(Aspect-Oriented Programming)를 사용한 관점 지향 프로그래밍을 위한 스타터.spring-boot-starter-integration
: 스프링 통합 기능을 사용한 메시징 기반 통합 패턴을 구현하기 위한 스타터.spring-boot-starter-amqp
: AMQP를 사용한 메시징 애플리케이션 개발을 위한 스타터.spring-boot-starter-data-redis
: Redis를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-mongodb
: MongoDB를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-cassandra
: Cassandra를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-elasticsearch
: Elasticsearch를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-solr
: Solr를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-ldap
: LDAP을 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-r2dbc
: R2DBC를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-jdbc
: JDBC를 사용한 데이터 저장소 접근을 위한 스타터.spring-boot-starter-data-jest
: Jest 클라이언트를 사용한 Elasticsearch 접근을 위한 스타터.spring-boot-starter-groovy-templates
: Groovy 템플릿 엔진을 사용한 웹 애플리케이션 개발을 위한 스타터.spring-boot-starter-freemarker
: Freemarker 템플릿 엔진을 사용한 웹 애플리케이션 개발을 위한 스타터.spring-boot-starter-mustache
: Mustache 템플릿 엔진을 사용한 웹 애플리케이션 개발을 위한 스타터.spring-boot-starter-jdbc
: JDBC를 사용한 데이터베이스 접근을 위한 스타터.spring-boot-starter-jersey
: Jersey를 사용한 RESTful 웹 서비스 개발을 위한 스타터.spring-boot-starter-quartz
: Quartz 스케줄링을 위한 스타터.spring-boot-starter-undertow
: Undertow 서블릿 컨테이너를 사용한 웹 애플리케이션 개발을 위한 스타터.spring-boot-starter-webflux
: 리액티브 웹 애플리케이션 개발을 위한 스타터.spring-boot-starter-websocket
: 웹소켓을 사용한 실시간 애플리케이션 개발을 위한 스타터.spring-boot-starter-jetty
: Jetty 서블릿 컨테이너를 사용한 웹 애플리케이션 개발을 위한 스타터.일반적으로 메인 애플리케이션 클래스는 다른 클래스들을 아우르는 루트 패키지에 배치하는 것을 권장한다. @SpringBootApplication
어노테이션은 보통 메인 클래스에 두며 특정 항목들을 찾기 위한 기본 “검색 패키지”를 암시하게 된다.
다음은 전형적인 레이아웃 예시다.
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
MyApplication.java
파일에선 다음과 같이 기본적인 @SpringBootApplication
과 함께 main 메소드를 선언한다.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
스프링 부트 메이븐 플러그인이나 그래들 플러그인을 사용해서 실행 가능한 jar를 만든다면 다음 예제와 같이 java –jar
를 사용해 애플리케이션을 실행할 수 있다.
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
스프링 부트에서 지원하는 라이브러리 중에는 성능을 위해 캐시를 사용하는 라이브러리가 몇 개 있다. 예를 들어 템플릿 엔진은 템플릿 파일을 반복해서 파싱하지 않도록 컴파일한 템플릿을 캐시에 저장한다.
캐시는 프로덕션 환경에선 매우 유용하지만 개발중에는 방금 변경한 내용을 확인할 수 없어서 오히려 역효과를 가져온다. 이러한 이유로 spring-boot-devtools
는 디폴트로 캐시 옵션을 비활성화한다. 프로퍼티 기본값을 적용하고 싶지 않다면 application.properties
에서 spring.devtools.add-properties
를 false
로 설정하면 된다.
spring-boot-devtools
를 사용하는 애플리케이션은 클래스패스에 있는 파일이 변경될 때마다 자동으로 재시작된다. 코드 변경에 대한 피드백 루프를 매우 빠르게 제공하기 때문에 IDE에서 작업할 때 매우 유용할 것이다. intelliJ 에선 프로젝트 빌드가 동일한 효과를 가진다.