์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ ๊ฐ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
1. ์ปดํฌ๋ํธ ์ค์บ์ด๋?
@Configuration
public class AppConfig {
@Bean
public OrderService orderService() {
System.out.println("call orderService()");
return new OrderServiceImpl(discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
System.out.println("call discountPolicy()");
return new FixDiscountPolicy();
}
}
์ง๊ธ๊น์ง๋ ์ค์ ์ ๋ณด ํ์ผ์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ์ง์ ๋์ดํด์ผ ํ๋ค. ์ด๋ฌํ ๋ฐฉ์์ ๋ฑ๋กํ ๋น์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ๋ฒ๊ฑฐ๋กญ๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋์ ์คํ๋ง์์๋ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋, ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์คํ๋ง ๋น์ ์๋์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
์ปดํฌ๋ํธ ์ค์บ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด, ์ค์ ์ ๋ณด ํ์ผ์ @ComponentScan
์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. @ComponentScan
์ @Component
๊ฐ ๋ถ์ ํด๋์ค๋ค์ ์๋์ผ๋ก ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ์ญํ ์ ํ๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
์ด์ ์์ ๊ฐ์ด ์ด์ ์ ์์ฑํ๋ OrderServiceImpl
, FixDiscountPolicy
, RateDiscountPolicy
ํด๋์ค์ @Component
์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๊ฐ ํด๋์ค๋ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค.
OrderServiceImpl
์ ์์ฑ์์ ๋ถ์ @Autowired
๋ ์์กด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํด์ฃผ๋ ์ด๋
ธํ
์ด์
์ผ๋ก, ์ ์ฝ๋์์๋ discountPolicy
๋น์ ์ฐพ์์ ์ฃผ์
ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์ด์ ์๋ AppConfig์์ ์์กด๊ด๊ณ๋ฅผ ์ง์ ๋ช
์ํ์ง๋ง, ์ด์ ๋ ์ค์ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ @Autowired
๋ฅผ ํตํด ์์กด๊ด๊ณ ์ฃผ์
๋ ํด๋์ค ๋ด๋ถ์์ ํด๊ฒฐํด์ฃผ์ด์ผ ํ๋ค.
2. ์ปดํฌ๋ํธ ์ค์บ์ ๋์ ๊ณผ์
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด๋ณด์.
์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด@ComponentScan
์ ์ํด @Component
๊ฐ ๋ถ์ ํด๋์ค๋ ์ ๋ถ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค. ์คํ๋ง ๋น์ ์ด๋ฆ์ ํด๋์ค๋ช
์ ๋งจ ์๊ธ์๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พผ ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ @Autowired
๊ฐ ๋ถ์ด ์๋ ๊ณณ์๋ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ์
์ด ์ผ์นํ๋ ์คํ๋ง ๋น์ ์ฐพ์์ ์๋์ผ๋ก ์ฃผ์
ํด์ค๋ค.
3. ์ปดํฌ๋ํธ ์ค์บ์ ๋์
์ปดํฌ๋ํธ ์ค์บ์ @Component
๊ฐ ๋ถ์ ํด๋์ค ๋ง๊ณ ๋ ๋ช๋ช ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋๋ฐ, ๊ฐ๊ฐ @Controller
, @Service
, @Repository
, @Configuration
์ด๋ค. ํด๋น ์ธํฐํ์ด์ค๋ค์ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก @Component
๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค.
@ComponentScan(basePackages = "hello.spring")
@ComponentScan
์ ํด๋์ค๋ค์ ์ ๋ถ ๋ค์ ธ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ํด๋์ค๋ฅผ ์ฐพ์๋ธ๋ค.
์ด์ฒ๋ผ ๋ชจ๋ ํด๋์ค๋ฅผ ํ์ํ๋ ค๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์, basePackages
์์ฑ์ ํตํด ํ์ ์์ ์์น๋ฅผ ์ง์ ํ ์ ์๋ค. ์์ ๊ฒฝ์ฐ์๋ hello.spring
์ ํจํค์ง์ ๊ทธ ํ์ ํจํค์ง๊ฐ ํ์ ๋์์ด ๋๋ค. ํ์ ์์ ์์น๋ฅผ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์๋, @ComponentScan
์ด ๋ถ์ ์ค์ ์ ๋ณด ํด๋์ค๊ฐ ์ํ ํจํค์ง๊ฐ ์์ ์์น๊ฐ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ํ์ ์์ ์์น๋ฅผ ์ง์ ํ๊ธฐ๋ณด๋ค๋ @ComponentScan
์ด ๋ถ์ ์ค์ ์ ๋ณด ํด๋์ค๋ฅผ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋ค. ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ ๋๋ @SpringBootApplication
์ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋๋ฐ, @SpringBootApplication
์ด @ComponentScan
์ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. (๊ทธ๋์ ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ์ปดํฌ๋ํธ ์ค์บ์ด ๋๋ค!)
'๐๐ฉ๐ซ๐ข๐ง๐ > ๐๐๐ฌ๐ข๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.09.12 |
---|---|
์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ (0) | 2023.09.12 |
์คํ๋ง์์์ ์ฑ๊ธํค ํจํด (0) | 2023.09.02 |
์คํ๋ง ์ปจํ ์ด๋๋? (0) | 2023.09.02 |
์ ์ด์ ์ญ์ (IoC)๊ณผ ์์กด๊ด๊ณ ์ฃผ์ (DI)์ด๋? (0) | 2023.08.28 |
์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ ๊ฐ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
1. ์ปดํฌ๋ํธ ์ค์บ์ด๋?
@Configuration
public class AppConfig {
@Bean
public OrderService orderService() {
System.out.println("call orderService()");
return new OrderServiceImpl(discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
System.out.println("call discountPolicy()");
return new FixDiscountPolicy();
}
}
์ง๊ธ๊น์ง๋ ์ค์ ์ ๋ณด ํ์ผ์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ์ง์ ๋์ดํด์ผ ํ๋ค. ์ด๋ฌํ ๋ฐฉ์์ ๋ฑ๋กํ ๋น์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ๋ฒ๊ฑฐ๋กญ๋ค๋ ๋จ์ ์ด ์๋ค. ๊ทธ๋์ ์คํ๋ง์์๋ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋, ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์คํ๋ง ๋น์ ์๋์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
์ปดํฌ๋ํธ ์ค์บ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด, ์ค์ ์ ๋ณด ํ์ผ์ @ComponentScan
์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. @ComponentScan
์ @Component
๊ฐ ๋ถ์ ํด๋์ค๋ค์ ์๋์ผ๋ก ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ์ญํ ์ ํ๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
์ด์ ์์ ๊ฐ์ด ์ด์ ์ ์์ฑํ๋ OrderServiceImpl
, FixDiscountPolicy
, RateDiscountPolicy
ํด๋์ค์ @Component
์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ฃผ๊ธฐ๋ง ํ๋ฉด ๊ฐ ํด๋์ค๋ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค.
OrderServiceImpl
์ ์์ฑ์์ ๋ถ์ @Autowired
๋ ์์กด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฃผ์
ํด์ฃผ๋ ์ด๋
ธํ
์ด์
์ผ๋ก, ์ ์ฝ๋์์๋ discountPolicy
๋น์ ์ฐพ์์ ์ฃผ์
ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์ด์ ์๋ AppConfig์์ ์์กด๊ด๊ณ๋ฅผ ์ง์ ๋ช
์ํ์ง๋ง, ์ด์ ๋ ์ค์ ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ @Autowired
๋ฅผ ํตํด ์์กด๊ด๊ณ ์ฃผ์
๋ ํด๋์ค ๋ด๋ถ์์ ํด๊ฒฐํด์ฃผ์ด์ผ ํ๋ค.
2. ์ปดํฌ๋ํธ ์ค์บ์ ๋์ ๊ณผ์
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด๋ณด์.
์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๋ฉด@ComponentScan
์ ์ํด @Component
๊ฐ ๋ถ์ ํด๋์ค๋ ์ ๋ถ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค. ์คํ๋ง ๋น์ ์ด๋ฆ์ ํด๋์ค๋ช
์ ๋งจ ์๊ธ์๋ฅผ ์๋ฌธ์๋ก ๋ฐ๊พผ ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ @Autowired
๊ฐ ๋ถ์ด ์๋ ๊ณณ์๋ ์คํ๋ง ์ปจํ
์ด๋๊ฐ ํ์
์ด ์ผ์นํ๋ ์คํ๋ง ๋น์ ์ฐพ์์ ์๋์ผ๋ก ์ฃผ์
ํด์ค๋ค.
3. ์ปดํฌ๋ํธ ์ค์บ์ ๋์
์ปดํฌ๋ํธ ์ค์บ์ @Component
๊ฐ ๋ถ์ ํด๋์ค ๋ง๊ณ ๋ ๋ช๋ช ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋๋ฐ, ๊ฐ๊ฐ @Controller
, @Service
, @Repository
, @Configuration
์ด๋ค. ํด๋น ์ธํฐํ์ด์ค๋ค์ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก @Component
๋ฅผ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค.
@ComponentScan(basePackages = "hello.spring")
@ComponentScan
์ ํด๋์ค๋ค์ ์ ๋ถ ๋ค์ ธ์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ ํด๋์ค๋ฅผ ์ฐพ์๋ธ๋ค.
์ด์ฒ๋ผ ๋ชจ๋ ํด๋์ค๋ฅผ ํ์ํ๋ ค๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์, basePackages
์์ฑ์ ํตํด ํ์ ์์ ์์น๋ฅผ ์ง์ ํ ์ ์๋ค. ์์ ๊ฒฝ์ฐ์๋ hello.spring
์ ํจํค์ง์ ๊ทธ ํ์ ํจํค์ง๊ฐ ํ์ ๋์์ด ๋๋ค. ํ์ ์์ ์์น๋ฅผ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ์๋, @ComponentScan
์ด ๋ถ์ ์ค์ ์ ๋ณด ํด๋์ค๊ฐ ์ํ ํจํค์ง๊ฐ ์์ ์์น๊ฐ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ํ์ ์์ ์์น๋ฅผ ์ง์ ํ๊ธฐ๋ณด๋ค๋ @ComponentScan
์ด ๋ถ์ ์ค์ ์ ๋ณด ํด๋์ค๋ฅผ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋ค. ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ ๋๋ @SpringBootApplication
์ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋๋ฐ, @SpringBootApplication
์ด @ComponentScan
์ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. (๊ทธ๋์ ์คํ๋ง๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ์ปดํฌ๋ํธ ์ค์บ์ด ๋๋ค!)
'๐๐ฉ๐ซ๐ข๐ง๐ > ๐๐๐ฌ๐ข๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.09.12 |
---|---|
์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ (0) | 2023.09.12 |
์คํ๋ง์์์ ์ฑ๊ธํค ํจํด (0) | 2023.09.02 |
์คํ๋ง ์ปจํ ์ด๋๋? (0) | 2023.09.02 |
์ ์ด์ ์ญ์ (IoC)๊ณผ ์์กด๊ด๊ณ ์ฃผ์ (DI)์ด๋? (0) | 2023.08.28 |