티스토리 뷰

Spring

1. 스프링 부트 특징

도라지보다더덕 2020. 5. 11. 00:55

스프링 부트는 왜 사용할까요?

spring boot를 사용하는 이유는 쉬운 자동 설정, 의존성 관리, 내부 servlet container 등 다양하게 있습니다.

 

오늘은 Auto Configuration(자동 설정)과 Easy dependendency Management(의존성 관리)의 동작 매커니즘을 정리해 보겠습니다

 

 

1. 의존성 관리

다른 프레임워크를 써보신 분들은 아시겠지만 프로젝트에서 여러 library를 가져올 때 각각의 버전을 명시해주고 또 서로 호환이 되는 지 안되는 지도 찾아봐야하고.. 상당히 귀찮은 작업들을 직접 해줘야 합니다.

 

하지만 스프링 부트에서는 spring-boot-starter-*에 스프링 부트 버전에 맞는 여러 library들이 사전에 설정되어 있습니다. 

 

모든 library가 설정되어있지는 않지만 그래도 starter에 필수적인 의존성들 등록되어있기때문에 우리가 관리해야하는 의존성은 줄어들게 되고 개발자가 개발에만 집중할 수 있도록 도와줍니다.

 

그렇다면 이 의존성은 어디서 관리하고 있는 걸까요?

 

만약 저처럼 maven과 같은 빌드 자동화 툴을 이용해서 프로젝트를 관리하신다면 아래와 같은 pom.xml이란 파일이 있을텐데요

 

maven

 

 

여기서 parent 태그를 보시면 spring-boot-starter-parent를 가지고 있는 것을 볼 수 있습니다. 말 그대로 해당 스타터를 부모로 가지고 있다고 보면 됩니다. 여기서 (command + 클릭)을 하면 

 

 

해당 파일로 가게되고 또 부모로 spring-boot-dependencies를 모시고 있는 것을 볼 수 있습니다. 여기서 한번 더 들어가면

 

 

다음과 같이 여러 의존성들과 버전이 명시되어 있는 걸을 볼 수 있습니다.

properties

 

dependency management

 

이런 식으로 스타터에서 많은 의존성을 관리하고 있습니다. 그렇다고 스프링 부트 스타터가 지원하지않은 의존성들을 사용하지 못하는 것은 아닙니다.

 

maven repository에 가시면

여러 의존성들이 있고 직접 찾아서 버전과 이름을 dependencies에 명시 해주면 여러 의존성을 추가하실 수 있습니다.

 

또한 직접 properties에서 버전을 명시하여 원하는 스프링 부트가 지정한 버전 외 버전도 사용할 수 있습니다.

 

 

 

1. Auto Configuration

Auto Configuration은 말 그대로 자동 설정입니다. Bean을 등록할 때 여러 설정들을 해주는 것인데 예전에는 이러한 비슷한 설정들을 복잡하게 진행했지만 스프링 부트는 이러한 설정을 쉽게 할 수 있도록 도와줍니다. 

 

우선 자동 설정을 진행하기 전에 스프링 부트 @(어노테이션)이 무슨 역할을 하는 지 알아봅시다.

 

main 메소드가 있는 application.class 파일을 보면 클래스 위에 @SpringBootApplication 가 붙어 있는 것을 볼 수 있습니다.

 

이 어노테이션은 

 

@EnableAutoConfiguration

@SpringBootConfiguration

@ComponentScan

 

위 세가지 어노테이션을 한번에 합친 어노테이션입니다. Bean을 등록하고 설정해주기 위한 어노테이션들입니다.

 

스프링 부트에서 빈은 두차례에 걸쳐 생성됩니다.

 

우선 @ComponentScan 을 통해 해당 패키지와 하위 패키지들의 component를 쭉 스캔하여 Bean으로 등록합니다.

(아래와 같은 어노테이션들)

  • @Component
  • @Configuration @Repository @Service @Controller @RestController

두번째로 @EnableAutoConfiguration을 통해 메타 파일을 읽어 자동 설정을 진행하며 Bean으로 등록합니다. 물론 두번째 설정은 여러 조건에 따라 Bean으로 등록될 지 안될지 결정합니다. 이 설정을 직접 해봅시다.

 

 

 

설정 구현

 

