๐๏ธ ๋ณธ ํฌ์คํธ๋ ์ธํ๋ฐ ๊น์ํ ์คํ๋ง ๊ธฐ๋ณธํธ์ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ| ๊น์ํ - ์ธํ๋ฐ ๊ฐ์
ํ์ฌ ํ์ 5.0์ ์๊ฐ์ 48,140๋ช ์ธ ๊ฐ์๋ฅผ ๋ง๋๋ณด์ธ์. ์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค. ์คํ๋ง ๊ธฐ๋ณธ ๊ธฐ๋ฅ, ์คํ
www.inflearn.com

4. ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
์คํ๋ง์์์ IoC/DI ์ปจํ ์ด๋
- ApplicationContext๋ ์คํ๋ง์ ๋ํ์ ์ธ IoC/DI ์ปจํ ์ด๋
- @Configuration + @Bean, ๋๋ @Component + @Autowired ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฒด ์์ฑ & ์ฃผ์ ๊ด๋ฆฌํ๋ค.
- ๊ฐ๋ฐ์๋ ์ค์ง ์ธํฐํ์ด์ค์ ์์กดํ๋ค → ์คํ๋ง์ด ๊ตฌํ์ฒด(๊ตฌ์ฒด ํด๋์ค) ์ ํ + ์ฃผ์ ๋ด๋นํ๋ค
AppConfig ์คํ๋ง ๊ธฐ๋ฐ์ผ๋ก ๋ณ๊ฒฝ
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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์ ์ค์ ์ ๊ตฌ์ฑํ๋ค๋ ๋ป์ @Configuration์ ๋ถ์ฌ์ค๋ค.
๋ํ ๊ฐ ๋ฉ์๋์ @Bean ์ ๋ถ์ฌ์ค๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค
โญ ์ด๋ ธํ ์ด์ ์์ธ ์ค๋ช
@Configuration
- ํด๋์ค์ ๋ถ์ด๋ ์ด๋ ธํ ์ด์
- ์ด ํด๋์ค๊ฐ ์คํ๋ง ์ค์ ํด๋์ค(= AppConfig ์ญํ )์์ ๋ํ๋
- ์คํ๋ง์ @Configuration์ด ๋ถ์ ํด๋์ค๋ฅผ ์ฝ๊ณ , ์์ ์๋ @Bean ๋ฉ์๋๋ค์ ๋ชจ๋ ์คํํด์ ๋ฆฌํด๋ ๊ฐ์ฒด๋ค์ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํจ
- ์ด๋ ๊ฒ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ค์ ์คํ๋ง ๋น(Bean)์ด๋ผ๊ณ ๋ถ๋ฆ
@Bean
- ๋ฉ์๋์ ๋ถ์ด๋ ์ด๋ ธํ ์ด์
- ํด๋น ๋ฉ์๋๊ฐ ๋ฆฌํดํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ ๋น(Bean)์ผ๋ก ๋ฑ๋ก
- ๋ฉ์๋ ์ด๋ฆ์ด ๋น์ ์ด๋ฆ์ด ๋จ (ํ์ํ๋ฉด @Bean(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 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("find Member = " + findMember.getName());
}
}
- ApplicationContext
- ์คํ๋ง ์ปจํ ์ด๋(= IoC/DI ์ปจํ ์ด๋) ์ธํฐํ์ด์ค๋ค.
- ์ฌ๊ธฐ์๋ AnnotationConfigApplicationContext ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉ → @Configuration ๊ธฐ๋ฐ ์ค์ ํด๋์ค(AppConfig) ์ฝ์ด๋ค์ธ๋ค.
- AppConfig.class ์ ๋ฌ
- AppConfig ์ค์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง์ด ๊ฐ์ฒด๋ฅผ ์์ฑ, ๊ด๋ฆฌ, ์์กด๊ด๊ณ ์ฃผ์
- getBean("memberService", MemberService.class)
- AppConfig์์ @Bean์ผ๋ก ๋ฑ๋กํ "memberService" ๋น์ ๊ฐ์ ธ์จ๋ค
OrderApp์ ์คํ๋ง ์ปจํ ์ด๋ ์ ์ฉ
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.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);
}
}
์คํ๋ง ์ปจํ ์ด๋๋?
ApplicationContext๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค. ์คํ๋ง ์ปจํ ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์๋ค.
1. ๊ฐ์ฒด ๊ด๋ฆฌ ์๋ํ
- ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด new ํด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ํ์ ์๋ค
- ์ปจํ ์ด๋๊ฐ ๋น ์์ฑ → ๊ด๋ฆฌ → ์๋ฉธ๊น์ง ์ ๋ถ ์ฑ ์์ง๋ค
- ๊ฐ์ ๋น์ ์ฌ๋ฌ ๋ฒ ์์ฒญํด๋ ํ๋๋ง ๋ง๋ค์ด ์ฌ์ฌ์ฉ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ, ์ฑ๋ฅ ์ต์ ํ
2. ์์กด๊ด๊ณ ์ฃผ์ (DI) ์๋ํ
- ์ปจํ ์ด๋๊ฐ ํ์ํ ์์กด๊ด๊ณ๋ฅผ ์์์ ์ฃผ์ ํด ์ค
- ๊ฐ๋ฐ์๋ ์ธํฐํ์ด์ค(์ญํ )๋ง ์์กด → ๊ตฌ์ฒด ํด๋์ค(๊ตฌํ์ฒด) ์ ํ์ ์คํ๋ง์ด ๋ด๋นํ๋ค
- DIP, OCP ์์น์ ์์ฐ์ค๋ฝ๊ฒ ์งํฌ ์ ์๋ค
3. ์ค์ ์ ๋ณด์ ์ผ์ํ
- @Configuration + @Bean์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ๊ตฌ์กฐ(๊ฐ์ฒด ์์ฑ๊ณผ ๊ด๊ณ ์ฐ๊ฒฐ)๋ฅผ ํ๋์ ๋ณผ ์ ์๋ค
- "์ด๋ค ๊ตฌํ์ฒด๊ฐ ์ฃผ์ ๋๋๊ฐ?"๋ฅผ ์ฝ๋ ์ฌ๊ธฐ์ ๊ธฐ ๋ค์ง ํ์ ์์ด ์ค์ ํด๋์ค๋ง ๋ณด๋ฉด ๋๋ค
4. ์ ์ฐํ ํ์ฅ์ฑ
- ๊ตฌํ์ฒด๋ฅผ ๊ต์ฒดํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ ์ด ํ์ ์๋ค
- FixDiscountPolicy → RateDiscountPolicy ๊ต์ฒด ์ AppConfig๋ง ์์ ํ๋ฉด ๋๋ค
- ๋ค์ํ ํ๊ฒฝ(๊ฐ๋ฐ, ํ ์คํธ, ์ด์)์ ๋ง๊ฒ ๋น ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๋ค