스프링 / java spring boot / spring boot
Spring Boot 간략 정리
6.2.2. Locating the Main Application Class 에 나와있는 일반적인 springboot 구조
com
+- example
+- myapplication
+- MyApplication.java --> 여기에 main 이 있다.
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class MyApplication
fun main(args: Array<String>) {
runApplication<MyApplication>(*args)
}
Configuration class
1개의 @Configuration
class 를 주요 class 로 사용하길
추천한다.(참고)
main 이 들어있는 class 도 primary @Configuration 으로 좋은 후보 class
이다.
@ComponentScan
을 사용하면, 자동으로 모든 Spring
component들을 가져온다. 당연히 @Configuration
도
가져온다.
@Configuration
class 에서 @Import
를 써서
다른 Configuration 을 import 할 수 있다.
@Configuration
@Import(AConfig::class, BConfig::class)
class MyConfig {
...
}
auto-configuration 은 @SpringBootApplication
이나
@EnableAutoConfiguration
을 사용하면 enable 된다. 그러면,
자동으로 설정이 잡힌다. classpath 에 jar 이 추가되면, 이 jar에 대한
configuration 도 자동으로 된다. 추후 필요한 부분들을 override 해서
값들을 수정하면 된다.
만약 특정 부분에 대한 auto configuration 을 하고 싶지 않다면, 다음처럼 exclude 할 수 있다.
@SpringBootApplication(exclude = [DataSourceAutoConfiguration::class])
class MyApplication
일반적으로 constructor injection을 사용하여 dependency 들을 연결하고,
@ComponentScan
을 사용하여 bean을 찾는 것이 좋다.(참고)
@ComponentScan 을 사용하면
@Component
, @Service
,
@Repository
, @Controller
등 모든 application
component들이 자동으로 Spring Beans 로 등록된다.
다음 예제가 contructor injection 을 보여준다.
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
kotlin 코드는
@Service
class MyAccountService(private val riskAssessor: RiskAssessor) : AccountService
여러개의 consturctor 가 있으면, 어떤 constructor 를 쓸 것인지
지정해줘야 한다.(@Autowired
)
@Service
class MyAccountService : AccountService {
private val riskAssessor: RiskAssessor
private val out: PrintStream
@Autowired
constructor(riskAssessor: RiskAssessor) {
this.riskAssessor = riskAssessor
out = System.out
}
constructor(riskAssessor: RiskAssessor, out: PrintStream) {
this.riskAssessor = riskAssessor
this.out = out
}
// ...
}
Application Event들
ApplicationContext
가 생성되기전의 event 들이
몇개있는데, 그 event 에 대한 listener를 Bean 으로 등록을 할 수 없다.
SpringApplication.addListeners()
를 이용SpringApplicationBuilder.listeners()
를 이용META-INF/spring.factories
에ApplicationListener
로 등록하기- 예:
org.springframework.context.ApplicationListener=com.example.project.MyListener
- 예:
Application events 들은 다음순서로 발생된다. 이 event 들은 SpringApplication 에 묶인다. 이벤트가 어떤 의미를 갖는지는 여기를 참고하자.
- ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent
- ApplicationContextInitializedEvent
- ApplicationPreparedEvent
- WebServerInitializedEvent
- ContextRefreshedEvent
- ApplicationStartedEvent
- AvailabilityChangeEvent
- ApplicationReadyEvent
- AvailabilityChangeEvent
- ApplicationFailedEvent
SpringApplication은 사용자를 대신하여 right type의 ApplicationContext를 만들려한다. 웹 응용 프로그램 (WebApplicationType)을 결정하는 데 사용되는 알고리즘유형은 다음과 같다.
- Spring MVC가 있는 경우
AnnotationConfigServletWebServerApplicationContext
가 사용 - Spring MVC가 없는 경우
AnnotationConfigReactiveWebServerApplicationContext
가 사용 - 그외의 경우 :
AnnotationConfigApplicationContext
setWebApplicationType(WebApplicationType)
을 통해
override 할 수 있다.
JUnit test 내에서 SpringApplication 을 사용할 때는
setWebApplicationType(WebApplicationType.NONE)
를
사용하자.
Application Arguments
아래에서 보이는 args
를 bean 등으로 넘길 수 있다.
fun main(args: Array<String>) {
val defaultProp = Properties().apply {
set("young.pa.phase", "local")
set("young.pa.debug", false)
}
runApplication<Application>(*args) { setDefaultProperties(defaultProp) }
}
아래처럼 사용하면 된다.
import org.springframework.boot.ApplicationArguments
import org.springframework.stereotype.Component
@Component
class MyBean(args: ApplicationArguments) {
init {
val debug = args.containsOption("debug")
val files = args.nonOptionArgs
if (debug) {
println(files)
}
// if run with "--debug logfile.txt" prints ["logfile.txt"]
}
}
Application 시작을 추적하려면
외부 설정 방법들
SpringApplication.setDefaultProperties
application.properties
와application.yml
- spring 이 자동으로 찾아서 load 한다.
- classpath 들의 root 와
/config
package 에서 찾는다. - 현재 directory 와 하위 directory 의
/config
에서 찾는다. <proj>/src/main/resources/application.properties
에 두면 된다.
- 기타 여러가지 방법들은 Externalized Configuration 를 참고하자.
댓글 없음:
댓글 쓰기