1. Spring Boot Starter
Spring Boot Starter는 미리 정의된 의존성 세트로, 애플리케이션에서 특정 기능을 구현하는 데 필요한 라이브러리들을 자동으로 포함시켜주는 역할을 합니다. 각 Starter는 특정한 기능이나 기술 스택을 지원하는데 필요한 필수 의존성들을 하나의 묶음으로 제공합니다.
역할과 기능:
- 의존성 관리: Spring Boot Starter는 여러 라이브러리를 하나하나 수동으로 추가할 필요 없이, 필요한 기능에 맞는 의존성을 자동으로 포함시켜 줍니다. 예를 들어, spring-boot-starter-web을 추가하면 웹 애플리케이션 개발에 필요한 Spring MVC, Tomcat(내장 서버), Jackson 등의 라이브러리를 자동으로 포함합니다.
- 버전 호환성: Starter는 각 의존성의 버전 호환성을 자동으로 관리합니다. Spring Boot 프로젝트는 Starter에 포함된 모든 라이브러리가 서로 호환되도록 최적의 버전 조합을 제공하므로, 개발자가 일일이 호환성을 검증할 필요가 없습니다.
대표적인 Starter 예시:
- spring-boot-starter-web: 웹 애플리케이션 개발을 위한 기본적인 의존성(Jackson, Spring MVC, 내장 Tomcat 등).
- spring-boot-starter-data-jpa: JPA와 관계형 데이터베이스 연동을 위한 의존성(Hibernate, H2, Spring Data JPA 등).
- spring-boot-starter-security: Spring Security 기능을 추가하기 위한 의존성.
- spring-boot-starter-test: JUnit, Mockito, Spring Test 등을 포함한 테스트 환경 설정.
장점:
- 빠른 개발 시작: Starter를 사용하면 개발자가 일일이 라이브러리와 그 버전을 지정할 필요가 없으므로, 프로젝트 초기 설정이 매우 간단해집니다.
- 모듈화: 기능별로 필요한 라이브러리들을 묶어 제공하므로, 불필요한 의존성 추가를 피하고 필요한 것만 선택적으로 사용할 수 있습니다.
2. Spring Boot Autoconfiguration
Spring Boot의 Autoconfiguration(자동 설정)은 개발자가 복잡한 설정 파일을 작성하지 않더라도, 애플리케이션이 필요한 기본 설정을 자동으로 감지하고 적용해주는 기능입니다. 이를 통해 Spring Boot는 애플리케이션이 실행될 때 적절한 설정을 자동으로 결정하고 적용할 수 있습니다.
동작 원리:
- Spring Boot는 **클래스패스(classpath)**에 있는 라이브러리와 **현재 환경(context)**을 분석하여, 애플리케이션이 어떤 기능을 사용하고 있는지 감지합니다.
- 감지된 라이브러리에 따라 필요한 Bean들을 자동으로 생성하고, 해당 라이브러리가 정상적으로 작동할 수 있도록 필요한 기본 설정을 자동으로 구성합니다.
예시:
- 데이터베이스 연결:
- 애플리케이션이 클래스패스에 spring-boot-starter-data-jpa를 포함하고 있고, application.properties에 데이터베이스 관련 설정이 있으면, Spring Boot는 자동으로 JPA 설정을 구성하고 데이터베이스 연결에 필요한 Bean들을 생성합니다.
- 개발자가 추가로 설정을 하지 않더라도, Spring Boot는 기본적으로 Hibernate를 사용해 JPA 관련 작업을 처리할 수 있도록 자동 설정합니다.
- 웹 애플리케이션:
- spring-boot-starter-web을 사용하면 Spring Boot는 자동으로 내장 Tomcat 서버를 설정하고, Spring MVC 컨트롤러와 관련된 기본 설정을 구성합니다. 개발자는 서버 설정이나 컨트롤러 매핑에 대해 일일이 설정할 필요 없이 바로 개발에 착수할 수 있습니다.
Autoconfiguration의 구성:
- 조건부 설정(Conditional Configuration): Spring Boot는 특정 Bean이나 설정이 이미 명시적으로 정의되어 있지 않은 경우에만 자동 설정을 적용합니다. 이를 통해 개발자가 명시적으로 설정한 항목은 덮어쓰지 않고, 기본 설정만 자동으로 추가해줍니다. Spring Boot는 @Conditional 어노테이션을 통해 조건부로 Bean을 생성합니다.
- 커스터마이징 가능: Autoconfiguration은 기본 설정을 제공하지만, 개발자가 필요에 따라 이 설정을 쉽게 덮어쓰거나 확장할 수 있습니다. 예를 들어, 기본 데이터 소스 설정이 아닌 커스텀 데이터 소스를 사용하고 싶다면, 해당 설정을 application.properties 파일이나 직접적인 코드 설정으로 덮어쓸 수 있습니다.
장점:
- 복잡한 설정 작업을 자동화: 개발자가 별도로 설정을 하지 않아도 기본적으로 동작하는 환경을 제공하므로, 특히 초기 설정이나 복잡한 설정에 소요되는 시간을 대폭 줄일 수 있습니다.
- 유연한 설정: 기본 설정을 자동으로 제공하면서도, 필요할 경우 개발자가 원하는 설정을 손쉽게 적용할 수 있는 유연성을 제공합니다.
- 빠른 시작: 최소한의 설정으로 바로 애플리케이션을 실행할 수 있기 때문에, 빠른 프로토타이핑이나 개발 초기에 큰 이점을 제공합니다.
3. Spring DevTools
- 자동 재시작(Automatic Restart): Spring DevTools는 클래스패스(classpath)에 있는 파일이 변경될 때 애플리케이션을 자동으로 재시작합니다. 코드 수정 후 애플리케이션을 수동으로 다시 시작하지 않아도 되며, 개발 속도를 높이는 데 매우 유용합니다.
- Spring Boot는 기본적으로 DevTools가 감시(watch)하는 파일을 클래스패스의 특정 경로에 한정짓습니다. 주로 src/main/java 또는 src/main/resources 디렉터리에 있는 파일들이 변경되면 애플리케이션이 자동으로 재시작됩니다.
- 단, 재시작은 전체 애플리케이션을 다시 로드하는 것이 아니라, 기본적으로 클래스 로더를 이용한 부분적인 재시작이 이루어지기 때문에 매우 빠르게 동작합니다.
- LiveReload: DevTools는 LiveReload 서버도 함께 실행합니다. 이를 통해, HTML이나 템플릿 파일이 변경될 때 브라우저에서 페이지가 자동으로 새로고침됩니다. 단, LiveReload는 주로 웹 애플리케이션에서 사용됩니다.
- 재시작 예외 처리: DevTools는 자주 변경되지 않는 라이브러리나 클래스를 별도의 클래스 로더로 로드하여, 재시작할 때 다시 로드되지 않도록 처리합니다. 예를 들어, Spring의 핵심 라이브러리나 서드파티 라이브러리들은 재시작 과정에서 다시 로딩되지 않아 애플리케이션 재시작 속도가 빨라집니다.
재시작 동작과 장점
- 빠른 피드백: 코드 변경 사항이 적용될 때마다 애플리케이션을 수동으로 재시작할 필요 없이 빠르게 변경 내용을 확인할 수 있습니다.
- 개발 편의성: 코드 수정 후 바로 테스트하거나 확인할 수 있어 개발 생산성이 크게 향상됩니다.
주의사항
- 프로덕션 환경에서는 DevTools가 자동 비활성화됩니다. DevTools는 개발 편의를 위한 도구이기 때문에, 실제 운영 환경에서는 적용되지 않으며 개발 환경에서만 사용할 수 있습니다.
- 리소스 관리: DevTools의 자동 재시작 기능이 유용하지만, 프로젝트가 커지고 복잡해질수록 재시작 속도는 느려질 수 있습니다. 또한 빈번한 재시작으로 인해 개발 환경에서 메모리 사용량이 증가할 수 있습니다.
-> 코드 변경 후 저장시 자동의 부분 재시작
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
이 코드를 pom.xml에 넣으면 사용 가능해 진다.