Springboot 소개

Info Notice: 이 포스트는 Inflearn 온라인 학습 “스프링 부트 개념과 활용”에서 참고할 사항을 도출하여 빠르게 참고하고자 정리한 블로그입니다.

1.의존성 관리 이해

  • 의존성 관리 참고 using-boot-dependency-management
  • pom.xml에 기본적으로 spring-boot-starter-web, spring-boot-starter-test 설정만 수행
  • 버전 명시하지 않음, 명시하지 않은 의존성도 추가 된 것을 확인 할 수 있음
  • spring-boot-starter-parent의 parent인 spring-boot-dependencies의 dependencymanagement 영역에 정의되어 있음
  • 이를 통해 의존성 관리 부담을 줄여 줌
  • spring-boot-starter-parent 사용하고 싶지 않을 때 아래와 같이 설정 가능
<dependencyManagement>
		<dependencies>
		<dependency>
			<!-- Import dependency management from Spring Boot -->
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.0.3.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
  • 이 경우 spring-boot-starter-parent에 미리 설정된 dependency는 사용 할 수 없음

2. 의존성 관리 응용

2.1 버전관리 해주는 의존성 추가

  • dependency 설정에 명시 하지 않음
  • spring-boot-starter-parent에 설정된 기본 설정을 사용하겠다는 의미
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2 버전관리 안 해주는 의존성 추가

  • version 명시 함
<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>2.1.0</version>
</dependency>

2.3 버전 정보 변경

  • spring-boot-starter-parent에 설정된 property를 프로젝트 pom.xml에 설정하여 overriding 함.
<properties>
  <spring.version>5.0.6.RELEASE</spring.version>
</properties>

3. 자동 설정 이해

3.1 @SpringBootApplication

  • main application class에 보면 @SpringBootApplication annotation을 볼 수 있음
@SpringBootApplication
public class WhmsApplication {
...
  • @SpringBootApplication은 @springBootConfiguration, @ComponentScan, @EnableAutoConfiguration 역할 수행
  • 결국 빈을 만들기 위한 스캔 작업을 수행하는데 두 단계로 나눠서 순서대로 수행 함.
    • 1단계: @ComponentScan
    • 2단계: @EnableAutoConfiguration

3.2 @EnableAutoConfiguration

  • @SpringBootApplication 안에 숨어 있음
  • springboot가 webapplication으로 구동 되는데 필요한 설정을 자동으로 스캔하여 bean으로 등록함
  • 따라서 @EnableAutoConfiguration을 주석 처리하고 Springboot를 기동하면 Error 발생

참고 아래와 같이 Springboot를 SpringApplication을 선언하여 webapplication이 아닌 유형으로 동작하면 기동 가능

@Configuration
@Component
public class Application {
  public static void main(String[] args) {
    SpringApplication application = new SpringApplication(Application.class);
    application.setWebApplicationType(WebApplicationType.NONE);
    application.run(args);
  }
}
  • 하지만 Springboot를 webapplication으로 구동하려면 @EnableAutoconfiguration이 필요함
  • 결국 @SpringBootApplication 설정을 하면 springboot를 webapplication으로 구동 가능하고 이 때 scan 순서는 componentscan, autoconfiguration을 읽음

3.3 @ComponentScan

  • 아래 annotation이 달린 클래스를 스캔하여 빈으로 등록
    • @Component
    • @Configuration @Repository @Service @Controller @RestController
  • 물론 스캔 영역이 아닌 패키지에 있는 경우는 스캔하지 않음.

3.4 @EnableAutoConfiguration 상세

  • spring-boot-autoconfigure lib 하위 META-INF의 spring.factories 읽음
  • spring.factories 에 org.springframework.boot.autoconfigure.EnableAutoConfiguration 설정 확인
  • spring.factories 안에 있는 설정을 읽게 되고 설정에 @Configuration을 빈으로 등록함.
  • @ConditionalOnXxxYyyZzz은 조건에 따라 빈으로 등록 함.

3.5 @ConditionalOnXxxYyyZzz 추가 설명

