Spring Boot
in Spring
Spring Boot는 스프링 공식 문서에서도 간단하게 정의가 되어있습니다.
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration.
- Spring Boot를 사용하면 실행할 수 있는 상용화 급의 Spring기반 Application을 독립적으로 쉽게 구성하고 만들 수 있습니다. 
- third-party 라이브러리에 대한 설정, Spring Boot에 대한 설정을 최소한으로만 하면 된다. (즉 대부분의 사람들이 많이 쓰는 설정들을 바탕으로 기본 설정은 되어있다.) 
Spring Boot의 특징
- Create statnd-alone Spring applications 독립형 Spring application을 만든다. 
- Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files) 톰캣,제티,언더토우를 내장하고 있다. (WAR 파일을 배포할 필요가 없다.) 
- Provide opinionated ‘starter’ dependencies to simplify your build configuration 
- Automatically configure Spring and 3rd party libraries whenever possible 
- Provide production-ready features such as metrics, health checks, and externalized configuration 
- Absolutely no code generation and no requirement for XML configuration 
Spring Boot의 구조
폴더구조
@SpringBootApplication
@SpringBootApplication 사진
주요 Annotation 설명
- @ComponentScan 
- @EnableAutoConfiguration 
빈 등록 순서
@SpringBootApplication 안에 숨어있는 @EnableAutoConfiguration
빈은 두 단계로 나눠서 읽힘
@ComponentScan이 첫번째로
@ComponentScan은 Annotation이 붙어있는 클래스부터 하위 패키지를 싹 찾아서 Component가 달려있는 애노테이션을 찾아서 빈으로 등록해줌.
@Configuration, @Repository, @Service, @Controller, @RestController
다른 패키지에 있으면 빈으로 등록 x
자기 자신도 가능
@EnableAutoConfiguration은 Spring meta file (spring-boot-autoconfigure 프로젝트 밑에 META-INF 밑에 spring.factories 파일에 configuration 들이 쭉 있음 (기본 설정들)
조건에 따라서 달라짐.
EnableAutoConfiguration
직접 AutoConfiguration 체험해보기 ~~ @Configuration src/main/resource/META-INF/spring.factories 파일을 만든다. spring.gactories 안에 자동 설정 파일 추가 mvn install
다른 프로젝트에서 사용가능
이렇게 두 단계로 나뉘다 보니
끌어와서 사용하는 프로젝트에서 빈으로 등록을 하면 이후에 EnableAutoConfiguration으로 등록된 빈이 덮어씌어진다.
해결방법
@ConditionalOnMissingBean 을 적용해주면 됩니다. 이 타입의 빈이 없으면 그 떄 등록을 해준다.
빈 설정을 장황하게 해야하는가?
application.properties에 원하는 값으로 설정하면 안되나??
holoman.name = 이제 ~~ holoman.how-long = ~~ holoman.howLong 도 가능
@ConfigurationProperties(“holoman”)
~~
Spring boot 의 Embed Servlet Contanier
내장 서블릿 컨테이너
- 스프링 부트는 서버가 아니다.
   - 톰캣 객체 생성
   - 포트 설정
   - 톰캣에 컨텍스트 추가
   - 서블릿 만들기
   - 톰캣에 서블릿 추가
   - 컨텍스트에 서블릿 맵핑
   - 톰캣 실행 및 대기
- 이 모든 과정을 생략해주게끔 하는 마법은 스프링 부트의 자동 설정.
  ServletWebServerFactoryAutoConfiguration (서블릿 웹 서버 생성)
   - TomcatServletWebServerFactoryCustomizer(서버 커스터마이징)
  DispatcherServlet ( httpServlet )
   - 서블릿 만들고 등록
서블릿 컨테이너는 달라질 수 있다. 
디스패쳐 서블릿은 안바뀜
그래서 나눠짐
참고자료
- 백기선님의 인프런 강좌 스프링 부트 개념과 활용
- 스프링 공식 문서
- 스프링 철저 입문