2 minute read

스프링부트의 기본동작 요약

스프링부트는 내장된 Tomcat, Jetty, Undertow와 같은 웹 서버를 제공하여 웹 애플리케이션을 구동할 수 있다. 이를 이용하기 위해서는 다음과 같은 방법을 따른다.

STEP1. 스프링부트 웹 의존성 추가

: 스프링부트 웹 기능을 사용하기 위해, spring-boot-starter-web 의존성pom.xml 파일 또는 build.gradle 파일에 추가한다.

- <span style="color:green"><b>[메이븐] pom.xml 인 경우</b></span>  

    ```xml
    <!-- 중략 -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <!-- 중략 -->

    ```
  
  
- <span style="color:green"><b>[그래들] build.gradle 인 경우</b></span>  

    ```bash
    ## 중략
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'  # jUnit 전용
    }
    ## 중략
    
    ```

STEP2. @SpringBootApplication 애노테이션 추가

: 스프링부트 어플리케이션의 메인 클래스에 @SpringBootApplication 애노테이션을 추가한다. 이 애노테이션은 @Configuration, @EnableAutoConfiguration, @ComponentScan 애노테이션을 조합한 것으로, 스프링부트 애플리케이션의 설정 정보를 나타낸다.

```java
@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

```

STEP3. 웹 애플리케이션 작성

: 웹 애플리케이션을 작성한다. 스프링부트에서는 기본적으로 src/main/resources/static 디렉터리에 정적 파일을 두고, src/main/resources/templates 디렉터리에 템플릿 파일을 둔다.

<!-- src/main/resources/templates/hello.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
    

STEP4. 애플리케이션 실행

: 애플리케이션을 실행하려면, 메인 클래스를 실행하면 된다. 스프링부트는 내장된 웹 서버를 이용하여 애플리케이션을 실행한다.

기타

기본적으로 내장된 웹 서버는 8080 포트를 사용한다.

스프링부트의 의존성 관리

(1). 스타터 의존성

기본적인 스프링 부트 프로젝트의 pom.xml 파일을 보면 의존성 설정이 spring-boot-starter-web과 spring-boot-starter-test 두 개 뿐이고 버전 또한 명시하지 않고 있지만 수 많은 라이브러리들을 알아서 가져온다.

스타터 의존성
스프링부트에서 제공하는 스타터 의존성은 특정 라이브러리를 사용하기 위해 필요한 다른 라이브러리들을 자동으로 관리해주는 의존성이다. 예를 들어, 스프링부트에서 웹 어플리케이션을 개발하기 위해 사용하는 spring-boot-starter-web 의존성을 추가하면, 내부적으로 Tomcat 웹 서버와 Spring MVC, Jackson 등과 같은 필요한 라이브러리들이 함께 추가된다.
  • 메인에서 @SpringBootApplication 호출
  • 내부에 @ComponentScan 구현 기능 호출 (conponent-scan 과 동일하다!)
  • 내부에 @EnableAutoConfiguration 구현 기능 호출
    • Spring Boot에서 Spring에서 많이 쓰는 스프링 빈들을 자동적으로 컨테이너에 등록하는 역할
    • autoconfiguration기능을 사용하겠다는 설정
    • component scan을 통해서 모든 component 들의 정보와 Spring Boot가 spring.factories 파일에 사전에 정의한 AutoConfiguration 내용에 의해 bean 생성이 진행된다.
    • Spring Boot의 meta 파일(spring-boot-autoconfigure/META-INF/spring.factories)을 읽어서 미리 정의 되어있는 자바 설정 파일(@Configuration)들을 빈으로 등록하는 역할을 수행 한다
    • spring-boot-autoconfigure/META-INF/spring.factories

    • 사용하는 경우 예시는 다음과 같다.
      Spring Boot의 meta 파일(spring-boot-autoconfigure/META-INF/spring.factories)

        # Auto Configuration Import Listeners
        org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
        org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
                  
        # Auto Configuration Import Filters
        org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
        org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
        org.springframework.boot.autoconfigure.condition.OnClassCondition,\
        org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
                  
        # Auto Configure
        org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
        org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
        org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
        org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
        org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
        org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
        ....
                      
      

(2). 의존성 관리 플러그인

의존성 관리 플러그인
스프링부트에서는 Maven과 Gradle 빌드 도구에서 사용할 수 있는 의존성 관리 플러그인을 제공한다 Maven에서는 spring-boot-maven-plugin을 사용하며, Gradle에서는 org.springframework.boot 플러그인을 사용 한다. 이 플러그인을 이용하면, 빌드 시 의존성을 자동으로 관리하고 실행 가능한 JAR 파일을 만들 수 있다.
  • [메이븐] pom.xml 인 경우
      <project>
    
      <dependencies>
      <!-- 중략 -->
      </dependencies>
    
    
      <build>
          <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
              <configuration>
                  <excludes>
                  <exclude>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                  </exclude>
                  </excludes>
              </configuration>
          </plugin>
          </plugins>
      </build>
    
      </project>
            
    
  • [그래들] build.gradle 인 경우

      ## 중략
      plugins {
          id 'org.springframework.boot' version '2.6.6'
          id 'io.spring.dependency-management' version '1.0.11.RELEASE'
          id 'java'
          id 'war'
      }
      ## 중략
            
    

(3). 직접 의존성 추가

직접 의존성 추가
스타터 의존성으로 제공되지 않는 라이브러리를 사용해야 할 때는, 직접 해당 라이브러리의 의존성을 추가해야 한다. 이를 위해 pom.xml 파일에서 태그를 추가하거나, Gradle에서는 build.gradle 파일에서 dependencies 블록 안에 필요한 라이브러리를 추가합니다.

Spring Boot의 gradle 파일(그래들설치경로/build.gradle)

  dependencies {
      implementation fileTree(dir: 'libs', include: ['*.jar'])
      implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
      implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
      implementation 'org.springframework.boot:spring-boot-starter-web'
      implementation 'org.webjars:bootstrap:4.5.0'
      implementation 'org.webjars:jquery:3.5.1'
      compileOnly 'org.projectlombok:lombok'
      developmentOnly 'org.springframework.boot:spring-boot-devtools'
      runtimeOnly 'mysql:mysql-connector-java'
      annotationProcessor 'org.projectlombok:lombok'
      testImplementation('org.springframework.boot:spring-boot-starter-test') {
          exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
      }
  }
      

위와 같은 방법들을 통해 스프링부트는 의존성 관리를 간편하게 해주어 개발자가 더욱 편리하게 어플리케이션을 개발할 수 있도록 도와준다.

Leave a comment