[Project] 스프링 부트 프로젝트 생성 & 실행 - EP01

반응형

이번 시리즈에서는 스프링 부트로 프로젝트를 처음부터 생성 및 구축해보도록 하겠습니다.  

# 목차 
1. 스프링 부트 프로젝트 생성 & 실행 - EP01

스프링 프로젝트 생성

먼저 스프링 부트 프로젝트를 생성하기 위해 
IntelliJ IDE 에서 Spring Initializr 를 사용하겠습니다. 

IntelliJ 좌측 상단의 File > New > Project 를 클릭 후 

좌측의 Spring Initializr 및 SDK 를 선택한 후 Next 를 클릭합니다. 

다음으로 Group 및 Artifact 를 입력합니다.
Group 은 일반적으로 도메인 명을 역순으로 입력합니다.
예를 들어 naver 의 경우 com.naver 와 같이 입력합니다. 

Artifact 는 프로젝트의 이름을 적어주면 됩니다. 
저는 간단히 spring-tutorial 이라고 입력하겠습니다. 

다음으로 프로젝트의 Type & Language & Packaging & Java version 등을 선택해줍니다.
저는 다음과 같이 구성했습니다.

- Gradle 
- Java 
- Jar
- Java version 8

다음 화면에서는 프로젝트에 추가할 dependency 를 선택합니다.
가장 필수적인 Spring Web 과 Lombok 만 선택하도록 하겠습니다.
이외의 dependcy 는 그때 그때 필요할 때 추가하면서 진행하도록 하겠습니다. 

마지막으로 프로젝트를 생성할 위치를 선택 후 Finish 버튼을 클릭하면
기본적인 프로젝트 생성은 완료되었습니다. (참쉽죠? 💁🏻‍♂️ ) 

프로젝트 생성이 완료되면 다음과 같이 src > main > java > group.artifact 경로에
project 이름을 prefix 로 main class 가 생성된 것을 확인할 수 있습니다. 

스프링 프로젝트 실행

저의 경우에는 SpringTutorialApplication 이라는 클래스가 생성되어있습니다.

이제 프로젝트를 실행시켜 보겠습니다. 
SpringTutorialApplication 의 main method 옆의 초록색 화살표를 클릭 후 
Run 'SpringTutorialApplication' 을 클릭합니다. 

클릭 후 console 창에 SpringTutorialApplication 이 정상적으로 실행되었다고 출력되면 
정상적으로 스프링 프로젝트가 실행된 것 입니다. 

인터넷창을 하나 열고 "localhost:8080" 을 입력했을 때 다음과 같은 화면이 나오면 정상입니다. 


자, 이제 다시 돌아와서 스프링 프로젝트가 어떻게 실행되는 것인지..에 대해 간단하게 살펴보겠습니다. 

Dependency

위에서 Spring Initializr 를 사용해 project 를 생성할 때 dependency 로 web 을 선택 했었습니다. 
build.gradle 파일엔 다음과 같이 'spring-boot-starter-web' 이 정상적으로 등록되어 있는 것을 확인할 수 있습니다. 

사실 'spring-boot-starter-web' dependency 에는 다음과 같이 무수히 많은 dependencies 들이 하위에 포함되어 있습니다. 

mac 기준으로 클래스에서 option + comand + u 를 누르면 위와 같은 연관관계 확인할 수 있습니다. 

일일이 spring-web / spring-webmvc.. 등등 프로젝트를 구동하기 위한 모든 dependency 들을 명시하는 것이 아닌..
'spring-boot-starter-web' 만 입력하면.. 하위 종속성을 가진 depdency 들은 자동으로 import 되기 때문에..
손쉽게 spring boot 어플리케이션을 생성 및 실행 할 수 있는 것 입니다.

만약 위의 모든 dependency 들을 일일이 명시하고.. 각 dependency 별 version 까지 관리해야 한다면.. 
벌써부터 머리가 아득히 아파오기 시작합니다. 🤦🏻‍♂️(예전에는 그랬다고 합니다.)

위와 같은 depdency 들이 정상적으로 프로젝트에 import 되었는지 확인하려면 
좌측 프로젝트 탭 하단의 External Libraries 을 확인해보면 됩니다.
다음과 같이 자동으로 무수히 많은 Library 들이 포함되어 있는 것을 확인할 수 있습니다. 

Main Class 

이제 main 함수가 선언되어 있는 SpringTutorialApplication 을 살펴보겠습니다.

@SpringBootApplication

