Springboot 자동설정 이해 2

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

1. 자동설정의 문제점

package com.summit.dev.springboot;

import me.summit.Holoman;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class SpringbootApplication {

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

    @Bean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setName("JS");
        holoman.setHowLong(120);
        return holoman;
    }
}
  • 결과는 아래 로그 처럼 override 되지 않고 기존의 값이 출력 됨
....<생략>....
2020-04-05 09:58:22.546  INFO 5508 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-04-05 09:58:22.552  INFO 5508 --- [           main] c.s.d.springboot.SpringbootApplication   : Started SpringbootApplication in 2.97 seconds (JVM running for 3.959)
Holoman{name='Jacob', howLong=5}
  • 이 문제는 어떻게 해결해야 하나?

Info Notice: 참고로 springboot 2.1 부터는 overriding 옵션 기본값이 false로 바뀌어서 application.yml 이나 application.propeties 파일에 spring.main.allow-bean-definition-overriding: true 옵션 추가해 주어야 예제 수행이 가능

2. 해결책

  • summit-spring-boot-starter에 정의한 HolomanConfiguration에 @ConditionalOnMissingBean을 추가하여 조건에 따라 설정 되도록
package me.summit;

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

@Configuration
public class HolomanConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setName("Jacob");
        holoman.setHowLong(5);
        return holoman;
    }
}
  • @ConditionalOnMissionBean을 추가한 summit-spring-boot-starter의 pom.xml에 version을 2.0-SNAPSHOT으로 바꾸어 다시 maven install 함

  • 참조할 프로젝트의 pom.xml에서 summit-spring-boot-starter의 버전을 2.0-SNAPSHOT바꾸어 결과 확인

  • 실행결과 ovrride 한 내용을 바뀐 것을 확인

2020-04-05 10:09:25.679  INFO 5578 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-04-05 10:09:25.685  INFO 5578 --- [           main] c.s.d.springboot.SpringbootApplication   : Started SpringbootApplication in 3.893 seconds (JVM running for 5.733)
Holoman{name='JS', howLong=120}

3. 또 다른 문제점

  • 그럼, 클래스 override 할 때마다 아래처럼 클래스를 새로 생성하지 않고 만들 수는 없는가?
@SpringBootApplication
public class SpringbootApplication {

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

    @Bean      ----------------------> 항상 이렇게 해야 하는가?
    public Holoman holoman() {
        Holoman holoman = new Holoman();
        holoman.setName("JS");
        holoman.setHowLong(120);
        return holoman;
    }
}

4. 또 다른 문제점의 해결책

  • 이 문제 해결은 properties 파일에 있는 값을 읽도록 수정하여 변경이 필요한 경우, properties 파일만 수정하면 되도록 하면 됨

  • 먼저, summit-spring-boot-starter의 resources 아래에 application.properties 를 만들고 거기에 아래 내용을 작성함

holoman.name = hangwn
holoman.howlong = 365
  • Propeties 활용을 위한 클래스를 아래와 같이 작성
package me.summit;

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

@ConfigurationProperties("holoman")
public class HolomanProerties {
    private String name;
    private 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;
    }
}
  • 프로퍼티 키-값 자동 완성을 위해 pom.xml에 아래 dependency를 추가
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
	<optional>true</optional>
</dependency>
  • Holomanconfiguration에 @EnableConfigurationProperties 설정
  • @EnableConfigurationProperties로 가져온 properties 값을 활용하도록 소스 수정
@Configuration
@EnableConfigurationProperties(HolomanProerties.class)
public class HolomanConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public Holoman holoman(HolomanProerties properties) {
        Holoman holoman = new Holoman();
        holoman.setName(properties.getName()); -------> properties  사용
        holoman.setHowLong(properties.getHowlong()); ---> properties  사용 
        return holoman;
    }
}
  • 검증을 위핸 summit-spring-boot-starter-3.0-SNAPSHOT.jar를 만들고 해당 jar를 사용할 다른 프로젝트의 pom.xml에 dependency 설정
  • 타 프로젝트의 application.properties에 아래와 같이 설정하여 적용되는지 로그 확인
holoman.howlong= 12000
holoman.name= holoman-two
  • 적용 결과
2020-04-05 16:40:45.504  INFO 6003 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-04-05 16:40:45.511  INFO 6003 --- [           main] c.s.d.springboot.SpringbootApplication   : Started SpringbootApplication in 3.092 seconds (JVM running for 4.086)
Holoman{name='holoman-two', howLong=12000}

카테고리:

업데이트:

댓글남기기