Spring Boot 기본 정리

패스트캠퍼스 Spring Boot 강의 정리

Spring Boot Properties

  • 스프링 부트의 기본 기능 전체를 튜닝하는 전용 설정 프로퍼티
  • application.properties 또는 application.yml로 제어 가능
  • 스프링 부트의 대부분 기능 제어 가능
  • 기본값이 설정되어 있어 아무것도 쓰지 않아도 작동
  • 자바 코드로 적용하던 것을 프로퍼티에서 설정 가능
  • 공식 문서

@SpringBootApplication

  • 스프링 부트 애플리케이션의 시작점
  • 스프링 부트 설정(@SpringBootConfiguration)
  • 사전에 정의한 라이브러리 빈 등록(@EnableAutoConfiguration)
  • 스프링 빈 애노테이션을 베이스 패키지에서부터 스캔해서 스프링 빈으로 등록(@ComponentScan)
@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 {
  
}
  • 속성
    • exclude
    • excludeName
    • scanBasePackages
    • scanBasePackageClasses
    • nameGenerator
    • proxyBeanMethods
  • 스프링 애플리케이션에 설정 추가하기
    • SpringApplication 인스턴스 생성해서 run() 전에 설정 추가
@SpringBootApplication
public class SampleApplication {
  
  public static void main(String[] args) {
    SpringApplication app = new SpringApplication(SampleApplication.class);
    
    // 설정 추가 가능
    app.setBannerMode(Banner.Mode.OFF);
    
    // 애플리케이션 실행
    app.run();
  }
}

@Component

  • 클래스를 custom bean으로 등록
  • class-level 애노테이션
  • 등록하려는 빈의 클래스 소스가 편집 가능한 경우 사용
  • auto-detection에 걸림
  • @ComponentScan으로 인해서 기본 패키지부터 모든 @Component 검색
  • 인스턴스화하고 필요한 의존성을 모두 주입
  • 스프링 컨테이너에 등록하여 필요한 곳에 주입

그 외에 bean 만드는 방법

  • @Configuration에서의 @Bean
@Configuration
public class Config {
  
  @Bean
  public MyService myService() {
    return new MyService();
  }
}
  • @Component에서의 @Bean (Lite Mode)
    • proxy bean 사용하지 않는 방식
@Component
public class Config {
  
  @Bean
  public MyService myService() {
    return new MyService();
  }
}

@Bean

  • method-level 애노테이션
  • 좀 더 읽기 쉬움
  • 인스턴스화 하는 코드 수동으로 작성
  • 빈의 인스턴스 코드와 클래스 정의가 분리된 구조
  • 외부 라이브러리, 서드 파티 클래스도 빈으로 등록 가능

@Configuration

  • bean 설정을 담고 있음
  • @SpringBootApplication이 컴포넌트 스캔을 통해 @Configuration 찾음
  • bean 설정(메소드)를 읽어서 스프링 컨테이너에 등록
  • 필요한 곳에 주입
  • 각종 스프링 인터페이스 구현에 사용
  • @Component 애노테이션 포함

Configuration properties

  • 각종 설정값을 외부로 분리
  • 서로 다른 환경에서도 사용 가능
  • 애플리케이션을 새로 컴파일하지 않고 설정값 변경 가능
  • 종류
    • Java properties
    • YAML
    • environment variable
    • command-line argument
  • 외부 설정을 읽어들이는 순서(아래 설정이 위의 설정을 덮어쓰게 됨)
    1. 기본 프로퍼티
    2. @Configuration 클래스에 @PropertySource로 정의된 것
    3. 설정 파일(application.properties)
    4. RandomValuePropertySource
    5. OS 환경 변수
    6. 자바 시스템 프로퍼티(System.getProperties())
    7. JNDI 속성(java:comp/emv)
    8. ServletContext 초기 파라미터
    9. ServletConfig 초기 파라미터
    10. SPRING_APPLICATION_JSON 프로퍼티
    11. Command-line arguments
    12. 테스트에 사용된 프로퍼티
    13. @TestPropertySource
    14. Devtools 글로벌 세팅($HOME/.config/spring-boot)
  • 설정 파일(Config data) 우선순위
    1. JAR 패키지 안의 application.properties / application.yml
    2. JAR 패키지 안의 프로파일이 지정된 파일(application-{profile}.properties)
    3. JAR 패키지 밖의 파일
    4. JAR 패키지 밖의 프로파일이 지정된 파일
  • 설정 파일(Config data)의 위치
    1. classpath
      1. classpath:
      2. classpath:/config
    2. 현재 디렉토리
      1. ../
      2. ../config
      3. ../config/child
  • 설정 파일 읽는 방법
    • @Value
      • SpEL로 프로퍼티명 표현
      • type-safe하지 않음
      • 필드 주입 방식 사용할 경우
        • 인스턴스화 이후에 주입하므로 final 쓸 수 없음
        • 생성자 안에서 보이지 않음 (대체 방법: @PostConstruct)
      • 생성자 주입 방식 가능
        • final 사용 가능
      • 프로퍼티 Relaxed binding 지원 (SpEL 표현은 kebal-case only)
      • Meta-data 없으며 javadoc은 가능
      @Component
      public class MyBean {
            
          @Value("${name}")
          private String name;
      }
    
    • Environment
      • application context에서 꺼내오는 방법
      • environment bean을 가져오는 방법
      • 눈에 잘 들어오지 않음
      @Autowired
      public MyService(Environment environment, ApplicationContext context) {
          System.out.println(environment.getProperty("test.property"));
          System.out.println(context.getEnvironment().getProperty("test.property"));
      }
    
    • @ConfigurationProperties
      • 자바 클래스로 매핑하므로 type-safe
      • 각 프로퍼티에 대응하는 meta-data 작성 가능
      • Relaxed binding 지원
      • 작성 방법
        • 기본
        • 애플리케이션 클래스에 @ConfigurationPropertiesScan 추가하여 @Configuration 생략 가능
        • @Bean 메소드
        • @ConstructorBinding
      @ConfigurationProperties("my")
      @Configuration
      public class MyProperty {
            
          private Integer height;
            
          public Integer getHeight() {
              return height;
          }
            
          public void setHeight(Integer height) {
              this.height = height;
          }
      }
    
      @ConstructorBinding
      @ConfigurationProperties("my")
      public class MyProperty {
            
          private final Integer height;
            
          public MyProperty(Integer height) {
              this.heght = height;
          }
            
          public Integer getHeight() {
              return height;
          }
      }
    
  • @ConfigurationProperties 이용하면 immutable & type-safe한 프로퍼티 생성 가능