본문 바로가기

Spring/Spring Boot

(SpringBoot) Spring Boot의 자동설정 구현해보기(1)

 

spring-boot-starter 구현

1. 의존성 추가

<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>

2. Holoman POJO 생성

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 +
                '}';
    }
}

3. 설정 파일 (Configuration) 생성

보통은 설정 파일과 설정의 대상이 되는 파일은 다른 프로젝트로 분리하는 게 맞지만 편의상 같은 프로젝트에 설정하였다.

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

        return holoman;
    }
}

 

4. spring.factories 파일 생성

 

이전에 공부하였던 자동 설정과 동일한 파일 구조로 생성한다.

 

 

 

 

 

 

EnableAutoConfiguration을 키로 

해당 설정 파일에 대한 경로 설정

 

5. mvn install 실행 - 프로젝트 빌드하여 jar파일로 만든 다음 로컬 maven 저장소에 설치

 

6. 원래의 Project로 돌아와 메이븐 install 한 파일을 pom.xml 의존성 추가

<dependency>
    <groupId>me.choi</groupId>
    <artifactId>junwoo-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

의존성 들어왔음

7. 설정 프로젝트에 있는 Holoman 의존성 주입

@Component
public class HolomanRunner implements ApplicationRunner {
    @Autowired
    Holoman holoman;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(holoman);
    }
}

실행결과 설정파일에 있는 Holoman 정보가 출력됨을 볼 수 있다.


문제점 발생

 

Bean을 한 개 더 생성해보자

@Configuration
@SpringBootApplication
public class SpringbootgettingstartedApplication {

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(SpringbootgettingstartedApplication.class);
        springApplication.setWebApplicationType(WebApplicationType.NONE);
        springApplication.run(args);
    }

    @Bean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setName("choijunwoo");
        holoman.setHowLong(60);

        return holoman;
    }
}

 

정리하자면 현재 Holoman Bean이 두 개가 생성되어있다. 

이전에 등록하였던 @Component의 Bean 그리고 지금 생성하였던 @Bean의 Bean

 

우리가 원하는 결과는 @Component의 Bean인  Holoman {name='choijunwoo', howLong=60} 지만

출력을 하면 다른 결과가 나온다.

등록하였던 Bean이 무시가 된다.

 

 

이전에 아래와 같은 순서로 SpringBoot는 Bean을 등록한다 하였다.

 

SpringBoot는 Bean을 두 단계로 등록을 한다.

  • @ComponentScan에서 등록 (1)
  • @EnableAutoConfiguration에서 등록 (2)

먼저 방금 등록 한 Bean은 @ComponentScan에 의해 Bean으로 등록된다.

@EnableAutoConfiguration 가 방금 등록한 Bean을 덮어써버린 것이다.

 

더보기

이때 나는 

이러한 오류가 나서

spring.main.allow-bean-definition-overriding=true

이와 같이 설정하였다.

 


코드 참조

https://github.com/mike6321/Spring/tree/master/SpringBoot/springbootgettingstarted

 

mike6321/Spring

Contribute to mike6321/Spring development by creating an account on GitHub.

github.com

https://github.com/mike6321/Spring/tree/master/SpringBoot/junwoo-spring-boot-starter

 

mike6321/Spring

Contribute to mike6321/Spring development by creating an account on GitHub.

github.com