2021. 10. 6. 08:00ใBack-End ์์ ์ค/Spring Framework
๐ ๋ชฉ์ฐจ
01. [Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ
02. [Spring] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
03. [Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
04. [Spring] OCP์ DIP ๊ณ ๋ คํ๊ธฐ
05. [Spring] ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ - ์๋ก์ด ํ ์ธ ์ ์ฑ
๊ฐ๋ฐ
06. [Spring] AppConfig ๋ฆฌํฉํฐ๋ง
07. [Spring] Ioc, DI Container
08. [Spring] ์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
09. [Spring] ์ฑ๊ธํค ์ปจํ
์ด๋
10. [Spring] Component Scan And Auto wired Start
11. [Spring] ์์กด๊ด๊ณ ์ฃผ์
๋ฐฉ๋ฒ
12. [Spring] Bean Life Cycle Call Back
13. [Spring] Bean Scope
๐ ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋ ์ฃผ์
์คํ๋ง ๋น์ ๋ฑ๋กํ ๋ ์๋ฐ ์ฝ๋์ @Bean์ด๋, XML์ <bean> ๋ฑ์ ํตํด ์ค์ ์ ๋ณด์ ์ง์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ๋์ดํ ์ ์์๋ ๊ฒ์ด์์. ํ์ง๋ง, ์ด๋ ๊ฒ ๋ฑ๋กํด์ผ ํ ์คํ๋ง ๋น์ด ์์ญ, ์๋ฐฑ๊ฐ๋ผ๋ฉด? ๋๋ ํ๋ ๊ฒ์ด์์.
๊ฐ๋ฐ์๋ ๋ฐ๋ณต์ ์ซ์ดํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ธ ๊ฒ๋ ์์ด์!
๊ทธ๋์ ์คํ๋ง์ ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์๋์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด์์.
๋, ์์กด๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์ ํ๋ @Autowired๋ผ๋ ๊ธฐ๋ฅ๋ ์๋ต๋๋ค!
๐ AutoAppConfig.java ์ถ๊ฐ
์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ Class ์ ์ธ์ @ComponentScan์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
์์ ๊ฐ์ด ํ๋ฉด @Bean์ ์ฌ์ฉํ์ง ์์๋ ๋๋ต๋๋ค!
๐ก์ฐธ๊ณ :
์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ฉด @Configuration์ด ๋ถ์ ์ค์ ์ ๋ณด๋ ์๋์ผ๋ก ๋ฑ๋ก๋๋ค.
excludeFilters๋ ์คํ๋ง ๋น์ ๋ฑ๋กํ์ง ์์ ๋ด์ฉ์ ์ ์ธํ์ฌ ์ ์ธ ์ํฌ ๋ ์ฌ์ฉํ๋ค.
์ปดํฌ๋ํธ ์ค์บ์ @Component๊ฐ ๋ถ์ Class๋ฅผ ์ฐพ์์ ์คํ๋ง ๋น์ ๋ฑ๋กํด ์ฃผ๋ ๊ฒ์ด์์.
๐ก์ฐธ๊ณ :
@Configuration ์ญ์ ํด๋น ์์ค์ฝ๋ ๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด @Component๊ฐ ๋ถ์ด์๊ธฐ ๋๋ฌธ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
์ปดํฌ๋ํธ์ ์ค์บ ๋์์ด ๋๋๋ก ํ๊ณ ์ถ์ Class์๋ @Component๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ MemoryMemberRepository.java
๐ RateDiscountPolicy.java
๐ MemberServiceImpl.java
์์ Class์ ๋ชจ๋ @Component๋ฅผ ๋ถ์ฌ์ฃผ์๊ณ , MemberServiceImpl์๋ @Autowired๋ฅผ ์ถ๊ฐํด ์ฃผ์์ต๋๋ค.
@Bean์ ์ฌ์ฉํ๋ฉด ์ค์ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ง์ ์์ฑํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ์์กด๊ด๊ณ๋ ์ง์ ๋ช ์ํ ์ ์๋ ๊ฒ์ด์์.
ํ์ง๋ง, ์์ ๋ฐฉ๋ฒ๋๋ก ํ๊ฒ ๋๋ค๋ฉด ์ค์ ์ ๋ณด ์์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์กด๊ด๊ณ ์ฃผ์ ๋ ์ด ํด๋์ค ์์์ ํด๊ฒฐํด์ผ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฌ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ด @Autowired์ด๋๋๋ค!
๐ OrderServiceImpl.java
@Autowired๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์์์ ์ฌ๋ฌ ์์กด๊ด๊ณ๋ ํ๋ฒ์ ์ฃผ์ ๋ฐ์ ์ ์๋ ๊ฒ์ด์์!
๐ AutoAppConfigTest.java
@Component๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด๋ AnnotaionConfigApplicationContext๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ @Bean์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๊ฒ์ด์์. ์ด๋ฅผ ํตํด ์ค์ ์ ๋ณด๋ก AutoAppConfig ํด๋์ค๋ฅผ ๋๊ฒจ์ค ์ ์๋ต๋๋ค!
๐ Test ๊ฒฐ๊ณผ
์์ ๊ฐ์ด ์์ฃผ ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ต๋๋ค!
23:17:08.996 [Test worker] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'
23:17:09.125 [Test worker] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\01.Synology_Sync\Person\97.source_code\00.study\00.Inflearn\์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ\build\classes\java\main\hello\core\discount\RateDiscountPolicy.class]
23:17:09.129 [Test worker] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\01.Synology_Sync\Person\97.source_code\00.study\00.Inflearn\์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ\build\classes\java\main\hello\core\member\MemberServiceImpl.class]
23:17:09.130 [Test worker] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\01.Synology_Sync\Person\97.source_code\00.study\00.Inflearn\์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ\build\classes\java\main\hello\core\member\MemoryMemberRepository.class]
23:17:09.132 [Test worker] DEBUG org.springframework.context.annotation.ClassPathBeanDefinitionScanner - Identified candidate component class: file [D:\01.Synology_Sync\Person\97.source_code\00.study\00.Inflearn\์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ\build\classes\java\main\hello\core\orderImsi\OrderServiceImpl.class]
๊ทธ๋ ๋ค๋ฉด ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด ๊ด๊ณ ์ฃผ์ ์ด ์ด๋ป๊ฒ ๋์ํ๋ ๊ฒ์ผ๊น์?
๐ @ComponentScan
@ComponentScan์ @Component๊ฐ ๋ถ์ ๋ชจ๋ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ด์์.
์ด ๋, ์คํ๋ง ๋น์ ๊ธฐ๋ณธ ์ด๋ฆ์ ํด๋์ค๋ช ์ ์ฌ์ฉํ๋, ๋งจ ์ ๊ธ์๋ง ์๋ฌธ์๋ก ๋ฐ๊ฟ์ ๋ฑ๋กํ๋ ๊ฒ์ด์์.
- ๋น ์ด๋ฆ ๊ธฐ๋ณธ ์ ๋ต : MemberServiceImpl Class => memberServiceImpl
- ๋น ์ด๋ฆ ์ง์ ์ง์ : ๋ง์ฝ ์คํ๋ง ๋น์ ์ด๋ฆ์ ์ง์ ์ง์ ํ๊ณ ์ถ์ ์ ์๋์ ๊ฐ์ด ์ฌ์ฉ
-
@Component("[Spring Bean Name]")
-
๐ @Autowired ์์กด ๊ด๊ณ ์๋ ์ฃผ์
์์ฑ์์ @Autowired๋ฅผ ์ง์ ํ๊ฒ ๋๋ฉด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ ๊ฒ์ด์์.
์ด ๋, ๊ธฐ๋ณธ ์กฐํ ์ ๋ต์ ์๋ฃํ ํ์ (๊ฐ์ฒดํ)์ด ๊ฐ์ ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ ๊ฒ์ด์์.
getBean(MemberRepository.class)
์์ ์ฝ๋์ ๋น์ทํ๋ค๊ณ ๋ณด๋ฉด ๋ ๊ฒ์ด์์!
์์ฑ์์ ๋งค๊ฐ ๋ณ์(ํ๋ผ๋ฏธํฐ)๊ฐ ๋ง์๋ ๋ค ์ฐพ์์ ์๋์ผ๋ก ์ฃผ์ ํ๋ ๊ฒ์ด์์.
๐ ํ์ ์์น์ ๊ธฐ๋ณธ ์ค์บ ๋์
๐ ํ์ํ ํจํค์ง์ ์์ ์์น ์ง์
๋ชจ๋ ์๋ฐ ํด๋์ค๋ฅผ ๋ค ์ปดํฌ๋ํธ ์ค์บ์ ํ๊ฒ ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์๋ง ์์ฒญ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋ ๊ฒ์ด์์. ๊ทธ๋์ ๊ผญ ํ์ํ ์์น๋ถํฐ ํ์ํ๋๋ก ์ค์ ํด ์ค ์ ์๋ ๊ฒ์ด์์.
@ComponentScan(
basePackages = "hello.core",
}
์์ ์ฝ๋์์ basePackages๋ ํ์ํ ํจํค์ง์ ์์ ์์น๋ฅผ ์ง์ ํ๋ ๊ฒ์ด์์. ์ด ํจํค์ง๋ฅผ ํฌํจํด์ ํ์ ํจํค์ง๋ฅผ ๋ชจ๋ ํ์ํ๋๋ฐ, ๊ทธ ์ธ์ ๋ด์ฉ๋ค์ ํ์ํ์ง ์๋ ๊ฒ์ด์์.
๋ง์ฝ basePackages = {"hello.core", "hello.service"}์ ๊ฐ์ด ํด ์ฃผ์๋ค๋ฉด core์ serviceํ์ ๋ด์ฉ๋ค๋ง ๋ชจ๋ ํ์ํ ๊ฒ์ด์์. ๋ง์ฝ ์ด๊ฒ์ ์ง์ ํ์ง ์๊ฒ ๋๋ฉด @ComponentScan์ด ๋ถ์ ์ค์ ์ ๋ณด ํด๋์ค์ ํจํค์ง๊ฐ ์์ ์์น๊ฐ ๋๋ ๊ฒ์ด์์.
๊ถ์ฅ ์ฌํญ
ํจํค์ง ์์น๋ฅผ ์์ ๊ฐ์ด ๋ฐ๋ก ์ง์ ํ์ง ์๊ณ , ์ค์ ์ ๋ณด ํด๋์ค์ ์์น๋ฅผ ํ๋ก์ ํธ ์ต์๋จ์ ๋๊ฒ ๋๋ค๋ฉด ์ฐ๋ฆฌ ํ๋ก์ ํธ ๋ด์ ๋ด์ฉ๋ค๋ง ์ค์บ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ถ์ฅํ๋ค.
๋ง์ฝ ์๋์ ๊ฐ์ด ํ๋ก์ ํธ๊ฐ ๊ตฌ์ฑ๋์ด ์๋ค๋ฉด?
- com.hello
- com.hello.services
- com.hello.repository
com.hello => Project Start Root Package(Directory) ์ด ๊ณณ์ AppConfig๋ฑ๊ณผ ๊ฐ์ Main Configuration ์ ๋ณด๋ฅผ ๋๊ณ , @ComponentScan์ ๋ถ์ด๊ณ , basePackges๋ฅผ ์๋ต
์์ ๊ถ์ฅ์ฌํญ๋๋ก ํ๊ฒ ๋๋ฉด com.hello๋ฅผ ํฌํจํ ํ์ ๋ชจ๋ ๋ด์ฉ์ ์๋์ผ๋ก ์ปดํฌ๋ํธ ์ค์บ ๋์์ด ๋๋ ๊ฒ์ด์์. ๊ทธ๋ฆฌ๊ณ , ํ๋ก์ ํธ ๋ฉ์ธ ์ค์ ์ ๋ณด๋ ํ๋ก์ ํธ๋ฅผ ๋ํํ๋ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ต์๋จ ์์น(๋ฃจํธ)์ ๋๋ ๊ฒ์ด ์ข๋ต๋๋ค!
์ฐธ๊ณ ๋ก ์คํ๋ง ๋ถํธ ์ฌ์ฉ ์ ์คํ๋ง ๋ถํธ์ ๋ํ ์์ ์ ๋ณด์ธ @SpringBootApplication์ ์ด ํ๋ก์ ํธ ์์ ๋ฃจํธ ์์น์ ๋๋ ๊ฒ์ด ๊ด๋ก๋ผ๊ณ ํ๋ค์! ์ด ์ด๋ ธํ ์ด์ ์์๋ @ComponentScan์ด ๋ค์ด์๋ต๋๋ค!
๐ ์ปดํฌ๋ํธ ์ค์บ ๊ธฐ๋ณธ ๋์
์ปดํฌ๋ํธ ์ค์บ์ @Component์ ํจ๊ป ์๋ ๋ด์ฉ๋ ์ถ๊ฐ๋ก ํฌํจ ๋๋ ๊ฒ์ด์์.
- @Component : ์ปดํฌ๋ํธ ์ค์บ ์ ์ค์บ ๋นํ Class ์ ์ธ
- @Controller : ์คํ๋ง MVC ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ
- @Service : ์คํ๋ง ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉ
- @Repository : ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์์ ์ฌ์ฉ
- @Configuration : ์คํ๋ง ์ค์ ์ ๋ณด์์ ์ฌ์ฉ
์์ ํด๋์ค์ ์์ค ์ฝ๋๋ฅผ ์ดํด ๋ณด๋ฉด ๋ชจ๋ @Component๋ฅผ ํฌํจํ๋ ๊ฒ์ ์ ์ ์๋ ๊ฒ์ด์์.
@Component public @interface Controller {
}
@Component public @interface Service {
}
@Component public @interface Configuration {
}
๐ก์ฐธ๊ณ :
์ด๋ ธํ ์ด์ ๊ฐ์๋ ์์ ๊ด๊ณ๋ ์กด์ฌํ์ง ์์๋ฐ, ํน์ ์ด๋ ธํ ์ด์ ์ ๋ค๊ณ ์๋ ๊ฒ์ ์ธ์ํ ์ ์๋ ๊ฒ์ ์๋ฐ ์ธ์ด์ ๊ธฐ๋ฅ์ด ์๋๊ณ , ์คํ๋ง์ด ์ง์ํ๋ ๊ธฐ๋ฅ
์ปดํฌ๋ํธ ์ค์บ์ ์ฉ๋ ๋ฟ ์๋๋ผ ๋ค์ ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํ๋ง์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ํํ๋ ๊ฒ์ด์์.
- @Controller : ์คํ๋ง MVC Controller๋ก ์ธ์
- @Repository : ์คํ๋ง Data Access Layer๋ก ์ธ์ํ๊ณ , Data Layer์ Exception์ ์คํ๋ง Exception์ผ๋ก ๋ณํ
- @Configuration : ์คํ๋ง Configuration Infomation์ ์ธ์ํ๊ณ , ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ ์ ์งํ๋๋ก ์ฒ๋ฆฌ
- @Service : ํน๋ณํ ๊ธฐ๋ฅ์ ์์ผ๋, ๊ฐ๋ฐ์๋ค์ด ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์ฌ๊ธฐ์ ์๋ค๋ ๊ฒ์ ์๊ฒ ํ๊ธฐ ์ํด ์ฌ์ฉ
๐ก์ฐธ๊ณ :
useDefaultFilters Option์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ ธ ์๋๋ฐ, ์ด๊ฒ์ ๋๊ฒ ๋๋ฉด ๊ธฐ๋ณธ ์ค์บ ๋์๋ค ์ ์ธ
(๋จ์ ์ฐธ๊ณ ์ฌํญ)
๐ Filter
- includeFilters : ์ปดํฌ๋ํธ ์ค์บ ๋์ ์ถ๊ฐ ์ง์
- excludeFilters : ์ปดํฌ๋ํธ ์ค์บ ๋์ ์ ์ธ ์ง์
๐ ์ปดํฌ๋ํธ ์ค์บ ๋์ ์ถ๊ฐ ์ด๋ ธํ ์ด์
๐ ์ปดํฌ๋ํธ ์ค์บ ๋์ ์ ์ธ ์ด๋ ธํ ์ด์
๐ ์ปดํฌ๋ํธ ์ค์บ ๋์ ์ถ๊ฐํ ํด๋์ค(@MyIncludeComponent ์ ์ฉ)
๐ ์ปดํฌ๋ํธ ์ค์บ ๋์ ์ ์ธํ ํด๋์ค(@MyexcludeComponent ์ ์ฉ)
๐ ์ค์ ์ ๋ณด์ ์ ์ฒด ํ ์คํธ ์ฝ๋
์์ includeFilters์ MyIncludeComponent ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ BeanA๊ฐ ๋ฑ๋ก๋์๊ณ , excludeFilters์ MyExludeComponent ์ด๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ BeanB๋ ๋ฑ๋ก๋์ง ์๊ฒ ํ ๊ฒ์ด์์.
๐ FilterType Option
FilterType์๋ 5๊ฐ์ง Option์ด ์๋ ๊ฒ์ด์์.
- ANNOTION : Default, ์ด๋
ธํ
์ด์
์ ์ธ์ํด์ ๋์
- ์ :) org.example.SomeAnntaion
- ASSIGNABLE_TYPE : ์ง์ ํ Type๊ณผ ์์ Type์ ์ธ์ํด์ ๋์
- ์ :) org.example.SomeClass
- ASPECTJ : AspectJ Pattern ์ฌ์ฉ
- ์ :) org.example..*Service+
- REGEX : ์ ๊ท ํํ์ ์ฌ์ฉ
- ์ :) org\.example\.Default.*
- CUSTOM : TypeFilter ๋ผ๋ Interface๋ฅผ ๊ตฌํํด์ ์ฒ๋ฆฌ
- ์ :) org.example.MyTypeFilter
๐ BeanA๋ฅผ ๋นผ๊ณ ์ถ์ ๋์ ์์ ์ฝ๋
@ComponentScan(
includeFilters = { @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
},
excludeFilters = { @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class),
@Filter(type = FilterType.ASSIGNABLE_TYPE, classes = BeanA.class)}
)
๐ก์ฐธ๊ณ :
@Component๋ฅผ ์ฌ์ฉํด๋ ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์ includeFilters๋ฅผ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค.
excludeFilters๋ ์ฌ๋ฌ ์ด์ ๋ก ๊ฐํน ์ฌ์ฉํ ์๋ ์์ผ๋, ๋ง์ง๋ ์๋ค.
์ต๊ทผ ์คํ๋ง ๋ถํธ๋ ์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋๋ฐ, ์คํ๋ง ๊ธฐ๋ณธ ์ค์ ์ ์ต๋ํ ๋ง์ถ์ด ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๐ ์ค๋ณต ๋ฑ๋ก๊ณผ ์ถฉ๋
์ปดํฌ๋ํธ ์ค์บ์์ ๊ฐ์ ๋น ์ด๋ฆ์ ๋ฑ๋กํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๋ค์ ๋๊ฐ์ง ์ํฉ์ด ๋ฐ์ํ ์ ์๋ ๊ฒ์ด์์.
- ์๋ ๋น ๋ฑ๋ก VS ์๋ ๋น ๋ฑ๋ก
- ์๋ ๋น ๋ฑ๋ก VS ์๋ ๋น ๋ฑ๋ก
๐ ์๋ ๋น ๋ฑ๋ก VS ์๋ ๋น ๋ฑ๋ก
์ปดํฌ๋ํธ ์ค์บ์ ์ํด ์๋์ผ๋ก ์คํ๋ง ๋น์ด ๋ฑ๋ก๋๋๋ฐ, ๊ทธ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ์คํ๋ง์ Exception์ ๋ฐ์ ์ํค๋ ๊ฒ์ด์์.
ConflictiongBeanDefinitionException ๋ฐ์!
๐ ์๋ ๋น ๋ฑ๋ก VS ์๋ ๋น ๋ฑ๋ก
์๋ ๋น ๋ฑ๋ก๊ณผ ์๋ ๋น ๋ฑ๋ก์์ ๋น ์ด๋ฆ์ด ์ถฉ๋๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
@Component
public class MemoryMemberRepository implements MemberRepository {}
@Configuration
@ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {
@Bean(name = "memoryMemberRepository")
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
์ด๋ ๊ฒ ๋ ๊ฒฝ์ฐ์๋ ์๋์ผ๋ก ๋ฑ๋กํ ๋น์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๊ฒ ๋๋ ๊ฒ์ด๊ณ , ์๋ ๋น์ด ์๋ ๋น์ ์ฌ์ ์(Overriding)ํ๋ ๊ฒ์ด์์.
Overriding bean definition for bean 'memoryMemberRepository' with a different
definition: replacing
์๋ ๋น ๋ฑ๋ก์ ์์ ๊ฐ์ Log๊ฐ ๋จ๊ฒ ๋๋ต๋๋ค!
๐จ๐ซ ๊น์ํ ๊ฐ์ฌ๋์ ์กฐ์ธ
๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก ์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ๋ค๋ฉด ์๋ ๋ณด๋ค๋ ์๋์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ฉด ์ข์ต๋๋ค.
ํ์ง๋ง, ํ์ค์ ๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก ์ค์ ํด์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ๋ณด๋ค ์ฌ๋ฌ ์ค์ ๋ค์ด ๊ผฌ์ฌ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ์ ๋ง ์ก๊ธฐ ์ด๋ ค์ด Bug๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋๊ณ , ์ด๋ฌํ ์ก๊ธฐ ์ด๋ ค์ด Bug๋ ํญ์ ์ ๋งคํฉ๋๋ค.
๊ทธ๋์ ์คํ๋ง ๋ถํธ์์๋ ์๋ ๋น ๋ฑ๋ก๊ณผ ์๋ ๋น ๋ฑ๋ก์ด ์ถฉ๋์ด ๋๋ฉด Exception์ด ํฐ์ง๋๋ก ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํด ๋์์ต๋๋ค.
Consider renaming one of the beans or enabling overriding by setting
spring.main.allow-bean-definition-overriding=true
์์ Exception์ ์๋ ๋น๊ณผ ์๋ ๋น ๋ฑ๋ก ์ ์ถฉ๋์ด ๋๋ฉด ์คํ๋ง ๋ถํธ์์ ํฐํธ๋ฆฌ๋ ๋ด์ฉ์ธ ๊ฒ์ด์์.
spring.main.allow-bean-definition-overriding=true
์ ๋ด์ฉ์ application.properties์์ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด Exception์ด ํฐ์ง์ง ์๋๋ต๋๋ค!
spring.main.allow-bean-definition-overriding=false
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์ จ๋์? ๊ตฌ๋ ๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช ๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค.
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Bean Life Cycle Call Back (0) | 2021.10.08 |
---|---|
[Spring] ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ (0) | 2021.10.07 |
[JPQL] left ( outer ) join (0) | 2021.10.05 |
[JPA] @ManyToOne (0) | 2021.10.05 |
[Spring] ์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2021.10.05 |