스프링부트를 구성하는 핵심 요소는 스타터(Stater), 자동설정(AutoConfiguration), 액추에이터(Actuator) 3가지이다.
스프링이 제공하는 특정 모듈을 사용할 수 있도록 라이브러리 의존성 해결
스타터를 통해 추가한 모듈을 관련 빈(bean) 설정을 자동으로 처리
스프링부트로 개발된 시스템을 모니터링 할 수 있는 다양한 기능을 제공
메이븐 프로젝트를 기준으로 pom.xml 파일을 통해 프로젝트의 의존성 관리를 할 수 있다.
단, 웹 어플리케이션의 경우 하나의 의존성만 추가했다고 바로 개발이 가능한 것이아니라
해당 의존성과 연동되는 다른 의존성들도 추가해 주어야 한다. (예, pring-data-jpa 등)
이런 경우 숙련자가 아니라면 버전을 추가하고 알아보는 것 또한 비효율적이다.
이 때, 스프링 부트의 스타터가 관련된 것끼리 묶어서 하나의 세트
처럼 제공해 주는것이 스타터이다.
기본적으로 스프링 부트를 시작하면, 별도의 설정없이 바로 내장된 톰캣이 실행되며 웹 서버가 구동된다.
이는 기본 스타터가 "상속"의 방식으로 필요한 모든 의존성을 가지고 있기 때문인데
parent 태그를 통해 부모의 모든 설정을 상속받는다(프로퍼티 포함)
스프링부트의 pom.xml을 가면 기본적으로 다음과 같은 설정을 볼 수 있다.
해당 아티팩트아이디를 우클릭해 링크를 들어가면 디펜던시가 아닌 플러그인만 가득한 파일이 나온다.
결국 의존성은 이 파일의 부모인 spring-boot-dependencies 로 한번 더 이동해야 볼 수 있다.
정리하면 다음과 같은 구조로 상속이 이루어지는 것을 알 수 있다.
최상위 부모로부터 의존성을 상속받고
차상위 부모로부터는 플러그인을 상속받는다.
프로젝트의 pom.xml은 특정 프로퍼티를 오버라이드하거나 추가하는 방식으로 의존성을 관리하여
효율적으로 관리할 수 있도록 한다.
라이브러리를 추가했다고 바로 개발에 들어갈 수 있는것은 아니다. 이제 설정이 남았다.
하지만 우리는 스프링부트는 아무것도 하지 않아도 웹 서버가 실행된다는것을 알고있다.
이것은 메인클래스(프로젝트 생성시에 자동으로 만들어진)위의 @SpringBootApplication 어노테이션 덕분이다.
어노테이션을 타고 들어가보면 다음과 같은 어노테이션이 추가로 보이는데
눈여겨 보아야할건 @SpringbootConfiguration
, @ComponentScan
, @EnableAutoConfiguration
이다.
@SpringbootConfiguration은 일반적인 환경설정 클래스가 아닌 스프링부트 환경설정 클래스임을 나타내준다.
@ComponentScan은 @Configuration, @Repository, @Service @Controller등의 객체를 메모리에 올린다.
@EnableAutoConfiguration 이 바로 자동설정과 관련된 어노테이션인이다.
스프링 컨테이너는 두 단계로 나누어 빈을 초기화하는데, 이는 스프링 부트는 두 종류의 빈이 필요하기 때문이다.
파일 업로드 기능을 추가하기 위해서는 반드시 사용자가 업로드한 파일 정보가 Multipart 객체이여야 하고, 이를 위해
MultipartResolver객체가 필요하다. 이 과정에서 Controller와 MultipartResolver객체를 둘다 메모리에 올려야 하기 때문에
@ComponentScan은 Contoller를 메모리에, @EnableAutoConfiguration은 멀티파트리졸버를 메모리에 올리는 작업을 담당한다.
참고 - Springboot 퀵스타트