[Spring] 3.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด2 - ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ
1. ์๋ก์ด ํ ์ธ ์ ์ฑ ๊ฐ๋ฐ
- ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ (1000์ ํ ์ธ์์ 10% ํ ์ธ์ผ๋ก)
- [์ ์์ผ] -> ๊ณํ์ ๋ฐ๋ฅด๋ค๋ณด๋จ ๋ณํ์ ๋์ํ๊ธฐ!
- fix discount policy ๋ง๊ณ rate discount policy ๊ฐ๋ฐํด์ฃผ๋ฉด๋จ
public class RateDiscountPolicy implements DiscountPolicy {
private int discountPercent = 10;
@Override
public int discount(Member member, int price) {
if(member.getGrade() == Grade.VIP){
return price * discountPercent / 100;
} else {
return 0;
}
}
}
- ๋ฉ์๋ ๋ช ์ cmd + shift + t ํ๋ฉด 'create new test' ๋์ด
Junit 5 / ์ด๋ฆ์ ์๋ ๋ช ์ test ๋ถ์ฌ์ฃผ๊ธฐ(๋ํดํธ) -> ํ์ธ ๋๋ฅด๊ธฐ
ํ ์คํธ
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP๋ 10% ํ ์ธ์ด ์ ์ฉ๋์ด์ผ ํ๋ค.")
void vip_o() {
//given
Member member = new Member(1L, "memberVIP", Grade.VIP);
//when
int discount = discountPolicy.discount(member, 10000);
//then
assertThat(discount).isEqualTo(1000);
}
@Test
@DisplayName("VIP๊ฐ ์๋๋ฉด ํ ์ธ์ด ์ ์ฉ๋์ง ์์์ผ ํ๋ค.")
void vip_x() {
//given
Member member = new Member(2L, "memberBASIC", Grade.BASIC);
//when
int discount = discountPolicy.discount(member, 10000);
//then
assertThat(discount).isEqualTo(0);
}
}
* assertions -> option enter -> add on-demand static import for 'org.assertj.core.api.Assertions'
(static import)
2. ์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ฉ๊ณผ ๋ฌธ์ ์
ํ ์ธ ์ ์ฑ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํด๋ณด์
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl ์ฝ๋๋ฅผ ๊ณ ์ณ์ผํ๋ค.
* ๋ฌธ์ ์
- ์ญํ ๊ณผ ๊ตฌํ ๋ถ๋ฆฌ ํ๋ค / ๋คํ์ฑ ํ์ฉ, ์ธํฐํ์ด์ค์ ๊ตฌํ๊ฐ์ฒด ๋ถ๋ฆฌ
- OCP DIP (๊ฐ์ฒด ์งํฅ ์ค๊ณ ์์น SOLID ์์น ์ค์ํ๋?)
-> NO!
OCP : ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฅํ ์ ์๋ค๊ณ ํ๋๋ฐ? -> ๋ฉค๋ฒ ์๋น์ค ์ฝ๋ ์์ ํด์ผํจ
DIP : ์ฃผ๋ฌธ ์๋น์ค ํด๋ผ์ด์ธํธ(OrderServiceImpl)๋ DiscountPolicy ์ธํฐํ์ด์ค์ ์์กดํ๋ ๊ฒ ๊ฐ์ง๋ง
์ถ์(์ธํฐํ์ด์ค) ๋ฟ๋ง ์๋๋ผ ๊ตฌ์ฒด(๊ตฌํ) ํด๋์ค์๋ ์์กดํ๊ณ ์๋ค.
์ถ์(์ธํฐํ์ด์ค) ์์กด - DiscountPolicy
๊ตฌํ(ํด๋์ค) ์์กด - FixDiscountPolicy / RateDiscountPolicy
* ๋ฌธ์ ํด๊ฒฐ
ํด๋ผ์ด์ธํธ (OrderServiceImpl) ์ด ์ธํฐํ์ด์ค(Discount Policy) ์๋ง ์์กดํ๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋จ
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
}
ใด ๊ตฌํ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ NullPointerException ๋ฐ์
ํด๊ฒฐ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl ์ DiscountPolicy ์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ๊ณ ์ฃผ์ ํด์ฃผ์ด์ผ ํ๋ค.
3. ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
AppConfig
ใดhello.cored
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(new MemoryMemberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
new MemoryMemberRepository(),
new FixDiscountPolicy());
}
}
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ(config)ํ๊ธฐ ์ํด, ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๋ ์ฑ ์์ ๊ฐ์ง๋ ๋ณ๋์ ์ค์ ํด๋์ค
- ์์ฑ์๋ฅผ ํตํด์ ๊ตฌํ์ฒด๊ฐ ๋ค์ด๊ฐ
- ํด๋ผ์ด์ธํธ(๋ฉค๋ฒ์๋น์ค) ์์ฑ๋ ๋ ๊ตฌํ์ฒด๊ฐ ์ฃผ์ ๋จ
๋ฉค๋ฒ ์๋น์ค
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
-> ์ค๊ณ ๋ณ๊ฒฝ์ผ๋ก MemberServiceImpl์ MemoryMemberRepository๋ฅผ ์์กดํ์ง ์๋๋ค.
-> ๋จ์ง MemberRepository ์ธํฐํ์ด์ค์๋ง ์์กดํ๋ค.
-> MemberServiceImpl ์ ์ฅ์์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง(์ฃผ์ ) ์ ์ ์๋ค.
-> MemberServiceImpl์ ์์ฑ์๋ฅผ ํตํด์ ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋ ์ค์ง ์ธ๋ถ(AppConfig)์์ ๊ฒฐ์ ๋๋ค.
-> MemberServiceImpl์ ์ด์ ๋ถํฐ '์์กด ๊ด๊ณ์ ๋ํ ๊ณ ๋ฏผ์ ์ธ๋ถ'์ ๋งก๊ธฐ๊ณ '์คํ'์๋ง ์ง์คํ๋ฉด ๋๋ค.
[ํด๋์ค ๋ค์ด์ด๊ทธ๋จ]
[๊ทธ๋ฆผ-ํ์ ๊ฐ์ฒด ์ธ์คํด์ค ๋ค์ด์ด๊ทธ๋จ]
-> DI (dependency injection) ์์กด๊ด๊ณ ์ฃผ์
์ฃผ๋ฌธ ์๋น์ค
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;
}
-> ๊ฒฐ๊ตญ ๋ฉค๋ฒ ์๋น์ค๊ฐ ๊ตฌํ(ํด๋์ค)๊ฐ ์๋ ์ญํ (์ธํฐํ์ด์ค)์ ์์กดํ๋๋ก ๋ง๋๋ ๊ฒ
AppConfig ์คํ
- MemberApp
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
- OrderApp
public class OrderApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
Test ์ญ์ ์์ ํด์ค์ผํจ
public class MemberServiceTest {
MemberService memberService;
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
@Test
void join() {
// given
Member member = new Member(1L, "memberA", Grade.VIP);
// when
memberService.join(member);
Member findMember = memberService.findMember(1L);
// then
Assertions.assertThat(member).isEqualTo(findMember);
}
class OrderServiceTest {
MemberService memberService;
OrderService orderService;
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
orderService = appConfig.orderService();
}
@Test
void createOrder() {
long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
Assertions.assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}
- beforeEach๋ก ํ ์คํธ ์์ํ๊ธฐ ์ ๋ง๋ค ์์ฑ
4. AppConfig ๋ฆฌํฉํฐ๋ง
ํ์ฌ AppConfig๋ฅผ ๋ณด๋ฉด '์ค๋ณต'์ด ์๊ณ ์ญํ ์ ๋ฐ๋ฅธ ๊ตฌํ์ด ์ ์๋ณด์ธ๋ค.
[๊ธฐ๋ํ๋ ๊ทธ๋ฆผ]
[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();
}
}
- new MemoryMemberRepository() ์ด ๋ถ๋ถ์ด ์ค๋ณต ์ ๊ฑฐ๋์๋ค. ์ด์ MemoryMemberRepository ๋ฅผ ๋ค๋ฅธ ๊ตฌํ์ฒด๋ก ๋ณ๊ฒฝํ ๋ ํ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
- AppConfig ๋ฅผ ๋ณด๋ฉด ์ญํ ๊ณผ ๊ตฌํ ํด๋์ค๊ฐ ํ๋์ ๋ค์ด์จ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ๊ตฌ์ฑ์ด ์ด๋ป๊ฒ ๋์ด์๋์ง ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์๋ค.
5. ์๋ก์ด ๊ตฌ์กฐ์ ํ ์ธ ์ ์ฑ ์ ์ฉ
FixDiscountPolicy -> RateDiscountPolicy
public DiscountPolicy discountPolicy() {
//return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
- ์ด ๋ถ๋ถ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค!
-> OCP, DIP ๋ชจ๋ ์ง์ผ์ง
6. ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ์ฉ
์ฌ๊ธฐ์ SOLID ์ค 3๊ฐ์ง SRP / DIP / OCP ์ ์ฉ
1) SRP (๋จ์ผ ์ฑ ์ ์์น)
"ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผํ๋ค."
- SRP ๋จ์ผ ์ฑ ์ ์์น์ ๋ฐ๋ฅด๋ฉด์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํจ
- ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ์ฑ ์์ AppConfig ๊ฐ ๋ด๋น
- ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์คํํ๋ ์ฑ ์๋ง ๋ด๋น
2) DIP ์์กด๊ด๊ณ ์ญ์ ์์น
"ํ๋ก๊ทธ๋๋จธ๋ [์ถ์ํ]์ ์์กดํด์ผ์ง [๊ตฌ์ฒดํ]์ ์์กดํ๋ฉด ์๋๋ค"
- ์์กด์ฑ ์ฃผ์ (AppConfig์์ ์์ฑํด์ ๋ฃ์ด์ค) -> ์ ์ฐ์ฑ
- ํด๋ผ์ด์ธํธ์ฝ๋๊ฐ ์ถ์ํ ์ธํฐํ์ด์ค์ ์์กดํ๋๋ก ์ค์
- but ํด๋ผ์ด์ธํธ ์ฝ๋๋ ์ธํฐํ์ด์ค๋ง์ผ๋ก๋ ์๋ฌด๊ฒ๋ ์คํํ ์ ์๋ค.
- AppConfig๊ฐ ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ํด๋ผ์ด์ธํธ ์ฝ๋ ๋์ ์์ฑํด์ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ฉด์ DIP ๋ฌธ์ ํด๊ฒฐ
3) OCP
"์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผํ๋ค."
- ๋คํ์ฑ ์ฌ์ฉํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ DIP๋ฅผ ์งํด
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ ์์ญ๊ณผ ๊ตฌ์ฑ ์์ญ์ผ๋ก ๋๋
- AppConfig๊ฐ ์์กด ๊ด๊ณ๋ฅผ FixDiscountPolicy -> RateDiscountPolicy๋ก ๋ณ๊ฒฝํด์ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์ฃผ์ ํ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ฝ๋ ์์ฒด๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์์๋ ๋จ
- ์ํํธ์จ์ด ์์๋ฅผ ์๋กญ๊ฒ ํ์ฅํด๋ ์ฌ์ฉ ์์ญ์ ๋ณ๊ฒฝ์ ๋ซํ ์๋ค.
7. Ioc, DI, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋
1) ์ ์ด์ ์ญ์ IoC(Inversion of Control)
- ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ์ํ ์๋ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๊ณ ์คํํจ
(ํ๋ง๋๋ก ๊ตฌํ ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ค์ค๋ก ์กฐ์ข )
- ๋ฐ๋ฉด AppConfig๊ฐ ๋ฑ์ฅํ ์ดํ ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋นํ๋ค.
(AppConfig๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ๊ฐ์ ธ๊ฐ)
ex) OrderServiceImpl์ ํ์ํ ์ธํฐํ์ด์ค๋ค์ ํธ์ถํ์ง๋ง ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ค์ด ์คํ๋ ์ง ๋ชจ๋ฆ
- ํ๋ก๊ทธ๋จ์ ๋ํ ์ ์ด ํ๋ฆ์ ๋ํ ๊ถํ์ ๋ชจ๋ AppConfig๊ฐ ๊ฐ์ง๊ณ ์๋ค.
OrderServiceImpl์ ์์ ์ ๋ก์ง์ ์คํํ ๋ฟ์ด๋ค.
2) ํ๋ ์ ์ํฌ VS ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ๋ ์์ํฌ : ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ดํ๊ณ ๋์ ์คํ (JUnit)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋น (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์ ํธ์ถ)
3) ์์กด๊ด๊ณ ์ฃผ์ DI(Dependency Injection)
- OrderServiceImpl์ DiscountPolicy ์ธํฐํ์ด์ค์ ์์กด (์ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋ ์ง ๋ชจ๋ฆ)
- [์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ] ์ [๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด๊ด๊ณ - ์คํ์์ ์ ๊ฒฐ์ ] ์ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผํจ
[์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ]
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์๊ณ ๋ ์์กด๊ด๊ณ ๋ถ์ ๊ฐ๋ฅ
- ํ์ง๋ง ํด๋์ค ์์กด๊ด๊ณ๋ง์ผ๋ก๋ ์ค์ ์ด๋ค ๊ฐ์ฒด๊ฐ OrderServiceImpl์ ์ฃผ์ ๋ ์ง ์ ์ ์๋ค
[๋์ ์ธ ๊ฐ์ฒด(์ธ์คํด์ค) ์์กด๊ด๊ณ]
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค ์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ์์กด ๊ด๊ณ
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ (๋ฐํ์)์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ค์ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ์์กด๊ด๊ณ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ค.
- ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๊ทธ ์ฐธ์กฐ๊ฐ์ ์ ๋ฌํด์ ์ฐ๊ฒฐ
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถํ๋ ๋์์ ํ์ ์ธ์คํด์ค๋ฅผ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ์์กด๊ด๊ณ ์ฃผ์ ์ผ๋ฅด ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ ์ฝ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ
Ioc ์ปจํ ์ด๋, DI ์ปจํ ์ด๋
- AppConfig ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ฉด์ ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฒ์ IoC ์ปจํ ์ด๋ / DI ์ปจํ ์ด๋๋ผ๊ณ ํจ
- ์์กด๊ด๊ณ ์ฃผ์ ์ ์ด์ ์ ๋ง์ถ์ด ์ต๊ทผ์๋ ์ฃผ๋ก DI ์ปจํ ์ด๋๋ผ๊ณ ํจ
- or ์ด์ ๋ธ๋ฌ / ์ค๋ธ์ ํธ ํฉํ ๋ฆฌ ๋ผ๊ณ ๋ ๋ถ๋ฆผ
8. ์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
AppConfig
1) @Configuration
2) @Bean
@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 FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
MemberApp
1) ApplicationContext / AnnotationConfigApplicationContext
ใด ์คํ๋ง ์ปจํ ์ด๋(@Bean ๊ด๋ฆฌ), AppConfig ํ๊ฒฝ ์ค์ ์ ๋ณด ๊ฐ์ง๊ณ @Bean ๊ฐ์ฒด ์์ฑํ๊ฑธ ์คํ๋ง ์ปจํ ์ด๋์ ๋ค ๋ฃ์ด์ ๊ด๋ฆฌํด์ค
ใด ๊ธฐ์กด์๋ AppConfig์์ ์ง์ ์ฐพ์์๋ค๋ฉด ์ด์ getBean("memberService" - ์ด๋ฆ, MemberService.class - ํ์ );๋ก ๊ฐ์ ธ์ด
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("findMember = " + findMember.getName());
System.out.println("member = " + member.getName());
}
}
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๋ฅผ ์คํ๋ง ์ปจํ ์ด๋๋ผ๊ณ ํจ
- ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ AppConfig๋ฅผ ์ฌ์ฉํด์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ DI๋ฅผ ํ์ง๋ง, ์ด์ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด์ ์ฌ์ฉ
- ์คํ๋ง ์ปจํ ์ด๋๋ @Configuration์ด ๋ถ์ AppConfig๋ฅผ ์ค์ (๊ตฌ์ฑ) ์ ๋ณด๋ก ์ฌ์ฉ / ์ฌ๊ธฐ์ @Bean์ด๋ผ ์ ํ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํด์ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก / ์ด๋ ๊ฒ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ด๋ผ๊ณ ํจ
- ์คํ๋ง ๋น์ @Bean์ด ๋ถ์ ๋ฉ์๋์ ๋ช ์ ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉ ('memberService')
- ์ด์ ์๋ ํ์ํ ๊ฐ์ฒด๋ฅผ AppConfig๋ฅผ ์ฌ์ฉํด์ ์ง์ ์กฐํํ์ง๋ง, ์ด์ ๋ถํฐ ์คํ๋ง ์ปจํ ์ด๋๋ฅผ ํตํด ํ์ํ ์คํ๋ง ๋น(๊ฐ์ฒด)๋ฅผ ์ฐพ์์ผํจ / ์คํ๋ง ๋น์ applicationContext.getBean() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ฐพ์ ์ ์์
- ๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์๋ฐ ์ฝ๋๋ก ๋ชจ๋ ๊ฒ์ ๋คํ๋ค๋ฉด ์ด์ ๋ถํฐ ์คํ๋ง ์ปจํ ์ด๋์ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ์์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ๋จ
'๐จโ๐ป Web Development > Spring - ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] 6.์ปดํฌ๋ํธ ์ค์บ (0) | 2023.02.24 |
---|---|
[Spring] 5.์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2023.02.22 |
[Spring] 4.์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2023.02.20 |
[Spring] 2.์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด1 - ์์ ๋ง๋ค๊ธฐ (0) | 2023.02.17 |
[Spring] 1.๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2023.02.16 |
์ต๊ทผ๋๊ธ