ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자동설정 만들기
    백기선(인프런 강의)/스프링 부트 개념과 활용 2020. 4. 6. 12:28
    반응형

    https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-developing-auto-configuration

     

    Starter와 Autoconfigure

    • Xxx-Spring-Boot-Autoconfigure 모듈: 자동 설정
    • Xxx-Spring-Boot-Starter 모듈: 필요한 의존성 정의
    • 그냥 하나로 만들고 싶을 때는?
      • Xxx-Spring-Boot-Starter

     

    자동설정 구현 - 의존성 추가

    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>
    
    <!-- 위에 추가해준 2개의 의존성 버전 관리를 하기 위해서 작성  -->
    <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>

     

    Holoman, HolomanConfiguration 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 + "]";
    	}
    
    }

     

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

     

    설정하는 대상이 되는 클래슨느 다른 프로젝트에 있는 경우가 많다. 다른 프로젝트에 잇는 어떤 라이브러리에 대한 자동 설정파일을 또 다른 프로젝트에서 만드는것이 보통이다.

     

     

     

    spring.factories 파일 생성

    더보기

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 패키지이름.Configuration파일이름

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
     kr.co.study2.HolomanConfiguration

    위와같이 설정해 주면 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 이 key에 해당하는 것을 스프링 부트 EnableAutoConfiguration이 켜져있을 경우 적어준 설정파일(Configuration파일)을 자동으로 읽어온다.

     

    마지막으로 mvn install 해준다.

    [INFO] Scanning for projects...
    [INFO] 
    [INFO] --------------< me.whiteship:spring-boot-starter-parent >---------------
    [INFO] Building spring-boot-starter-parent 1.0-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ spring-boot-starter-parent ---
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] Copying 1 resource
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ spring-boot-starter-parent ---
    [INFO] Changes detected - recompiling the module!
    [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
    [INFO] Compiling 2 source files to C:\spring\worksapce\test\SpringBootStudy_test\target\classes
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ spring-boot-starter-parent ---
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory C:\spring\worksapce\test\SpringBootStudy_test\src\test\resources
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ spring-boot-starter-parent ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO] 
    [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ spring-boot-starter-parent ---
    [INFO] 
    [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ spring-boot-starter-parent ---
    [INFO] Building jar: C:\spring\worksapce\test\SpringBootStudy_test\target\spring-boot-starter-parent-1.0-SNAPSHOT.jar
    [INFO] 
    [INFO] --- maven-install-plugin:2.4:install (default-install) @ spring-boot-starter-parent ---
    [INFO] Installing C:\spring\worksapce\test\SpringBootStudy_test\target\spring-boot-starter-parent-1.0-SNAPSHOT.jar to C:\Users\rlawl\.m2\repository\me\whiteship\spring-boot-starter-parent\1.0-SNAPSHOT\spring-boot-starter-parent-1.0-SNAPSHOT.jar
    [INFO] Installing C:\spring\worksapce\test\SpringBootStudy_test\pom.xml to C:\Users\rlawl\.m2\repository\me\whiteship\spring-boot-starter-parent\1.0-SNAPSHOT\spring-boot-starter-parent-1.0-SNAPSHOT.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  1.683 s
    [INFO] Finished at: 2020-04-06T22:49:48+09:00
    [INFO] ------------------------------------------------------------------------
    [WARNING] The requested profile "pom.xml" could not be activated because it does not exist.
    

     

    자동설정 만들기 2부 - @ConfigurationProperties

    다른 프로젝트에서 Bean 사용

    아래의 pom.xml의 부분을 복사한다.

    <groupId>me.whiteship</groupId>
    <artifactId>js-spring-boot-starter-parent</artifactId>
    <version>1.0-SNAPSHOT</version>

     

     

    위의 정보를 다른 프로젝트 pom.xml에 붙어 녛으면 다른 프로젝트에서 사용가능하다.

    maven에 저장

     

    다만 같은 폴더내에 프로젝트를 만들어서 생성하게되면 아래와같은 오류가 발생이된다. 

     

    같은 폴더 안 프로젝트로 설정 시

    ApplicationRunner는 스프링부트 애플리케이션이 만들어진 후 실행되었을 때 자동으로 실행되는 Bean을 만들고 싶을  때 사용한다.

     

    @SpringBootApplication
    public class HolomanRunner implements ApplicationRunner{
    
    	@Autowired
    	Holoman holo;
    
    	@Override
    	public void run(ApplicationArguments args) throws Exception {
    		System.out.println(holo);
    	}
    	
    }

     

    코드 실행 결과

     

    만약 해당프로젝트에 Holoman으로된 Bean이 이미 등록되면 어떻게 될까??

    @SpringBootApplication
    public class HolomanRunner implements ApplicationRunner{
    
    	@Autowired
    	Holoman holo;
    
    
    	@Override
    	public void run(ApplicationArguments args) throws Exception {
    		System.out.println(holo);
    	}
    	
    	@Bean
    	public Holoman holoman() {
    		Holoman holoman = new Holoman();
    		holoman.setName("kjs");
    		holoman.setHowLong(30);
    		return holoman;
    	}
    }

    아래와 같은 오류가 발생할 것이다.

    Description:
    
    Web server failed to start. Port 8080 was already in use.
    
    Action:
    
    Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
    
    2020-04-06 23:38:51.898  INFO 22760 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

    스프링부트는 Bean을 2번 등록한다. 먼저 componentScan을 하고 이후 EnableAutoconfiguration을 하기 때문에 새로 만들어 준 BeancomponentScan에 의해 먼저 등록이되고, 이후 EnableAutoconfiguration에 의해 덮어 쓰게 된다. 

    하지만 스프링부트 2.1부터 default로 ovveriding 옵션이 false로 설정이 되었기 때문에 error가 발생된다.

     

    위와같은 오류를 방지하기 위해서는 아래와같이 @ConditionalOnMissingBean을 붙여 주면된다.

    @ConditionalOnMissingBeancomponentScan이 우선시되게 해주는 기능이다. 즉 기존에 같은 이름으로 존재하는 Bean이 존재하지 않을 경우 만들겠다는 뜻이다.

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

     

    maven cleaninstall을 해서 코드 수정한 것을 받아서 스프링 부트를 실행시키면 아래와 같은 결과가 나오게 된다.

    결과

    application.properties 설정

    resourcesapplication.properties을 생성한 후 아래와 같이 holoman에 값을 입력해준다.

    properties를 사용하여 값을 변경할라면 properties에 대해서 정의를 해야 한다.

    pom.xml에 의존성을 추가한다.(sts에서 프로퍼티 자동완성 지원함!)

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
      <optional>true</optional>
    </dependency>

     

    HolomanProperties.java파일을 만들어 준다. 이때 이 class에 ConfigurationProperties을 붙여주고 사용할 Bean이름을 넣어준다.

    @ConfigurationProperties("holoman")
    public class HolomanProperties {
    	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;
    	}
    }

     

    기존에 만들었던 HolomanConfiguration class에 @EnableConfigurationProperties과 괄호안에 아까 만들어준 propery파일을 설정해 준다.

    @Configuration
    @EnableConfigurationProperties(HolomanProperties.class)
    public class HolomanConfiguration {
    	@Bean
    	@ConditionalOnMissingBean
    	public Holoman holoman(HolomanProperties properties) {
    		Holoman holoman = new Holoman();
    		holoman.setHowLong(properties.getHowLong());
    		holoman.setName(properties.getName());
    		return holoman;
    	}
    }

    그러면 ovvrride해서 Bean을 새로 만들 필요 없이 application.properties값만 바꿔주면 된다.

     

    반응형
Designed by Tistory.