새로운 maven 프로젝트를 생성한 뒤 다음과 같이 pom.xml을 구성합니다. 자동 설정을 위해서는 spring-boot-autoconfigure 의존성이 필요합니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>autoConfigure</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>


</project>

 

해당 프로젝트에 resources 디렉토리 밑에 META-INF/spring.factories 를 만들어 

 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.configure.HolemanConfigure

다음과 같이 자동 설정파일 클래스가 있는 패키지(com.configure)와 설정파일(HolemanConfigure) 을 설정해줍니다.

spring.factories의 EnableAutoConfiguration의 키를 등록하면 @EnableAutoConfiguration 이 실행될 때 명시되어있는 클래스를 이용하여 각종 설정을 진행합니다. 이 설정을 커스터마이즈해봅시다.

 

 

우선 생성할 Bean의 클래스 Holeman과 그 설정 파일인 HolemanConfigure를 생성합니다.

 

 

Holeman.class

package com.configure;

public class Holeman {

    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 "Holeman{" +
                  "name='" + name + '\'' +
                  ", howLong=" + howLong +
                  '}';
      }


}

 

HolemanConfigure.class

package com.configure;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HolemanConfigure {

    @Bean
    @ConditionalOnMissingBean
    public Holeman holeman() {
        Holeman holeman = new Holeman();
        holeman.setHowLong(10);
        holeman.setName("hole");
        return holeman;
    }
}

@ConditionalOnMissingBean 어노테이션은 Bean이 없을 경우 생성하라는 조건 어노테이션입니다. holeman의 이름과 살아갈 수 있는 날을 설정하고 @bean으로 등록해줍니다.

 

터미널창으로 가서 

mvn install

 

해주면 해당 프로젝트를 jar파일로 만들어 다른 프로젝트에서도 사용할 수 있도록 local maven 저장소에 저장합니다. (설정 파일을 다른 프로젝트에서 생성하는 것은 실무에서도 자주 쓰이는 방식이라고 합니다.

 

자. 이제 원래 프로젝트로 돌아가 maven에 의존성을 등록하고 bean이 등록됐는 지 확인해봅시다

 

다음과 같이 의존성을 등록하고

내가 만든 의존성

 

 run을 하면

 

run

다음과 같이 bean이 등록된 것을 볼 수 있습니다.

 

하지만 만약 이렇게 일일히 설정을 해주기 싫고 application context에 직접 등록하여 사용하고 싶다하면 방법이 있습니다.

 

바로 application.properties에 직접 등록하는 것인데요

 

아까 사용했던 설정 파일로 돌아가 HoleManProperties.class를 만들어 줍시다.

 

HoleManProperties.class

package com.configure;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("holeman")
public class HoleManProperties {
    private  String name;
    private int howLong;

    public int getHowLong() {
        return howLong;
    }

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

    public String getName() {
        return name;
    }

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

@ConfigurationProperties("holeman") 을 이용하여 holeman을 prefix로 설정했습니다.

 

그리고 HolemanConfigure.class를 수정하면

 

HolemanConfigure.class

package com.configure;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(HoleManProperties.class)
public class HolemanConfigure {

    @Bean
    @ConditionalOnMissingBean
    public Holeman holeman(HoleManProperties holeManProperties) {
        Holeman holeman = new Holeman();
        holeman.setHowLong(holeManProperties.getHowLong());
        holeman.setName(holeManProperties.getName());
        return holeman;
    }
}

@EnableConfigurationProperties(HoleManProperties.class) 을 사용하여 properties를 사용할 클래스를 명시해주고

HoleManProperties holeManProperties를 주입시켜 bean을 설정해줍니다.

 

다시 본래 프로젝트로 돌아가 resources 밑에 application.properties란 파일을 만들고

 

holeman.name = properties
holeman.howLong = 100

아까 설정해둔 holeman prefix를 이용해 다음과 같이 설정해주고 run하면

 

 

다음과 같이 bean이 설정된 것을 볼 수 있습니다.

 

 

references

 


inflearn - 백기선 스프링 부트 개념과 활용

권대환씨네 블로그 - https://eoghks0521.tistory.com/entry/SpringBoot

 

'Spring' 카테고리의 다른 글

스프링 부트 활용(2) - 외부 설정  (0) 2020.06.01
스프링 부트 활용(1) - application class  (0) 2020.05.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함