#5 ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
by JiwonDev2021.07.25 - [Backend/Spring Core] - #0 ์คํ๋ง, ์๋ฐ์ ๋ด์ด ์ค๊ธฐ๊น์ง
์คํ๋ง์ด ๊ฐ์ง ํต์ฌ ๊ธฐ๋ฅ์, ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ฑฐ๋ DB๋ฅผ ํธํ๊ฒ ์ ๊ทผํด์ฃผ๊ธฐ ์ํ ๋๊ตฌ๊ฐ ์๋๋ค. ์ด๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ค๊ณํด์ ์ป๋ ์ด์ ์ผ ๋ฟ์ด๊ณ ์คํ๋ง์ ๋ณธ์ง์ '์์ํ Java๋ก ์ข์ ๊ฐ์ฒด์งํฅ์ ์ค๊ณํ๋๋ก ๋์์ฃผ๋ ํ๋ ์์ํฌ' ์ด๋ค.
# AppConfig๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ก ๋ง๋ค๊ธฐ
๊ฐ๋จํ๋ค. ์ด๋ ธํ ์ด์ (@)์ ์ด์ฉํด์ @Configuration์ ์ ์ด์ฃผ๊ณ , ๊ฐ๊ฐ์ ๋ฉ์๋์ @Bean์ ๋ถ์ฌ์ค๋ค. @Bean์ ๋ถ์ฌ์ค ๋ฉ์๋์ ๋ฐํ ๊ฐ์ด ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น(๊ตฌํ์ฒด)์ผ๋ก ๋ฑ๋ก๋๋ค.
@Configuration
public class AppConfig {
// ๋ณดํต ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ์ง๋ง, ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋ ์ด๋ฆ์ ๋ฐ๊ฟ ์๋ ์๋ค.
@Bean(name="newName")
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();
}
}
# Main, ์ฑ ์ง์ ์ ์ ์คํ๋ง์ผ๋ก ๋ฐ๊พธ๊ธฐ
์คํ๋ง ์ปจํ ์ด๋๋ ์ฑ์ ์ ์ฒด ํ๋ฆ์ ์ ์ดํ๋ค๋ ์๋ฏธ๋ก ApplicationContext ๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ๋ค.
์ฑ ์์์ ์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ด์ฉํ๊ฒ ๋ณ๊ฒฝํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ํด์ฃผ๋ฉด ๋๋ค. ์คํ๋ง ์ปจํ ์ด๋ ๊ฐ์ฒด์ AppConfig.class๋ฅผ ๋๊ฒจ์ฃผ๊ฒ ๋๋๋ฐ, ์ด๋ ํด๋น ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ 'Class' ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. (์ฐธ๊ณ ๋ก Class ๊ฐ์ฒด๋ ์๋ฐ์์ ํน์ ํด๋์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ๋๊ฒจ์ค ์ ์๋๋ก ๋ง๋ ๊ฐ์ฒด์ด๋ค.)
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
// ๊ฐ์ฒด์์ @Bean ์ผ๋ก ๋ฑ๋ก๋ ๋ฉ์๋๋ฅผ ๋ฌธ์์ด๋ก ์ฐพ์ ๊ฐ์ ธ์จ๋ค. -> memberService() ๋ฉ์๋
MemberService memberService = ac.getBean("memberService", MemberService.class);
// ๊ธฐ์กด์ ํ
์คํธ ๋ฐฉ๋ฒ. ์ด๋ฐ ๋ฌด์ํ ๋ฐฉ๋ฒ ๋์ ์ ํ
์คํธ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๋ก ํ์.
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("findMember = " + findMember.getName());
}
}
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = ac.getBean("memberService", MemberService.class);
OrderService orderService = ac.getBean("orderService", OrderService.class);
// ๊ธฐ์กด์ ํ
์คํธ ๋ฐฉ๋ฒ. ์ด๋ฐ ๋ฌด์ํ ๋ฐฉ๋ฒ ๋์ ์ ํ
์คํธ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋๋ก ํ์.
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}
ํด๋น ์ฝ๋๋ฅผ ๋๋ ค๋ณด๋ฉด ์คํ๋ง์ ์ปจํ ์ด๋(AppConfig ์ญํ )์ ๋ฑ๋ก ๋์์์ ์ฝ์์ ํ์ธ ํ ์์๋ค.
# ์คํ๋ง ์ปจํ ์ด๋
์ง์ Java์ฝ๋๋ก ์์ฑํ๋ ๊ฒ์ ์คํ๋ง ์ปจํ ์ด๋๋ก ์ ํํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋์๋ค.
- ์ฐ์ ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.
- ๊ธฐ์กด์๋ AppConfig ์ฝ๋๋ฅผ ์ง์ ์์ฑํ์ฌ ์์กด์ฑ์ ์ฃผ์ ํ๋ค๋ฉด, ์ด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ก ๋์ฒดํ๋ ๊ฒ์ด๋ค.
- ์คํ๋ง ์ปจํ ์ด๋๋ @Configuration์ด ๋ถ์ ๊ฐ์ฒด๋ฅผ ์ค์ ์ ๋ณด(AppConfig)๋ก ์ฌ์ฉํ๋ค.
- ํด๋น ๊ฐ์ฒด์์ @Bean์ด ๋ถ์ ๋ฉ์๋๋ฅผ ํธ์ถํด ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋กํ๋ค.
- ์ด๋ ๊ฒ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฉ์๋ ํธ์ถ๋ก ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ Spring Bean์ด๋ผ๊ณ ํ๋ค.
- ์คํ๋ง ๋น์ ๊ด๋ก์ ์ผ๋ก ๋ฉ์๋๋ช ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ค. (name=์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.) - ApplicationContext์ getBean() ๋ฉ์๋๋ฅผ ํตํด ์ํ๋ ๋น์ ์ฐพ์ ์ ์๋ค.
- ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ตฌ์ฑ์์ญ / ์คํ์์ญ์ ๋ถ๋ฆฌํ์๋ค๋ฉด, ์ด์ ์คํ๋ง ์ปจํ ์ด๋์ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์ฌ ํ์ํ ๋ ์คํ๋ง ์ปจํ ์ด๋(AppContext)์์ ํ์ํ ๊ตฌํ์ฒด(Spring Bean)์ ์ฐพ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋์๋ค.
# ์คํ๋ง ์ปจํ ์ด๋์ ์ฅ์
์ด๋ ๊ฒ ํ๋ฉด์ ์ด๋ ธํ ์ด์ (@)์ ์ฌ์ฉํ๊ฒ ๋์๊ณ , ์ฝ๋๊ฐ ์กฐ๊ธ ๋ ๋ณต์กํด์ง ๊ฒ ๊ฐ๋ค. ๊ทธ๋ผ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํด์ ์ป๋ ์ฅ์ ์ด ๋ฌด์์ผ๊น?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์ด๋ ๊ฒ ๋ฒ์ฉ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ ๋ง ์ด๋ง์ด๋งํ ์ฅ์ ์ ์ป์ ์ ์๋๋ฐ, ๋ค ์ค๋ช ํ๊ธฐ์๋ ๋ด์ฉ์ด ๋๋ฌด ๊ธธ์ด์ง๋ค. ์ด๋ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ์ดํดํ๋ฉด์ ํ๋์ฉ ์์๋ณด๋๋ก ๋ ํ์.
'๐ฑ Spring Framework > Spring Core' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BeanFactory, BeanDefinition (+ ์คํ๋ง ์ปจํ ์ด๋ XML ์ค์ ) (0) | 2021.08.02 |
---|---|
#6. ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2021.08.02 |
IoC, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋ (0) | 2021.08.02 |
#4 ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ(SOC), ์์กด์ฑ ์ฃผ์ (DI) (0) | 2021.08.02 |
#3 ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ์กด์ ๋ถํธํ ์ค๊ณ ๋ฐฉ์ (0) | 2021.08.01 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev