๐ค์คํ๋ง ์ปดํฌ๋ํธ ์ค์บ์ด๋?
- ์ค์ ์ ๋ณด ํด๋์ค์
@ComponentScan
์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด@Bean
์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๋ฅผ ์ ์ํด์ฃผ์ง ์์๋ ์๋์ผ๋ก ์คํ๋ง์ด@Component
์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค์ ๊ฐ์ฒด๋ค์ ๋น์ผ๋ก ๋ฑ๋กํด์ค - ์๋ ๋ฑ๋ก์์ ๋ฉ์๋๋ช ์ ๋น์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํจ
- ์ปดํฌ๋ํธ ์ค์บ ๋ฐฉ์์ ํด๋์ค ์ด๋ฆ์ ์๊ธ์๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊ฟ์ ์ฌ์ฉํจ
๋น ์ด๋ฆ | ๋น ๊ฐ์ฒด |
---|---|
createOrderServiceImpl | CreateOrderServiceImpl@x01 |
memberRepositoryImpl | MemberRepositoryImpl@x02 |
@Bean("customName")
์ฒ๋ผ ๊ธฐ๋ณธ๊ฐ ๋์ ์ฌ์ฉํ ๋น์ ์ด๋ฆ์ ์ง์ ํ ์ ์๋ ๊ฒ์ฒ๋ผ @Component("customName")
์ผ๋ก ๋น์ ์ด๋ฆ์ ์ง์ ์ง์ ํด์ค ์ ์์ต๋๋ค.
์๋์ผ๋ก ๋น์ ๋ฑ๋กํ ๋๋ ์๋์ฒ๋ผ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
public class AppConfig {
@Bean
public CreateOrderService createOrderService() {
return new CreateOrderServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepositoryImpl();
}
}
- ์ปดํฌ๋ํธ ์ค์บ์ผ๋ก ๋ฑ๋ก๋ ๋น์
@Autowired
์ด๋ ธํ ์ด์ ์ ํตํด์ ํ์ํ ์์กด ๊ฐ์ฒด๋ค์ ์๋ ์ฃผ์ ๋ฐ์
๐ฉ @ComponentScan์ ๋ฒ์
@ComponentScan
์ด๋ ธํ ์ด์ ์ ๋ถ์๋ค๊ณ ํด์ ํ๋ก์ ํธ์ ๋ชจ๋ ํด๋์ค๋ฅผ ์ปดํฌ๋ํธ ์ค์บ ํ์ง๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ธ๋ฐ์์ด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ํ์ํด์ผ ๋๋ฏ๋ก ๋นํจ์จ์ - ์ด๋ ธํ ์ด์ ์ ์๋ฌด๋ฐ ์ต์ ๋ ์ฃผ์ง ์์ผ๋ฉด ํด๋น ํด๋์ค๊ฐ ์ ์๋ ํจํค์ง๋ถํฐ ๊ทธ ํ์ ํจํค์ง๊น์ง ์ปดํฌ๋ํธ ์ค์บ
@Configuration
@ComponentScan(
basePackages = "hello.service"
)
public class AutoAppConfig {
}
- ์ต์ ์ ์ฃผ๋ฉด ํด๋น ํจํค์ง๋ถํฐ ํ์ ํจํค์ง๊น์ง ๋ชจ๋ ์ค์บ
- `basePackages = {"hello.repository", "hello.service"}` ์ฒ๋ผ ๋ฐฐ์ด ํ์์ผ๋ก ์์ ์์น๋ฅผ ์ฌ๋ฌ๊ฐ ์ง์ ๊ฐ๋ฅ
์ปดํฌ๋ํธ ์ค์บ ์ค์ ์ ๋ณด๋ ํ๋ก์ ํธ์ ํต์ฌ์ ์ธ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ ์ต์๋จ์ ๋๊ณ ์๋ฌด๋ฐ ์ต์ ๋ ์ฃผ์ง ์๋ ๊ฒ์ด ์ด์์ . ์คํ๋ง ๋ถํธ๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉ
์คํ๋ง ๋ถํธ ํ๋ก์ ํธ์ ํ๋ก์ ํธ ์ต์๋จ์ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ ๋ฉ์ธ ๋ฉ์๋๊ฐ ์๋ ํด๋์ค๊ฐ ์์ต๋๋ค.
์ด ํด๋์ค๋ @SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ์๋๋ฐ ์ด ์ด๋ ธํ ์ด์ ์ @ComponentScan ์ด๋ ธํ ์ด์ ์ ํฌํจํ๊ณ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก, ์๋ฐ ์ด๋ ธํ ์ด์ ์๋ ์์ ๊ด๊ณ๊ฐ ์์ง๋ง ์คํ๋ง์์ ์ด๋ ธํ ์ด์ ์ด ๋ค๊ณ ์๋ ์ด๋ ธํ ์ด์ ์ ์ธ์ํ๋ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
๐ฉ ํํฐ - ์ค์บ ๋์ ์ ์ธ
์ปดํฌ๋ํธ ์ค์บ์์ ํน์ ๋์์ ์ ์ธํ๊ณ ์ถ์ ํน์ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด @ComponentScan
์ excludeFilters
์ @Filter
์ด๋
ธํ
์ด์
์
๋๋ค.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyExcludeComponent {
}
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
classes = MyExcludeComponent.class)
)
public class AppConfigWithFilter {
}
- type ์์ฑ์ FilterType.ANNOTATION, classes ์์ฑ์ ํํฐ๋ก ์ฌ์ฉํ ์ด๋ ธํ ์ด์ ํ์ ์ ์ค
- @MyExcludeComponent ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ ์ปดํฌ๋ํธ ์ค์บ ๋์์์ ์ ์ธ๋ ๊ฒ
- ์ฌ๋ฌ ๊ฐ์ ์ง์ ํ๊ณ ์ถ์ผ๋ฉด classes ์์ฑ์ ๋ฐฐ์ด ํํ๋ก ์ธ ์ ์์
FilterType
์๋ ANNOTATION์ ํฌํจํด์ 5๊ฐ์ง ์ต์
์ ์ ๊ณต
- ANNOTATION: ์ด๋ ธํ ์ด์ ์ ์ง์ (๊ธฐ๋ณธ๊ฐ)
- ASSIGNABLE_TYPE: ์ง์ ํ ํ์ ๊ณผ ์์ ํ์ ์ ์ง์
- ASPECTJ: AspectJ ํจํด์ ์ฌ์ฉํด์ ์ง์
- REGEX: ์ ๊ท ํํ์์ ์ฌ์ฉํด์ ์ง์
- CUSTOM: TypeFilter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์ฒ๋ฆฌ
๐ฉ์ปดํฌ๋ํธ ์ค์บ ๋์
๋ค์ ์ด๋ ธํ ์ด์ ์ ๋ถ์ธ ํด๋์ค๋ ์ปดํฌ๋ํธ ์ค์บ ๋์์ด ๋ฉ๋๋ค.
- @Component: ์ปดํฌ๋ํธ ์ค์บ ๋์์ผ๋ก ์ง์
- @Controller: ์คํ๋ง MVC ํจํด์์ Controller์ ํด๋น
- @Service: ์คํ๋ง ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ์ ํด๋น
- @Repository: ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ํด๋น. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ธ๋ฅผ ์คํ๋ง ์์ธ๋ก ๋ณํ
- @Aspect: ์คํ๋ง AOP ์ฒ๋ฆฌ์ ํด๋น
- @Configuration: ์คํ๋ง ์ค์ ์ ๋ณด์ ํด๋น
๐ฉ ์ปดํฌ๋ํธ ์ค์บ ์ถฉ๋
1. ์ด๋ฆ ์ถฉ๋
ํ์ ์ด ๋ค๋ฅด๊ณ ์ด๋ฆ๋ง ๊ฐ์ ํด๋์ค๊ฐ ๋ชจ๋ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ด ์ํ๋ก ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ฉด ConflictingBeanDefinitionException์ด ํฐ์ง๋ค. ์ด ๋ฌธ์ ๋ @Component ์ด๋ ธํ ์ด์ ์ ํตํด ์ด๋ฆ์ ๋ฐ๊ฟ์ฃผ๋ฉด ํด๊ฒฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
2. ๊ฐ์ ํ์ ์ถฉ๋
@Component
public class MemberRepository {
}
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository() {
return new MemberRepository();
}
}
์๋ ๋ฑ๋กํ ๋น๊ณผ ์ปดํฌ๋ํธ ์ค์บ์ด ๋ ๋น์ด ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์๋ ๋ฑ๋กํ ๋น์ด ์ปดํฌ๋ํธ ์ค์บ์ด ๋ ๋น์ ๋ฎ์ด์๋๋ค. ์ฆ, MemberRepository
ํ์
์ ๋น์ ๋ ๊ฐ ๋ฑ๋กํ์ง๋ง ์ต์ข
์ ์ผ๋ก ์ปจํ
์ด๋์ ํ ๊ฐ๋ง ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋, ์ด๋ ๊ฒ ์ปดํฌ๋ํธ ์ค์บ์ด ๋ ๋น์ด ๋ฎ์ด์์์ ธ์ ์ฌ๋ผ์ง๋ ๊ฒ์ ์๋ํ์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ฉฐ ์ก๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ์ ์์ธ์ด ๋ ์ ์์ต๋๋ค.
๊ทธ๋์ ์คํ๋ง ๋ถํธ ์ต์ ๋ฒ์ ์์๋ ์๋ ๋ฑ๋ก๊ณผ ์ปดํฌ๋ํธ ์ค์บ์ด ์ถฉ๋ํ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค๋๋ก ๊ธฐ๋ณธ๊ฐ์ ๋ฐ๊ฟจ์ต๋๋ค.. `application.properties` ํ์ผ์ `spring.main.allow-bean-definition-overriding=true` ์ต์ ์ ์ค์ ๊ธฐ๋ณธ๊ฐ์ ๋ฎ์ด์ฐ๋ ํ์๋ฅผ ํ์ฉํ ์ ์์ง๋ง ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository2() {
return new MemberRepository();
}
}
์์ ๊ฐ์ด ๊ธฐ๋ณธ์ด๋ฆ ๋์ ๋ค๋ฅธ ์ด๋ฆ์ ์ง์ ํด์ฃผ๋ฉด ๊ฐ์ ํ์
์ ๋น์ด ์ถฉ๋ ์์ด ๋ ๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ MemberRepository ํ์
๋ง์ผ๋ก๋ ๋น์ ๊ตฌ๋ณํ ์ ์์ผ๋ฏ๋ก @Qualifier
์ด๋
ธํ
์ด์
์ผ๋ก ์๋ง์ ๋น์ ์ง์ ํด์ค์ผ ํฉ๋๋ค.
๐ญ๊ธ ์ ๋ฆฌ
- ์ปดํฌ๋ํธ ์ค์บ์ ์๋์ผ๋ก ๋น์ ๊ฒ์ํ๊ณ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ค์ ํ์ผ์ด๋ ์๋์ผ๋ก ๋น์ ๋ฑ๋กํ๋ ๊ณผ์ ์ ์ค์ ๋๋ค.
- ๋น์ ์ค๋ณต๋ฑ๋กํ๋ ๊ฒ์ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. ํ์ง๋ง ์ค๋ณต๋ฑ๋ก๊ณผ ์๋๋ฑ๋ก์ ์์ธ๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค.
'๐์คํฐ๋ > ์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง AOP (0) | 2024.05.19 |
---|---|
์คํ๋ง MVC ๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ํต์ฌ ๊ฐ๋ (0) | 2024.05.19 |
[์คํ๋ง] - ์คํ๋ง ์ปจํ ์ด๋(Spring Container) (0) | 2024.04.08 |