Spring/Spring Boot

[Spring Boot] 1-2. Spring Boot 사용하기

noahkim_ 2023. 10. 7. 20:15

6. Using the @SpringBootApplication Annotation

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

	@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
	Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

	@AliasFor(annotation = Configuration.class)
	boolean proxyBeanMethods() default true;
}
  • @SpringBootApplication는 간편하게 auto-configuration을 사용할 수 있도록 지원하는 메타 어노테이션입니다.
    • @EnableAutoConfiguration : Spring Boot의 auto-configuration 매커니즘이 적용되도록 하는 어노테이션
    • @ComponentScan : 빈 등록 어노테이션을 스캐닝하여 등록시키는 어노테이션
    • @SpringBootConfiguration : 추가적인 빈의 등록이나 설정을 활성화하는 어노테이션
  • @SpringBootApplication이 포함하는 어노테이션 attribute의 aliase 기능을 제공합니다.
    • @EnableAutoConfiguration : exclude, excludeNames
    • @ComponentScan : scanBasePackages(basePackages), scanBasePackageClasses(basePackageClasses)
    • @Configuration : proxyBeanMethods

 

7. Running Your Application

  • embedded server를 사용하여 Spring Boot을 jar로 패키징하는것은 한번의 실행을 통해 웹서버를 올릴 수 있게 해줍니다.

 

Running From an IDE

  • IDE를 사용해서 Spring Boot를 실행할 수 있습니다.
    • 먼저 IDE에 Spring Boot 프로젝트를 import 해야 합니다.
    • 사용하는 IDE와 Build System에 따라 과정이 달라집니다.
  • IDE 특수설정으로 인해 프로젝트를 즉시 import 할 수 없는 경우가 있습니다.
    • 이러한 경우 Build System에서 IDE를 위한 메타데이터를 생성하도록 plugin을 지원합니다.
    • 해당 plugin은 IDE 대신 메타데이터를 생성해줍니다. (gradle plugin)

 

Running as a Packaged Application

  • Spring Boot의 Maven 혹은 Gradle plugin을 사용하여 executable jar를 생성하면 java 명령어로 서버를 구동할 수 있습니다.

 

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n 
-jar target/myapplication-0.0.1-SNAPSHOT.jar
  • 원격에서 해당 서버를 디버깅할 수 있습니다.
  • 위 코드는 원격에서 서버를 디버깅하도록 JDWP 에이전트를 사용하여 디버그 모드인 JVM의 포트를 여는 코드입니다.
    • 자신의 IDE를 통해 해당 원격 서버에 접속할 경우, 디버깅 모드로 진입이 가능합니다.

 

Using the Gradle Plugin

  • Spring Boot Gradle Plugin는 bootRun이란 task를 제공합니다.
  • bootRun는 org.springframework.boot 혹은 java plugin에서 쓰이는 task입니다.

 

$ ./gradlew bootRun
$ ./gradlew bootRun --args='--spring.profiles.active=dev'
$ ./gradlew bootRun -Pexample=custom
tasks.named("bootRun") {
  sourceResources sourceSets.main
  systemProperty 'com.example.property', findProperty('example') ?: 'default'
}

 

  • 패키징된 파일을 기동하는 것이 아닌 디렉토리 상태로 서버를 기동합니다.
  • 자동적으로 main source set의 runtime classpath가 적용됩니다. 
  • argument, system property, project environment 설정 기능이 제공됩니다.

 

Hot Swapping

  • Spring Boot는 Java 기반 애플리케이션이므로 JVM의 Hot-Swapping 기능이 추가설정 없이 동작할 수 있습니다.
  • JVM의 Hot-Swapping 기능은 일반적으로 변수 추가와 같은 소규모 기능만 제공합니다.
    • 완성도 있는 솔루션을 사용하여 구축해야 합니다.
    • 이를 위해 JRebel을 사용할 수 있습니다.
  • Spring Boot에서는 관련 모듈을 spring-boot-devtools 의존성에 패키징했습니다.
    • spring-boot-devtools 의존성을 받아 hot swapping 기능을 추가할 수 있습니다.

 

 

 

참고