-
Spring ํต์ฌSpring 2022. 4. 11. 18:18
๐ ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํด์ ์ค๊ณํด์ผํ๋ค -> ์์ ๋กญ๊ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ ์ ์๊ฒ ์ค๊ณํด์ผํ๋ค
๐ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค"
: ๊ตฌ์ฒด ํด๋์ค๊น์ง ํจ๊ป ์์กดํ๋ค๋ฉด, ๊ตฌ์ฒด ํด๋์ค ๋ณ๊ฒฝ์ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํ๋ค => 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๋ฅผ ๊ตฌ์ฑ ์ ๋ณด๋ก ์ง์ ํ๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฑ๊ธํค ์ปจํ ์ด๋ (0) 2022.04.12 ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) 2022.04.12 ์คํ๋ง์ด๋?, SOLID, IoC, DI, ์ปจํ ์ด๋ (0) 2022.03.24 MVC, API ์๋ฆฌ (0) 2022.03.22 ํ๋ก์ ํธ ์์ฑ (0) 2022.03.17