Spring, Spring Boot란
Spring은 엔터프라이즈급 Java 어플리케이션 개발을 위한 프레임워크이다. Spring은 의존성 주입(Dependency Injection), AOP(Aspect-Oriented Programming), MVC(Model-View-Controller) 패턴 등을 지원하여 복잡한 Java 애플리케이션을 더 쉽게 개발할 수 있게 만들어 준다.
Spring Boot는 Spring을 기반으로 한 확장 프레임워크로 Spring에 비해 복잡한 설정 없이 빠르게 어플리케이션을 개발하는 것이 가능하다. Spring Boot는 내장 서버와 자동 설정 기능을 제공하여 개발 생산성이 높은 편이다.
Spring을 기반으로 확장해서 나온 것이 Spring Boot 이므로 Spring Boot에서는 Spring의 모든 기능을 사용할 수 있다. 하지만 Spring Boot는 Spring과 달리 몇 가지 차이점을 갖고 있다.
Spring, Spring Boot의 차이점
1. 내장 서버
- Spring에는 내장 서버가 존재하지 않으나 Spring Boot에는 내장 서버(Tomcat, Jetty, Undertow, Netty) 가 존재한다.
- 기본 내장 서버는 Tomcat이다.
2. 의존성 관리
- Spring과 달리 Spring Boot는 스타터 의존성(spring-boot-starter-web, spring-boot-starter-data-jpa 등)을 제공하여 필요한 의존성을 간편하게 추가할 수 있다.
3. 특별한 어노테이션
Spring Boot에는 Spring에 없는 몇몇 특별한 어노테이션이 존재한다.
- @SpringBootApplication
Spring Boot 어플리케이션의 진입점으로 사용되는 어노테이션 - @ConditionalOn조건 (ex. @ConditionalOnJava)
특정한 조건을 만족할 때 bean으로 등록하는 어노테이션 - @SpringBootTest
통합 테스트를 실행하는 데 사용하는 어노테이션
이러한 Spring Boot의 특징 중 가장 중요한 점은 바로 자동 설정을 구현하는 @SpringBootApplication 어노테이션이다.
@SpringBootApplication 어노테이션
SpringBoot의 가장 큰 장점은 Spring과 달리 자동 설정을 지원하는 것이다. 이러한 자동 설정이 어떻게 이루어지는지 알려면 @SpringBootApplication을 확인해야 한다.
여기서 주목해야 할 부분은 @SpringBootConfiguration, @ComponentScan, @EnableAutoConfiguration 인데 각 어노테이션의 기능은 다음과 같다.
- @SpringBootConfiguration
- @Configuration 어노테이션과 동일한 역할을 함(Spring Boot의 구성 클래스임을 명시함)
- Spring Boot 어플리케이션의 메인 설정 클래스를 명시적으로 나타내기 위해 사용됨 - @ComponentScan
- 지정된 패키지와 그 하위 패키지를 탐색하여 @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 클래스를 Spring IoC 컨테이너에 bean으로 등록함 - @EnableAutoConfiguration
- 클래스패스를 기반으로 설정을 자동으로 구성하고 필요한 bean을 자동으로 등록함
@EnableAutoConfiguration 어노테이션
@EnableAutoConfiguration 어노테이션은 @Import(AutoConfigurationImportSelector.class) 어노테이션을 통해 META-INF/spring.factories 파일 내부를 읽어 자동 설정을 진행한다.
spring.factories 파일 내에는 다양한 자동 구성 클래스, 리스너, 포스트 프로세서 등이 나열되어 있다. @Import(AutoConfigurationImportSelector.class) 어노테이션이 spring.factories 파일에서 자동 구성 클래스 목록을 가져오는데, 이때 각 자동 구성 클래스는 특정 조건에 따라 활성화되며 필요한 bean들을 자동으로 등록한다.
@SpringBootApplication 어노테이션이 실행될 때 내부에 있는 @ComponentScan이 먼저 실행되고 그 다음에 @EnableAutoConfiguration이 실행되는 이유가 여기에 있다.
@EnableAutoConfiguration이 자동 구성 클래스를 활성화할 때 이미 존재하는 bean들을 고려하기 때문이다. @ComponentScan이 먼저 실행되어 사용자가 정의한 bean들이 IoC 컨테이너에 등록되어야 @EnableAutoConfiguration이 그 bean들을 참조하여 자동 구성을 활성화하거나 비활성화할 수 있기 때문이다. 이 순서가 유지되어야 예기치 않은 충돌이나 bean 중복 등록을 피할 수 있다.
'Spring' 카테고리의 다른 글
Spring IoC Container(Spring Container) (0) | 2024.07.17 |
---|---|
Bean 스코프 (0) | 2024.07.16 |
@Transactional 동작 방식 (0) | 2024.07.02 |
JDK Dynamic Proxy vs CGLIB Proxy (0) | 2024.07.02 |
AOP와 Spring AOP (0) | 2024.06.26 |