1. @AutoConfiguration

    Untitled

    1. 자동 구성에 사용하는 어노테이션
    2. @SpringBootApplication 어노테이션이 내부에 가지는 @EnableAutoConfiguration 어노테이션으로 활성화
    3. 자동 구성을 사용하려면 어노테이션만 사용해서는 자동 구성이 이루어지지 않음
    4. META-INF/spring/org.springframwork.boot.autoconfigure.AutoConfiguration.imports
      1. 해당 경로에 해당 이름의 파일을 생성한 후
      2. 파일에 자동 구성 어노테이션을 사용한 클래스의 경로와 클래스이름을 작성해줘야함
      3. 빌드 과정에서 스프링이 파일을 읽어 자동 구성을 사용하는 클래스를 인지하고 조건에 따라 설정정보를 이용해 빈으로 등록
    5. @AutoConfiguration내부에 @Configuration어노테이션을 가지고 있기 때문에 빈을 등록하는 설정 파일로 사용 가능
    6. after = DataSourceAutoConfiguration.class
      1. after, before 등으로 자동구성이 실행되는 순서를 정해줄 수 있음
      2. 위 예제에서 JdbcTemplate은 DataSource빈을 사용하기 때문에, DataSource 자동구성 파일의 빈들이 등록된 후 자동구성파일을 읽도록함
    7. @ConditionalOnClass({ DataSource.class, JdbcTemplate.class })
      1. IF문과 유사한 기능을 제공
      2. 애트리뷰트로 넘겨준 클래스가 존재하는 경우에만 자동설정이 동작
      3. 예제에서는 DataSource, JdbcTemplate 클래스가 있어야 작동할 수 있기 때문에 작성
  2. @Import

    1. 스프링에서 자바 설정 클래스를 추가할 때 사용

    2. 예) @Import({AConfig.class, BConfig.class})

    3. 위처럼 직접 추가할 수도 있지만, ImportSelector인터페이스를 구현한 클래스를 받기도 함

      Untitled

    4. ImportSelector에서 중요한 메서드는 selectImports() 메서드임

    5. 해당 메서드는 String배열을 반환하는데, 해당 배열에 들어있는 (경로 + 클래스)를 바탕으로 설정 정보를 불러올 수 있음

    6. 앞선 예제에서 AConfig.class, BConfig.class를 직접 사용하는 것보다는 특정 조건등에 따라 등록을 달리할 수 있기 때문에 비교적 동적으로 사용이 가능함

    7. **@EnableAutoConfiguration**어노테이션이 ImportSelector방식으로 작동함

    8. ~AutoConfiguration.imports파일에서 작성된 설정파일을 모두 가져와서 조건에 따라 등록하는 것이 자동구성인 것

  3. 자동 설정, 자동 구성

    1. 자동 설정
      1. Configuration이라는 단어가 컴퓨터 용어에서는 환경 설정, 설정 이라는 뜻으로 사용
      2. AutoConfiguration도 크게 봤을 때 빈들을 자동으로 등록해서 스프링이 동작하는 환경을 자동으로 설정해주기 때문에 자동 설정이라는 말도 맞다
    2. 자동 구성
      1. Configuration이라는 단어는 구성, 배치라는 뜻도 있다.
      2. 에를 들어 컴퓨터는 CPU, 메모리 등을 배치해야 작동이 가능한데, 이렇게 배치하는 것을 구성이라고 함
      3. 스프링도 스프링 실행에 필요한 빈들을 적절하게 배치, 자동 구성은 스프링 실행에 필요한 빈들을 적절히 배치하는 것
    3. 결국에 둘 다 맞는 말
    4. 자동 설정은 넓은 의미, 자동 구성은 상대적으로 좁은 의미로 이해
  4. @Conditional

    Untitled

    1. 특정 조건이 맞을 때만 해당 기능이 활성화 되도록 해주는 어노테이션
    2. 예를 들어 개발, 운영 서버의 설정을 다르게 하기 위해 사용하기도 함
    3. 핵심은 소스코드는 수정하지 않고 이런 것들을 가능하게 해야함
    4. 애트리뷰트로는 Condition 인터페이스를 구현한 클래스를 받음
    5. Condition 인터페이스는 matches()메서드를 가지는데 해당 메서드의 boolean타입의 반환값에 따라 빈이 등록되거나 등록되지 않도록 함
    6. ConditionContext, AnnotatedTypeMetadata
      1. ConditionContext: 스프링 컨테이너, 환경 정보(Environment)를 담고 있음
      2. AnnotatedTypeMetadata: 어노테이션 메타 정보를 담고 있음