/* ์ด ๊ธ์ ๊น์ํ๋์ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ๋ ค๊ณ ์์ฑํ ๊ธ์ ๋๋ค.
๊ฐ์ธ์ ์ธ ๊ณต๋ถ๋ฅผ ์ํด ์ฌ๋ฆฌ๋ ๊ธ์ด๋ฏ๋ก ์ค๊ฐ ์ค๊ฐ ์ฝ๋๋ ์๋ต๋์์ต๋๋ค. */
์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
โพ ์ ์๋ ๊ฐ๋ฐ์๊ฐ AppConfig๋ฅผ ์ฌ์ฉํด์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ DI๋ฅผ ํด์คฌ๋์ง๋ง, ์ด์ ๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด์ ์ฌ์ฉํ๋ค.
โพ AppConfig์ ์ค์ ์ ๊ตฌ์ฑํ๋ค๋ ๋ป์ `@Configration`์ ๋ถ์ฌ์ฃผ๊ณ ๊ฐ ๋ฉ์๋์ `@Bean`์ ๋ถ์ฌ์ค๋ค. ์ด๋ ๊ฒํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๋ค.
๐ก ๊ถ๊ธ์ฆ1
: @Configuration์ ์ญํ ?
โพ ๊ตฌ์ฑ ํด๋์ค : `@Configuration` ์ด๋ ธํ ์ด์ ์ด ๋ถ์ฌ๋ ํด๋์ค๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํด๋์ค ๋ผ๋ ๋ป์ด๋ฉฐ, ์ด ํด๋์ค ๋ด๋ถ์๋ ๋น(bean) ๊ฐ์ฒด์ ์ ์์ ๊ตฌ์ฑ ์ค์ ์ด ํฌํจ๋๋ค.
โพ ๋น ์ ์ : ํด๋์ค ๋ด์์ `@Bean` ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋น ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ค. `@Bean` ์ด๋ ธํ ์ด์ ์ด ๋ถ์ฌ๋ ๋ฉ์๋๋ ํด๋น ๋ฉ์๋์ ๋ฐํ๊ฐ์ด ์คํ๋ง ์ปจํ ์ด๋์ ์ํด ๋น์ผ๋ก ๊ด๋ฆฌ๋์ด์ผ ํจ์ ๋ํ๋ธ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก `@Configuration` ํด๋์ค ๋ด์์ ์ ์๋ ๋น๋ค์ ์ฑ๊ธํค ์ค์ฝํ๋ก ์์ฑ๋๋ค.
๐ก ๊ถ๊ธ์ฆ2
: @Bean์ด๋?
โพ ๋น ์ ์ ๋ฐ ๊ด๋ฆฌ : `@Bean` ์ด๋ ธํ ์ด์ ์ ํด๋น ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ๋๋ก ์ง์ํ๋ค. ์ด๋ ๊ฒ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ด๋ฅผ ์์ฑ, ์ด๊ธฐํ, ์ฃผ์ ๋ฐ ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋ค.
โพ ๋น ์ด๋ฆ : ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋์ ์ด๋ฆ์ด ๋น์ ์ด๋ฆ์ด ๋๋ค. But, `name`์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฆ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ์๋ ์์.
MemberApp
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member memberA = new Member(1L, "memberA", Grade.VIP);
memberService.join(memberA);
Member findMember = memberService.findMember(1L);
System.out.println("new Member = " + memberA.getName());
System.out.println("find Member = " + findMember.getName());
}
}
โพ ์ด์ ์๋ ๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ฐ์ฒด๋ฅผ AppConfig๋ฅผ ์ฌ์ฉํด์ ์ง์ ์กฐํํ์ง๋ง(์ฃผ์ ๋ถ๋ถ), ์ด์ ๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํ์ํ ์คํ๋ง ๋น(๊ฐ์ฒด)๋ฅผ ์ฐพ์์ผ ํ๋ค.
โพ ์คํ๋ง ๋น์ `applicationContext.getBean()` ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฐพ์ ์ ์๋ค.
โพ ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์๋ฐ์ฝ๋๋ก ๋ชจ๋ ๊ฒ์ ํ๋ค๋ฉด, ์ด์ ๋ ์คํ๋ง ์ปจํ ์ด๋์ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ , ์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ ์ฐพ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์๋ค.
โพ ์ฝ๋๊ฐ ์ฝ๊ฐ ๋ ๋ณต์กํด์ง ๊ฒ ๊ฐ์๋ฐ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์ฅ์ ์ด ์๋์ง๋ ๋ค์์๊ฐ์!
๐ก ๊ถ๊ธ์ฆ1
: ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด MemberService ๊ฐ์ฒด๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
1. ApplicationContext ์ด๊ธฐํ
โพ ApplicationContext(=์คํ๋ง ์ปจํ ์ด๋) ๋ฅผ ์ด๊ธฐํ ํ๋ ค๋ฉด `AnnotationConfigApplicationContext` ๋ฅผ ์ฌ์ฉํ๋ค.
โพ `AppConfig.class`๋ฅผ ์ ๋ฌํ์ฌ `AppConfig` ํด๋์ค๋ฅผ ๋ก๋ํ๊ณ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ด๊ธฐํ ํ๋ค.
2. MemberServe ๋น ๊ฐ์ ธ์ค๊ธฐ
โพ applicationContext๋ฅผ ํตํด `memberService`๋ผ๋ ๋น ์ด๋ฆ๊ณผ, `MemberService.class` ํ์ ์ ์ง์ ํ์ฌ ๋น์ ๊ฐ์ ธ์จ๋ค.
โพ ์ด ์์ ์ผ๋ก `MemberService` ๋น์ด ์์ฑ๋๊ณ ์คํ๋ง ์ปจํ ์ด๋์์ ๊ด๋ฆฌ๋๋ค.
.
์คํ๋ง ๋ถํธ 3.1 ์ด์ - ๋ก๊ทธ ์ถ๋ ฅ ์๋๋ ๋ฌธ์ ํด๊ฒฐ ์ฐธ๊ณ