Spring ํต์ฌ
๐ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ ์ค๊ณํด์ผํ๋ค -> ์์ ๋กญ๊ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ ์ ์๊ฒ ์ค๊ณํด์ผํ๋ค
๐ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค"
: ๊ตฌ์ฒด ํด๋์ค๊น์ง ํจ๊ป ์์กดํ๋ค๋ฉด, ๊ตฌ์ฒด ํด๋์ค ๋ณ๊ฒฝ์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํ๋ค => DIP ์๋ฐ
=> ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์ธํฐํ์ด์ค์๋ง ์์กดํ๋๋ก ์ค๊ณํด์ผํ๋ค
ex) ํ ์ธ๋ฐฉ์ 2์ข ๋ฅ : ๊ณ ์ ํ ์ธ, ์ ๋ฅ ํ ์ธ
* ์๋ก์ด ํ ์ธ์ ์ฑ ์ ๋ง๋ ํ FixDiscountPolicy -> RateDiscountPolicy๋ก ๋ณ๊ฒฝํ๋ ์๊ฐ
OrderServiceImpl๋ ํจ๊ป ๋ณ๊ฒฝํด์ผํ๋ค => OCP ์๋ฐ
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private DiscountPolicy discountPolicy;
}
* ๋์ด์ FixDiscountPolicy์ ์์กดํ์ง ์๋๋ค -> ๋จ์ง DiscountPolicy ์ธํฐํ์ด์ค์๋ง ์์กดํ๋ค
* ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ -> ๊ตฌํ์ฒด๊ฐ ์๋๋ฐ ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ์คํํ ๊น? => AppConfig ๋ฑ์ฅ
๐ AppConfig ๋ฑ์ฅ <- ์ ํ๋ฆฌ์ผ์ด์ ์ด ํฌ๊ฒ ์ฌ์ฉ ์์ญ & ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑ(Configuration)ํ๋ ์์ญ์ผ๋ก ๋ถ๋ฆฌ
: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ(config)ํ๊ธฐ ์ํด,
๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑ + ์ฐ๊ฒฐํ๋ ์ฑ ์์ ๊ฐ์ง๋ ๋ณ๋์ ์ค์ ํด๋์ค๋ฅผ ๋ง๋ค์ => AppConfig.class
: AppConfig๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค
: AppConfig๋ ์์ฑํ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ(๋ ํผ๋ฐ์ค)๋ฅผ ์์ฑ์๋ฅผ ํตํด์ ์ฃผ์ (์ฐ๊ฒฐ)ํด์ค๋ค.
* ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋ AppConfig์์ ๊ฒฐ์ ํ๋ค
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(new MemoryMemberRepository(),
new FixDiscountPolicy());
}
}
* OrderServiceImpl์๋ MemoryMemberRepository, FixDiscountPolicy๊ฐ์ฒด์ ์์กด๊ด๊ณ๊ฐ ์ฃผ์ ๋๋ค
* MemoryMemberRepository, FixDiscountPolicy๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ,
๊ทธ ์ฐธ์กฐ๊ฐ์ OrderServiceImpl์ ์์ฑํ๋ฉด์ ์์ฑ์๋ก ์ ๋ฌํ๋ค
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository,
DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
* OrderServiceImpl ์ ์ฅ์์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง ์ ์ ์๋ค => ์ค์ง AppConfig์์ ๊ฒฐ์
* ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl ์ ์ฅ์์ ๋ณด๋ฉด ์์กด๊ด๊ณ๋ฅผ ๋ง์น ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค๊ณ ํ์ฌ,
DI(Dependency Injection) == ์์กด๊ด๊ณ ์ฃผ์ == ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ค
<์ฌ์ฉ์์ญ>
public class OrderApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
}
* AppConfig ๊ฐ์ฒด ์์ฑํด์ ์ฌ์ฉํ๋ค
๐ ์ต๋ํ์ ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ๋ณด์ด๋๋ก ์์ฑํด์ผํ๋ค
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(),
discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
}
----------- ์์ํ ์๋ฐ ์ฝ๋๋ง์ผ๋ก DI ์ ์ฉ---------------
๐ ๏ธ ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
: ApplicatonContext == ์คํ๋ง ์ปจํ ์ด๋
: ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ AppConfig๋ฅผ ์ฌ์ฉํด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ DI๋ฅผ ํ์ง๋ง,
์ด์ ๋ถํฐ๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด์ ์ฌ์ฉํ๋ค
: ์คํ๋ง ์ปจํ ์ด๋์ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ , ์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ์์ ์ฌ์ฉํ๋ค
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
}
โ @Configuration : AppConfig๋ฅผ ์ค์ (๊ตฌ์ฑ)์ ๋ณด๋ก ์ฌ์ฉํ๋ค, AppConfig์์ ์ค์ ์ ๊ตฌ์ฑํ๋ค
โ @Bean : @Bean์ด ์ ํ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํด์ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๋ค
: ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๋น => ์คํ๋ง ๋น
โ ์คํ๋ง ๋น : @Bean์ด ๋ถ์ ๋ฉ์๋๋ช ์ ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ค
ex) memberService
* ์ ์๋ ํ์ํ ๊ฐ์ฒด๋ฅผ AppConfig๋ฅผ ์ฌ์ฉํด ์ง์ ์กฐํํ๋ค
-> ์ด์ ๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํ์ํ ์คํ๋ง ๋น(๊ฐ์ฒด)๋ฅผ ์ฐพ์์ผํ๋ค
* applicationContext.getBean() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ฐพ์ ์ ์๋ค
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member member = new Member(1L, "userA", Grade.VIP);
memberService.join(member);
}
* new AnnotationConfigApplicationContext(AppConfig.class);
-> ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋๋ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ค์ผํ๋ค
=> AppConfig.class๋ฅผ ๊ตฌ์ฑ ์ ๋ณด๋ก ์ง์ ํ๋ค.