  • 예를 들어 WebMvcAutoConfiguration.class를 보면 아래와 같이 Conditional 어노테이션이 있음
@ConditionalOnWebApplication(
    type = Type.SERVLET
) 
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
....
  • @ConditionalOnWebApplication( type = Type.SERVLET ) 은 어플리케이션 타입이 Servelt 인 경우 WebMvcAutoConfiguration을 사용하겠다는 의미이므로 아래와 같이 어플리케이션의 타입을 변경하면 WebMvcAutoConfiguration을 사용하지 않게 되는 것
@Configuration
@Component
public class Application {
  public static void main(String[] args) {
    SpringApplication application = new SpringApplication(Application.class);
    application.setWebApplicationType(WebApplicationType.NONE);
    application.run(args);
  }
}

4. 자동설정 만들기

  • @EnableAutoConfiguration 이해를 위한 예제 프로젝트 제작

4.1 Springboot 프로젝트 유형

  • 프로젝트 만들기에 앞서 Springboot에서 만들어지는 프로젝트 유형을 2가지로 나눔

    • xxx-Spring-Boot-Autoconfigure : Autoconfig 설정
    • xxx-Spring-Boot-Starter : pom.xml 이 핵심인 의존성 정의용
  • 위 프로젝트 구분 없이 만들때는 xxx-Spring-Boot-Stater로 만듬

4.1 Springboot 프로젝트 만들기

  • summit-spring-boot-starter 라는 artifact를 갖는 프로젝트 만들기

4.2 pom.xml 설정

  • 생성된 프로젝트 pom.xml에 아래 내용 설정
<dependencies>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure-processor</artifactId>
      <optional>true</optional>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-dependencies</artifactId>
          <version>2.0.3.RELEASE</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
  </dependencies>
</dependencyManagement>

4.2 클래스 생성

  • Holoman Class
public class Holoman {
    
    String name;
    int howLong;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHowLong() {
        return howLong;
    }

    public void setHowLong(int howLong) {
        this.howLong = howLong;
    }

    @Override
    public String toString() {
        return "Holoman{" +
                "name='" + name + '\'' +
                ", howLong=" + howLong +
                '}';
    }
}
  • Holoman configuration class
package sftth.springboot;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HolomanConfiguration {
    @Bean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setName("Jacob");
        holoman.setHowLong(5);
        return holoman;
    }
}

4.3 spring.factories 생성

  • resources/META-INF 디렉토리 생성
  • META-INF 하위에 spring.factories 파일 생성
  • spring.factories에 EnableAutoConfiguration 설정을 위해 아래 내용 작성
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  sftth.springboot.HolomanConfiguration

4.4 maven install 수행

  • Intellij의 메뉴 또는 콘솔을 이용하여 maven install 수행
  • 이렇게 되면 지금까지 작성한 summit-spring-boot-starter 프로젝트의 jar 파일이 생성되고 다른 프로젝트에서 사용할 수 있도록 로컬 repository에 저장 됨

WHMS

4.5 다른 프로젝트에 설정 및 활용

  • repository에 저장된 jar를 다른 프로젝트 pom.xml에 설정하여 dependency 설정이 되는지 확인

WHMS

  • dependency 설정된 summit-spring-boot-starter 활용 예제를 작성함
  • 아래 경로에 따라 HolomanRunner 라는 java 파일을 작성
    com.summit.dev.springboot
    +- holoman
       +- HolomanRunner
    
  • 작성 코드
package com.summit.dev.springboot.holoman;

import me.summit.Holoman;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class HolomanRunner implements ApplicationRunner {

    @Autowired
    Holoman holoman;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(holoman);
    }
}
  • 작성한 코드에 따라 로그에서 출력 결과 확인

WHMS

이로써 autoconfiguration 된 프로젝트를 dependency 설정하여 활용하는 예제가 완료됨

카테고리:

업데이트:

댓글남기기