[컴] Spring Boot 간략 정리

 

스프링 / 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.factoriesApplicationListener 로 등록하기
    • 예: org.springframework.context.ApplicationListener=com.example.project.MyListener

Application events 들은 다음순서로 발생된다. 이 event 들은 SpringApplication 에 묶인다. 이벤트가 어떤 의미를 갖는지는 여기를 참고하자.

  1. ApplicationStartingEvent
  2. ApplicationEnvironmentPreparedEvent
  3. ApplicationContextInitializedEvent
  4. ApplicationPreparedEvent
    1. WebServerInitializedEvent
    2. ContextRefreshedEvent
  5. ApplicationStartedEvent
  6. AvailabilityChangeEvent
  7. ApplicationReadyEvent
  8. AvailabilityChangeEvent
  9. 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.propertiesapplication.yml
    • spring 이 자동으로 찾아서 load 한다.
    • classpath 들의 root 와 /config package 에서 찾는다.
    • 현재 directory 와 하위 directory 의 /config 에서 찾는다.
    • <proj>/src/main/resources/application.properties에 두면 된다.
  • 기타 여러가지 방법들은 Externalized Configuration 를 참고하자.

Testing

Task Execution and Scheduling

See Also

  1. 6.7.5. Hot Swapping

Reference

  1. Spring Boot Reference Documentation

댓글 없음:

댓글 쓰기