2020-01-04 00:10:06.508 INFO 2968 --- [ main] com.example.demo2.Demo2Application : Starting Demo2Application on park-PC with PID 2968 (started by park in D:\Dropbox\프리랜서\2020\demo2) 2020-01-04 00:10:06.514 INFO 2968 --- [ main] com.example.demo2.Demo2Application : No active profile set, falling back to default profiles: default 2020-01-04 00:10:07.687 INFO 2968 --- [ main] com.example.demo2.Demo2Application : Started Demo2Application in 1.853 seconds (JVM running for 3.188) 2020-01-04 00:10:07.693 INFO 2968 --- [ main] com.example.demo2.Demo2Application : demo2 : tester.getValue() : demo1 2020-01-04 00:10:07.695 INFO 2968 --- [ main] com.example.demo1.Demo1Application : demo1 : tester.getValue() : demo1
demo1과 demo2의 값이 demo1로 출력되는 것을 확인. demo1 : tester.getValue 은 demo2에 포함되는 코드가 아님에도 출력됐음을 확인.
4.2. 시나리오2
Demo2에 application.yml 추가 (empty)
Demo2Application 실행
1 2 3 4 5 6 7 8 9
2020-01-04 00:16:29.628 INFO 14512 --- [ main] com.example.demo2.Demo2Application : Starting Demo2Application on park-PC with PID 14512 (started by park in D:\Dropbox\프리랜서\2020\demo2) 2020-01-04 00:16:29.636 INFO 14512 --- [ main] com.example.demo2.Demo2Application : No active profile set, falling back to default profiles: default 2020-01-04 00:16:30.569 WARN 14512 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demo2Application': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demo1Tester': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'test.example.value'in value "${test.example.value}" 2020-01-04 00:16:30.583 INFO 14512 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2020-01-04 00:16:30.623 ERROR 14512 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'demo2Application': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demo1Tester': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'test.example.value'in value "${test.example.value}"
test.example.value 값이 존재하지 않아 Spring boot 실행 시 에러 발생
4.3. 시나리오3
Demo2에 application.yml에 값 추가
Demo2Application 실행
demo2/application.yml
1 2 3
test: example: value:demo2
결과
1 2 3 4 5
2020-01-04 00:18:22.742 INFO 19544 --- [ main] com.example.demo2.Demo2Application : Starting Demo2Application on park-PC with PID 19544 (started by park in D:\Dropbox\프리랜서\2020\demo2) 2020-01-04 00:18:22.750 INFO 19544 --- [ main] com.example.demo2.Demo2Application : No active profile set, falling back to default profiles: default 2020-01-04 00:18:23.970 INFO 19544 --- [ main] com.example.demo2.Demo2Application : Started Demo2Application in 1.969 seconds (JVM running for 3.285) 2020-01-04 00:18:23.973 INFO 19544 --- [ main] com.example.demo2.Demo2Application : demo2 : tester.getValue() : demo2 2020-01-04 00:18:23.974 INFO 19544 --- [ main] com.example.demo1.Demo1Application : demo1 : tester.getValue() : demo2
demo1과 demo2의 값이 demo2로 출력되는 것을 확인. demo1 : tester.getValue 은 demo2에 포함되는 코드가 아님에도 출력됐음을 확인.
4.4. 결론
jar 내부 application.yml 은 @ComponentScan 시 값이 읽힐 수 있다.
다만 jar를 import 하는 application의 application.yml이 아예 존재하지 않아야 한다.
위의 테스트에서 자꾸 demo2에 포함되지 않는 demo1의 코드가 실행되는 것을 알 수 있다. 이는 @ComponentScan의 basePackages에 com.example.demo1 로 설정되어있기 때문이다. (원하지 않는 Demo1Application이 실행될 수 있다는 이야기다.) 따라서 다른 Application의 Component를 사용할 경우에는 최소한의 범위로 선언해서 사용할 수 있도록 해야한다.
2020-01-04 00:23:49.949 INFO 10644 --- [ main] com.example.demo2.Demo2Application : Starting Demo2Application on park-PC with PID 10644 (started by park in D:\Dropbox\프리랜서\2020\demo2) 2020-01-04 00:23:49.954 INFO 10644 --- [ main] com.example.demo2.Demo2Application : No active profile set, falling back to default profiles: default 2020-01-04 00:23:51.010 INFO 10644 --- [ main] com.example.demo2.Demo2Application : Started Demo2Application in 1.862 seconds (JVM running for 3.134) 2020-01-04 00:23:51.012 INFO 10644 --- [ main] com.example.demo2.Demo2Application : demo2 : tester.getValue() : demo2
com.example.demo1.logic 으로 선언했을 경우 Demo1Application 이 실행되지 않는것을 확인할 수 있다.