-
자동설정 만들기백기선(인프런 강의)/스프링 부트 개념과 활용 2020. 4. 6. 12:28반응형
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에 붙어 녛으면 다른 프로젝트에서 사용가능하다.
다만 같은 폴더내에 프로젝트를 만들어서 생성하게되면 아래와같은 오류가 발생이된다.
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을 하기 때문에 새로 만들어 준 Bean이 componentScan에 의해 먼저 등록이되고, 이후 EnableAutoconfiguration에 의해 덮어 쓰게 된다.
하지만 스프링부트 2.1부터 default로 ovveriding 옵션이 false로 설정이 되었기 때문에 error가 발생된다.
위와같은 오류를 방지하기 위해서는 아래와같이 @ConditionalOnMissingBean을 붙여 주면된다.
@ConditionalOnMissingBean은 componentScan이 우선시되게 해주는 기능이다. 즉 기존에 같은 이름으로 존재하는 Bean이 존재하지 않을 경우 만들겠다는 뜻이다.
@Configuration public class HolomanConfiguration { @Bean @ConditionalOnMissingBean public Holoman holoman() { Holoman holoman = new Holoman(); holoman.setHowLong(5); holoman.setName("홍길동"); return holoman; } }
maven clean과 install을 해서 코드 수정한 것을 받아서 스프링 부트를 실행시키면 아래와 같은 결과가 나오게 된다.
application.properties 설정
resources에 application.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값만 바꿔주면 된다.
반응형'백기선(인프런 강의) > 스프링 부트 개념과 활용' 카테고리의 다른 글
내장 웹서버 응용 - 컨테이너와 포트 (0) 2020.04.08 내장 웹 서버 이해 (0) 2020.04.07 스프링 부트 원리 - 자동설정 이해 (0) 2020.04.06 스프링 부트 개념과 활용 (0) 2020.04.02 의존성 관리 이해 (0) 2020.04.02