Spring Boot :: 간단한 기초

JaeHwan·2023년 8월 29일
0

Spring Boot

목록 보기
5/8
post-thumbnail

🌿 Spring Boot 기초

✨ Spring Boot 란

Spring Boot 는 Spring Framework 를 개발자 친화적?으로 편의성이 더 높아진 버전이다.
Spring Framework 에서 설정해야하는 여러가지 Boilerplate 적인 요소들을 Spring Boot가 알아서 해결해준다.
간단한 예로는

webMVC : DispatcherServlet, web jar, component scan 등...
Hbernate/JPA : data source, entity manager factory/session factory 등..

Spring Framework의 경우 개발자가 직접 bean 등록 등 만들어줘야 하지만 Spring Boot의 경우 autoconfigure.jar 가 만들어준다.

Spring Boot 는 개발자가 환경을 신경쓰지 않고, 오로지 비지니스에만 집중할 수 있도록 도와준다.

📠 autoconfigure.jar ( spring-boot-autoconfigure.jar)

autoconfigure.jar는 위에서 말했듯이 종속성 등 Boilerplate 적인 요소들을 자동으로 만들어준다.
종속성이 추가되면 자동으로 매칭을해 bean 파일 등 설정 파일을 만들어준다.
이는 스프링을 실행할 때 log를 설정해서 볼 수 있다.
log를 설정해서 볼 때 match 와 did not match 를 볼 수 있는데, 종속성이 없으면 did not match 가 되면서 설정 파일이 만들어지지 않는다.

autoconfigure.jar 를 확인해보면 어떠한 autoConfiguration이 들어있는지 확인해볼 수 있다.
meta-inf 로 이동하면 spring.factories 파일을 볼 수 있는데, 이 파일에는 기본적 ( 스프링을 기반으로 하고 클래스 경로에 존재하는 종속성을 기반으로 하는 클래스 등.. ) 으로 모든 자동 구성 클래스가 포함되어 있습니다.

Spring Boot는 기본적으로 필요할 때마다 종속성에서 매치가 되는 것을 자동으로 configuration 합니다.

🔀 @SpringBootApplication 실행 과정

Spring Boot 프로젝트를 만들어 보면

@SpringBootApplication
@EnableJpaAuditing
public class TodoApplication {
	public static void main(String[] args) {
		SpringApplication.run(TodoApplication.class, args);
	}

}

위와 비슷한 메인 코드를 볼 수 있다. 이 코드를 실행했을 때 발생하는 실행 과정을 확인해보자

  1. Spring boot application execution will start from main() method

  2. The main() method internally call SpringApplication.run() method

  3. SpringApplication.run() method performs bootstraping for our spring boot application

    • 따라서 내부적으로 실행 메소드가 매우 중요, 모든 자동 구성 클래스를 로드해야된다. 그리고 Spring IOC 컨테이너 생성 ( 부트 스크래핑은 우리를 실행하는 데 필요한 모든 필수 구성과 구성 요소를 로드한다는 것을 의미한다. )
  4. Starts StopWatch to indetify ime taken to bootstrap the spring boot application

    • 부트스크래핑에 소요되는 시간을 계산할 타이머
  5. Prepares environment to run our spring boot application (dev, prod, local, qa, uat etc..)

  6. Print banner ( Spring Boot logo prints on console )

  7. start the IOC container ( ApplicationContext ) based on the classpath ( default, Web servlet/ Reactive)

    • 따라서 Spring boot 를 사용하지 않는 경우 applicationContext나 Spring IOC 를 수동으로 시작해야한다.
  8. Refresh context

    • 따라서 IOC container 가 시작되면 모든 context가 새로 고쳐지고 모든 context가 로드됩니다.
  9. Trigger Runners ( ApplicationRunner or CommandLineRunner )

    • 필요한 구성요소를 추가한 다음 렌더링을 트리거합니다.
  10. Return ApplicationContext reference ( Spring IOC )

spring-starter : default context 실행
spring-starter-web : servlet context 실행
spring-starter-webflux : reactive context 실행

위와 같은 순서는 @SpringBootApplication 의 코드를 뜯어보면 알 수 있다. 다들 한 번씩 확인해보자.

🦴 @SpringBootApplication 의 구조

알아볼 구조는 @SpringBootApplication이 가지고있는 세가지의 annotaion이다

  • @SpringBootConfigration
    • @Configuration 포함
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootConfiguration ( @Congifuration )

Spring 기반의 application 에서 수행할 수 있는 세 가지 유형의 configuration이 있다.

  • xml
  • java
  • annotation

java 기반의 configuration ( 구성 ) 을 수행하기 위해 @Configuration annotation을 사용한다. 기본적으로 우리는 java class 를 생성한 다음 configuration에서 해당 Java class에 @Configuration을 달았다. 그러면 해당 Java class 가 configuration class 가 되고 모든 spring 과련 항목을 정의할 수 있다.
그리고 우리는 bean을 정의하거나 이 class 내에서 bean을 configuration 할 수 있다.
그래서 우리는 java class 를 Spring java based configuration 으로 만들기 위해 추가 @Configuration 을 사용한다.

@EnableAutoConfiguration

이 annotaion은 Spring boot application 에 대한 auto configuration class 를 활성화한다.
따라서 Spring boot 가 classpath 에서 spring-starter-web 종속성을 발견할 때마다 이 annotation 이 표시된다.
따라서 이 annotation은 Spring Boot application 이 실행될 때마다 auto configuration class를 활성화하는 역할을 한다.

@ComponentScan

내부의 모든 Spring 구성요소를 자동으로 스캔하는 것. 기본 패키지와 해당 하위 패키지
따라서 @ComponentScan을 추가하면 기본 패키지 내의 모든 Spring Component 를 스캔한다.
class 에 @Component annotation을 추가할 때마다 해당 class 는 Spring component 가 된다.

따라서 세 가지 주석을 사용하는 대신 @SpringBootApplication 이 단일 주석을 사용할 수 있다.

👪 Parent for Spring-Boot-Starter

자바 버전을 지정하지않으면 기본적으로 1.8로 설정한다.
Spring-Boot-Starter Parent는 내 프로젝트에 필요한 많은 플러그인을 제공한다.
그 외에도 모든 종속성의 버전도 관리한다.
Spring boot starter에 대한 버전은 Spring boot starter parent에 의해 관리된다.
따라서 버전을 명시해주지 않아도 된다.

profile
Flutter를 사랑하는 근데 이제 백엔드를 곁들인

0개의 댓글