위 클래스에는 @SpringBootApplication 이라는 어노테이션이 선언되어 있습니다. 
위 어노테이션이 무엇을 의미하고 스프링 프로젝트가 실행될 때 어떠한 역할을 하는지 간단히 살펴보겠습니다. 

@SpringBootApplicaton 는
@SpringBootConfiguration@EnableAutoConfiguration@ComponantScan 어노테이션을 
동시에 선언하는 것과 동일하게 동일하게 동작한다고 되어있습니다. 

mac 기준으로 command 를 누른상태에서 클래스를 클릭하면 해당 클래스의 구현페이지로 이동합니다.

실제로 그런지 한번 테스트해보겠습니다. 
SpringTutorialApplication 클래스의 @SpringBootApplication 어노테이션을 제거하고. 
다음과 같이 변경 후 프로젝트를 실행해보겠습니다. 

결과는 이전과 동일하게 정상적으로 프로젝트가 실행됩니다. 

그렇다면 이제 각각의 어노테이션이 무엇을 의미하는지.. 간단히 살펴보겠습니다. 

@SpringBootConfiguration


먼저  @SpringBootConfiguration 는 다음과 같이 구성되어 있습니다. 
이 어노테이션은 해당 클래스가 스프링 부트 프로젝트의 구성정보(Configuration)를 제공한다고 명시합니다.
이 어노테이션은 반드시 프로젝트별 한개만 선언되어야 합니다.
(구성정보가 여러개면.. 프로젝트 실행시 어떤 구성정보를 사용해야할지 모르기 때문에..)

@EnableAutoConfiguration

@EnableAutoConfiguration 는 다음과 같이 구성되어 있습니다. 
뭔가 많이 적혀있긴 한데.. 결론적으로 이 어노테이션은 
스프링 부트 어플리케이션이 구동되는데 필요한 bean 들을 자동으로 생성합니다. 

AutoConfigurationImportSelector.class

@EnableAutoConfiguration 어노테이션에는 다음의 어노테이션이 명시되어 있는데..
@Import(AutoConfigurationImportSelector.class)

@Import
어노테이션의 AutoConfigurationImportSelector.class 가 
프로그램 구동시 등록할 bean 들을 선택하게 됩니다. (import selector 니깐.. import 할 bean 들을 선택해주는 친구)

이때 자동구성에 포함될 bean 들은 다음의 파일에 명시되어 있습니다. 
External Libraries > org.springframework.boot:spring-boot-autoconfigure > META-INF > spring.factories

위 파일을 한번 살펴보면 다음과 같이 무수히 많은 클래스들이 선언되어 있는 것을 확인할 수 있습니다. 


즉..  @EnableAutoConfiguration 은 미리 선언되어 있는 스프링부트의 meta 파일을 읽어서.. 
해당파일에 정의되어 있는 여러 자바 클래스들을 bean 으로 등록하는 역할을 수행하게 됩니다. 

@ComponentScan

다음으로 살펴볼 어노테이션은 @ComponentScan 입니다.
이 어노테이션은 어노테이션이 선언된 클래스 하위 패키지 전체에서..
@Component 어노테이션이 붙은 클래스들을 모두 찾아서 bean 으로 등록하는 역할을 수행합니다. 

예를 들어 다음과 같이 하위의 web 패키지에 HelloController 클래스가 생성되어 있고. 
해당 클래스 상위에 @RestController 어노테이션이 선언되어 있다면. 


@RestController 어노테이션도 다음과 같이 내부적으로 @Component 어노테이션을 포함함고 있기 때문에.
위 클래스는 bean 으로 등록되게 됩니다. 


이때 Filter 조건으로 다음과 같이 AutoConfigurationExclude 가 포함되어 있기 때문에 
@EnableAutoConfiguration 를 통해 등록되어 지는 bean 들은 제외하고 등록합니다. 
따라서 동일한 bean 이 중복으로 등록되는 것을 방지합니다. 


결론

결론적으로 Main 함수가 선언된 클래스에 @SpringBootApplication 어노테이션 하나를 선언함으로써 

1. 스프링 어플리케이션이 구동될때 필요한 bean 들이 알아서 자동으로 등록되고
2. Main 클래스 하위의 모든 패키지에서 @Component 어노테이션이 선언된 클래스들을 찾아 bean 으로 등록되기 때문에

위와 같이 간단한게 클릭 몇번 만으로 스프링 어플리케이션을 생성 및 구동할 수 있게 되는 것 입니다. 

반응형

댓글

Designed by JB FACTORY