아래의 내용은 inflearn 강좌인 스프링 부트 개념과 활용을 보고 정리한 글입니다.
Backgrounds
SpringBoot를 실행하게 되면 다양한 설정들이 뜨는 걸 볼 수 있다. 그러나 우리는 Bean으로 등록한 적이 없는데 이런 설정들이 어디서 어떻게 주입이 되는지 알아볼 필요가 있다.
@SpringBootApplication
main함수를 보게 되면 보통 @SpringBootApplication 이라는 어노테이션이 존재한다.
어노테이션을 타고 들어가보면 아래와 같이 다양한 어노테이션이 붙어있다.
그 중에서 우리가 살펴볼 만한 것은 아래 3개의 어노테이션이다.
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
@SpringBootConfiguration은 그냥 단순히 Configuration으로 등록해놓은 것으로 특별한 것은 없다.
더 유심히 봐야 할 것은 @EnableAutoConfiguration과 @ComponentScan이다.
@ComponentScan
@ComponentScan은 기존 Spring에서도 사용하던 것으로 ComponentScan이 있는 디렉터리부터 하위 디렉터리를 찾아서 @Service, @Repository, @Controller, @RestController,@Component 등의 어노테이션이 붙어 있는 Bean들을 찾아서 등록해준다.
여기서는 @SpringBootApplication 즉, 메인함수가 있는 패키지를 포함한 하위 디렉터리에 있는 Component를 Bean으로 등록해준다.
@EnableAutoConfiguration
@EnableAutoConfiguration이 대부분의 SpringBoot의 설정들을 자동으로 주입해주기 때문에 내장 톰캣이나, DispatcherServlet를 설정해주지 않더라도 쉽게 실행할 수 있게 된다.
이 어노테이션은 org.springframework.boot:spring-boot-autoconfigure라는 프로젝트 내부에 META-INF에 있는 spring.factories 파일에
org.springframework.boot.autoconfigure.EnableAutoConfiguration 라는 key가 존재하고 그 밑에 다양한 value가 존재하는데 그 value값에 해당하는 클래스들을 빈으로 등록하게 된다.
그러나 모든 class가 빈으로 등록되는 것이 아닌 조건에 따라서 등록되는 Bean이 있고 아닌 Bean이 있다.
AutoConfigure 만들기
새로운 프로젝트를 하나 생성하고 아래의 dependency를 추가해준다.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
그리고 bean으로 등록할 class를 하나 생성하고 그에 해당하는 Configuration파일을 만들어준다.
public class Holoman {
String name;
int howlong;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHowlong() {
return howlong;
}
public void setHowlong(int howlong) {
this.howlong = howlong;
}
@Override
public String toString() {
return "Holoman{" +
"name='" + name + '\'' +
", howlong=" + howlong +
'}';
}
}
@Configuration
public class HolomanConfiguration {
@Bean
@ConditionalOnMissingBean
public Holoman holoman() {
Holoman holoman = new Holoman();
holoman.setHowlong(16);
holoman.setName("Holoman");
return holoman;
}
}
위와 같이 두개의 클래스를 생성한 후 resources 에 META-INF 라는 디렉터리를 생성하고 그 안에 spring.factories 라는 파일을 생성한 후 아래의 내용을 추가해준다.
이 과정이 @EnableAutoConfiguration이 해당 클래스를 Bean으로 등록하도록 해주는 기능이다.
org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
me.doflamingo.HolomanConfiguration
프로젝트 전체의 구조를 보면 아래와 같다.
이 후 Maven Install 을 진행하면 로컬 maven repository에 저장된다.
그리고 또 다른 프로젝트를 하나 만든 후, pom.xml파일에 아까 만들었던 프로젝트를 dependency에 추가해주면 Holoman을 주입받아서 사용할 수 있다.
<dependency>
<groupId>me.doflamingo</groupId>
<artifactId>doflamingo-spring-boot-starter</artifactId>
<version>1.0.2</version>
</dependency>
@Component
public class HolomanRunner implements ApplicationRunner {
@Autowired
Holoman holoman;
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println(holoman);
}
}
참고로 하나 말하면 ApplicationRunner를 구현한 클래스를 만든 후 Component로 등록하면 SpringBootApplication이 실행할 때 위의 코드가 실행된다.
이렇게 우리가 직접 AutoConfiguration을 만들어서 사용할 수 있다.
'스프링(부트) > 스프링부트 내용 정리' 카테고리의 다른 글
SpringBoot 내장 웹서버 (0) | 2020.06.04 |
---|
댓글