https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/
@SpringBootAplication
는 auto-configuration을 담당한다. application class
에서 extra configuration을 정의하거나 component scan을 해준다.
@SpringBootApplication
하나만으로 @EnableAutoConfiguration
, @ComponentScan
, @Configuration
세 가지 Annotation을 사용한 것과 같은 동작을 할 수 있다.
Spring Boot auto-configuration
은 jar dependencie에 추가된 내용을 바탕으로 우리의 Spring application
을 자동으로 configure하려고 시도한다. 예를들어 HSQLDB
가 우리의 classpath에 있거나 아무런 database bean을 연결하지 않았을 경우 Spring Boot
는 자동으로 in-memory database
를 연결해준다.
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
@SpringBootApplication
대신 직접 @EnableAutoConfiguration
을 사용하여 Specific class를 exclude
했다.
@SpringBootApplication
이 붙은 Class는 root 디렉토리에 위치하는 것을 권장하고 있다.
SpringBoot는 XML 기반 Configuration과 Java-based Configuration을 지원한다. 그리고 Java-based Configuration을 선호한다.
Enable*
로 시작하는 annotation을 찾아보는 것이 가장 바람직하다.
@ImportResource
annotation을 사용해서 XML을 Load하는 것이 바람직하다.ComponentScan
을 사용해 @Configuration
class들을 자동으로 scan할 수 있다.@Import
를 사용해 직접 추가할 수도 있다.SpringBoot의 auto-configuration은 standard Spring Framework의 기술들을 자유롭게 사용하도록 도와준다. 그러나 auto-configuration이 동작하려면 @Component, @Service, @Repository, @Controller
들을 사용하기 위해서 Bean을 등록을 해줘야한다.
Bean을 등록하기 위해서 @Autowired
를 사용할 수 있다. (필자의 경우 lombok
의 @RequiredConstructor
를 통해 Bean을 주입했다.)
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
@Autowired // parameter가 1개 일 때는 Autowired가 없어도 된다. 즉, 지금 같은 경우에는 Autowired가 없어도 됨
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
@Service
를 사용하기 위해 constructor에 @Autowired
를 이용해 bean을 registered했다. 여기서 주의할 점은 RiskAssessor
에 final이 붙은 것이다.
위의 코드는 아래와 같이도 사용할 수 있다.
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@RequiredConstructor
@Service
public class DatabaseAccountService implements AccountService {
private final RiskAssessor riskAssessor;
// ...
}