์น์ 3. ์์ ๋ง๋ค๊ธฐ์์ ์ ๊น ์ธ๊ธํ์ง๋ง ๊ตฌํ์ฒด์ ์์กด์ฑ์ ์์ ํ ๋ฐฐ์ ํ ์ฝ๋๊ฐ ์๋์๋ค. ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ๋ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํ๋ํ๋ ํด๋์ค๋ฅผ ์ฐพ์๊ฐ ์์ ํด์ผํ๋ ์ผ์ด ๋ฐ์ํ ์ ์๋ ์ฝ๋์๋ค. ์ด๋ฒ ๊ฐ์์์๋ ๊ทธ๋ฐ ๋ถ๋ถ์ ๋ฐ๊พธ๋ฉฐ ์คํ๋ง์ ์ด๋ค ์ ์ด ํธ๋ฆฌํ์ฌ ๋ง์ ์ฌ๋๋ค์ด ์ ํํ์ง๋ ์์๊ฐ๋ ๊ฐ์๊ฐ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๊ณต๋ถํ๋ฉด์ ์ด๋ค ์์ผ๋ก ์ฝ๋๋ฅผ ์ง์ผ ์์กด์ ์ด์ง ์๋ ์ฝ๋์ธ์ง ์์๋ณด๋ ๊ฒ์ด ์ข์ ๋ฏ ํ๋ค.
[ โ๏ธ ]
๐งธ
์๋ชป๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์
๐งธ ๊ตฌ์กฐํ์ ๋ ์ธ ๊ผฌ์ฐ- ๐งธ
- member
ใด class : Member, MemberServiceImpl, MemoryMemberRepository
ใด interface : MemberService, MemberRepository
ใด enum : Grade - discount
ใด class : FixDiscountPolicy, RateDiscountPolicy
ใด interface : DiscountPolicy - order
ใด class : Order, OrderServiceimpl
ใด interface : OrderService - test
main
ใด MemberApp, OrderApp
test
ใด RateDiscountPolicyTest, MemberServiceTest - AppConfig
โ๏ธ discount
< ์กฐ๊ฑด >
- ์๋น์ค ์คํ ์ง์ ์ ํ ์ธ ์ ์ฑ ์ ์ง๊ธ์ฒ๋ผ ๊ณ ์ ๊ธ์ก ํ ์ธ์ด ์๋๋ผ ์ข ๋ ํฉ๋ฆฌ์ ์ธ ์ฃผ๋ฌธ ๊ธ์ก๋น ํ ์ธํ๋ ์ ๋ฅ % ํ ์ธ์ผ๋ก ๋ณ๊ฒฝ.
- ๊ธฐ์กด ์ ์ฑ ์ VIP๊ฐ 10000์์ ์ฃผ๋ฌธํ๋ 20000์์ ์ฃผ๋ฌธํ๋ ํญ์ 1000์์ ํ ์ธ.
- ์๋ก ๋์จ ์ ์ฑ ์ 10%๋ก ์ง์ ํด๋๋ฉด ๊ณ ๊ฐ์ด 10000์ ์ฃผ๋ฌธ์ 1000 ์์ ํ ์ธํด์ฃผ๊ณ , 20000์ ์ฃผ๋ฌธ์์ 2000์์ ํ ์ธํด์ฃผ๋ ๊ฑฐ์์!
โบ RateDiscountPolicy
: ์ด ์ฃผ๋ฌธ ๊ธ์ก์ 10% ํ ์ธ ์ ์ฑ
private int discountPercent =10;
.
.
if (member.getGrade() == Grade.VIP) {
return price * discountPercent / 100;
}
์ ๋ฅ ํ ์ธ์ ์ฑ ์ธ RateDiscountPolicy๋ DiscountPolicy ์ธํฐํ์ด์ค๋ฅผ ์์ํ๋ค. ๊ทธ๋ ๊ฒ๋๋ฉด ์ธํฐํ์ด์ค์ธ DiscountPolicy์ ์ํด์๋ discount ๋ฉ์๋๋ฅผ ํฌํจ์์ผ ์ฝ๋๋ฅผ ๋ง๋ค์ด์ผํ๋ค. ๋ฉ์๋ discount๋ฅผ ์ ๋๋ก ์ด์ฉํ๊ธฐ ์ํด์ member์ price ๊ฐ์ด ๋ค์ด์์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ด์จ member์ ๋ํ ์ ๋ณด๋ฅผ Member๋ฅผ ํตํด getGradeํ์ฌ VIP์ธ์ง ํ์ธํ๋ค. ๊ทธ ํ ๋ค์ด์จ price๊ฐ์ ํ ์ธ๋ฅ ์ ๊ณ์ฐํ์ฌ returnํ๋ค.
โ๏ธ Test
โบ RateDiscountTest
: % ํ ์ธ ๊ด๋ จ ํ ์คํธ
ํ ์คํธ ๋ง๋๋ ๋จ์ถ๊ธฐ
mac : cmd + shift + T
@Test
@DisplayName("VIP๋ 10% ํ ์ธ์ด ์ ์ฉ๋์ด์ผํ๋ค.")
void vip_o() {
Member member = new Member(1L, "memberVIP", Grade.VIP);
int discount = discountPolicy.discount(member, 10000);
assertThat(discount).isEqualTo(1000);
}
@Test
: ํด๋น ๋ฉ์๋ ์์ ์ ์ธํด์ผ ํ ์คํธ ๋์์ด ๋๋ค.
assertThat(A).isEqualTo(B)
: A์ B์ ๊ฐ์ด ๋ง๋์ง ๋์ ๋ด์ฉ ์์ฒด๋ฅผ ๋น๊ตํ๋ ํ ์คํธ๋ค.
@Test ํ ๋ ์ฐ๋ ๊ณต์
โฐ given (์คํ๋จ๊ณ) : ์ด๋ค ์กฐ๊ฑด์ ์ฃผ๊ณ
Member member = new Member(1L, "memberVIP", Grade.VIP);
โป ID๋ 1L, ์ด๋ฆ์ memberVIP, ๋ฑ๊ธ์ VIP์ธ member๊ฐ
โฐ when (์คํ๋จ๊ณ) : ์ํฉ์ด ์ด๋ ํ ๋
int discount = discountPolicy.discount(member, 10000);
โป ์ด ๊ธ์ก ๋ง์์ ํ ์ธ ์ ์ฑ ์ ๋ฃ์์ ๋
โฐ then (๊ฒ์ฆ๋จ๊ณ) : ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์์ผ ํ๋ค.
assertThat(discount).isEqualTo(1000);
โป ๊ทธ ๊ฒฐ๊ณผ๊ฐ 1000์ด ๋์ด์ผํ๋ค.
••• ์ด์ด์ ๋ค๋ฅธ ์ฝ๋ ๋ถ๋ถ •••
import static org.assertj.core.api.Assertions.*;
Assertions
: AssertJ์์ ์ ๊ณตํ๋ API๋ก ํ ์คํธ์ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค๋ค.
Assertions.assertThat(discount).isEqualTo(1000);
๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ฝ๋
mac: command + enter
↓
assertThat(discount).isEqualTo(1000);
assertThat(A).isEqualTo(B)
: A์ ๊ฐ์ด ๊ธฐ๋๊ฐ B์ ๊ฐ์์ง ํ์ธํด์ฃผ๋ ์ฝ๋์ด๋ค.
ํ์ฌ ์ฝ๋์์๋ discount์ ๊ฐ๊ณผ 1000์ ๊ฐ์ด ๋ง๋์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
๋ฐ๋๋ก ๋ค๋ฅธ์ง ํ์ธํ๋ ์ฝ๋๋ assertThat(A).isNotEqualTo(B)์ด ๋๊ฒ ๋ค.
- ๋ค์ํ assertThat()์ ์ ๋ณด๋ฅผ ์ ๊ณต, ์ถ์ฒ
โ๏ธ AppConfig
OCP์ DIP๋ฅผ ์งํค๊ธฐ ์ํด ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐํ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
์ฆ, ํ๊ฒฝ๊ตฌ์ฑ์ ์ํํ ํด๋์ค์ด๋ค. ๋ณดํต Ioc์ปจํ ์ด๋ ํน์ DI์ปจํ ์ด๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Q. ์๋ ๋ฌธ์ ์ ์?
A. OrderServiceImpl์ด FixDiscountPolicy์ ์์กดํ๊ณ ์์๋ค.
์์ ์ ์ฝ๋
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
ํ ์ธ ์ ์ฑ ์ด ๋ฌ๋ผ์ง๋ฉด OrderServiceImpl ํด๋์ค์ ๊ฐ์ RateDiscounPolicy๋ฅผ ๋ค๋ฅธ ํ ์ธ ์ ์ฑ ํด๋์ค๋ก ๋งค๋ฒ ์์ ํด์ค์ผํ๋ค.
๊ทธ๋ ๊ธฐ์ ์๋ ์ฝ๋์ฒ๋ผ ์์กด์ฑ ์ฃผ์ ์ผ๋ก ์์ ํด์ค๋ค.
์์ ํ ์ฝ๋
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;
}
}
private
: ์ ์ธ๋ ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋๋ก ์ ์ํ๋ ์ ๊ทผ์ ์ด์
final
: final์ด ๋ถ์ ๋ณ์๋ ์์๊ฐ ๋์ด, final์ด ๋ถ์ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ํ๋๋ค.
Q. ์ ๊ฐ ๋งค๊ฐ๋ณ์๋ค์ private final๋ก ์ด๊ธฐํํ๊ณ ์ ์ธํ๋?
A. private๋ ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ๋ง์ฝ private๋ง ์ผ๋ค๋ฉด ๋ด๋ถ์์๋ง ์ ๊ทผ๊ฐ๋ฅํ๋ฉฐ, ๋ณ์ ๋ด์ฉ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ final์ด ๋ถ์ผ๋ฉด์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ฒ ๋์๋ค. ์ ํํ๊ฒ๋ ๋จ ํ ๋ฒ์ ์ด๊ธฐํ๋ง ๊ฐ๋ฅํ๊ฒ ๋ ๊ฒ์ด๋ค. (ํ ๋ฒ ์ด๊ธฐํ๊ฐ ๋๋ฉด ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด์ง๋ค.) ๊ทธ๋์ ํด๋น ๋งค๊ฐ๋ณ์๋ ์ธ๋ถ ์ ๊ทผ๋ ๋ถ๊ฐ๋ฅํ๋ฉฐ ๋ฉ์๋ ์์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌํ ๋นํ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํด์ง ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ๋์น๋ฉด ์๋๋ ๊ฒ์ ํด๋น ๋งค๊ฐ๋ณ์๊ฐ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค๋ ์ ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์๋ง final์ ํตํด ํ๊ณ ์ถ์๋ ๊ฒ์ ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ๋ ๊ตฌํ์ฒด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํจ์ผ ๊ฒ์ด๋ค. ๋ง์ฝ ํ ์ธ์ ์ฑ ์ด VIP๋ง 10ํผ์ผํธ ํ ์ธ์ผ๋ก ์ง์ ํด๋จ๋๋ฐ, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ๋ชจ๋ ๊ณ ๊ฐ์๊ฒ 10ํผ์ผํธ ํ ์ธ์ผ๋ก ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ํฐ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๊ธฐ์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ์(์ผ๊ด์ฑ ์ ์ง๋ฅผ ์ํด) ์์ฑ์์ private final๋ก ์ ์ธํ ๊ฒ ๊ฐ๋ค.
••• ์ด์ด์ AppConfig ์ฝ๋ ๋ถ๋ถ •••
๋ฆฌํฉํฐ๋ง ํ ์ฝ๋
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
.
.
.
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
@Configuration
: ์ค์ ํ์ผ์ ๋ง๋ค๊ธฐ ์ํ ์ ๋ ธํ ์ด์ or Bean์ ๋ฑ๋กํ๊ธฐ ์ํ ์ ๋ ธํ ์ด์ ์ผ๋ก Bean์ ๋ฑ๋กํ ๋ ์ฑ๊ธํค์ด ๋๋๋ก ๋ณด์ฅํด์ค๋ค. ๋ ์คํ๋ง์ปจํ ์ด๋์์ Bean์ ๊ด๋ฆฌํ ์ ์๊ฒ ํ๋ค.
@Bean
: Spring์ DI Container์ ์ํด ๊ด๋ฆฌ๋๋ POJO(Plain Old Java Object)๋ฅผ Bean์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. @Bean์ผ๋ก ์ ์ธ๋ ๋ฉ์๋๋ค์ ์คํ๋ง ์ปจํ ์ด๋์๊ฒ ๋น์ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ์ง์ ํ๋ค.
AppConfig์ ์ธํฐํ์ด์ค์ ๋ง๋ ๊ตฌํ์ฒด๋ฅผ returnํด์ค๋ค. ์ด๋ ๊ฒ ํด์ฃผ๋ฉด ์ด๋ค ํด๋์ค์์ ๋ค๋ฅธ ํด๋์ค๋ฅผ ํ์๋ก ํ ๋ ์ธํฐํ์ด์ค๋ง ์ ์ํ๋ฉด ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ๋ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
MemberServiceImpl(๊ตฌํ์ฒด)์ MemberService(์ธํฐํ์ด์ค)๋ฅผ ์์๋ฐ๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ์ ์ธํฐํ์ด์ค์ ์ ์ํ ๋ฉ์๋๊ฐ ๊ผญ ๋ค์ด๊ฐ์ผํ๋ค. ๊ทธ๋ฐ๋ฐ ๊ตฌํ์ฒด ์ return ๊ฐ์ ๋ณด๋ฉด save์ findById๋ก ์ฃผ๊ณ ์๋๋ฐ, ํ์๊ฐ์ ์ด ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ํน์ ์ ์ฅ์์ ๋ค์ด๊ฐ์๋ ํ์ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ์ํด MemberRepository ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ๋ ๊ฒ์ ์ ์ ์๋ค.
์ ๋ฆฌํด๋ณด๋ฉด MemberService(์ธํฐํ์ด์ค) - MemberServiceImpl(๊ตฌํ์ฒด) -> MemberRepository(์ธํฐํ์ด์ค) - MemoryMemberRepository(๊ตฌํ์ฒด)๋ก MemberServiceImpl์ด save์ findById๋ฅผ ์ด์ฉํ๊ธฐ ์ํด MemberRepository ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐํ๊ณ ์ด ์ธํฐํ์ด์ค๋ MemberServiceImpl์ ์์ํ๊ณ ์๊ธฐ์ ๊ตฌํ์ฒด์ ๊ตฌํ์ฒด๊ฐ ์ฐ๊ฒฐ๋ ์ํฉ์ ๋ง์ ๊ฒ์ด๋ค.
๊ทธ๋์ AppConfig๋ฅผ ๋ค์ ๋ณด๋ฉด ๋ฉ์๋ memberService( )๋ MemberService ํ์ ์ผ๋ก ๋น์ ๋ฑ๋กํ๊ณ MemberServiceImpl๊ณผ ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ, ๊ทธ ์์์ save์ findById๋ฅผ ์ํ์ ์ํด MemberRepository๋ฅผ ์์กด์ฑ์ผ๋ก ๋ฐ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ค.
๊ทธ ์๋ DiscountPolicy๋ฅผ ๋ณด์. ์ ์ ๋ฌธ์ ์ ์ผ๋ก, OrderServiceImpl ํด๋์ค์ ๋ค์ด๊ฐ์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๊ฐ ๋ฐ๋ ์ฝ๋๋ฅผ ์์ ํ๊ฒ ํ๋ค.(FixDiscountPolicy๋ฅผ RateDiscountPolicy๋ก) ๊ทธ๋ฐ๋ฐ AppConfig์์ ์ ์ํ๋ ์ญํ ๋ง ์ํํ๋ ํด๋์ค๋ฅผ ๋ง๋๋ OrderServiceImpl์๋ ์ธํฐํ์ด์ค๋ง ์ ์ํ๊ณ AppConfig์์ ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ์ฐ๊ฒฐ์ง์ด์ฃผ๋ฉด ๋๋ ๊ฒ์ด๋ค.
- @Configuration ์ ๋ณด ์ถ์ฒ
- @Bean์ ๊ด๋ จํ ์ด๋ ธํ ์ด์ ์ถ์ฒ
โ๏ธ MemberServiceTest
์น์ 3์์ ๋ง๋ค์๋ ํ ์คํธ ์ฝ๋ ์์ ํ๊ธฐ.
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
@BeforeEach
: ํ ์คํธ๊ฐ ๋ณต์กํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉฐ ํ ์คํธ ์ด๊ธฐํ๋ฅผ ์ํด @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate ๊ฐ ๋ถ์ ๋ฉ์๋ ์คํ ์ ์ ์คํ๋๋ค.
ํด๋์ค ๋ด๋ถ์ ์ฌ์ฉํ MemberService๋ฅผ ์ ์ธํ๊ณ ํ ์คํธ์ ๋ค์ด๊ฐ๋ค. AppConfig์ ์ ์๋์ด์๋ memberService ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด AppConfig๋ฅผ ์ ์ํด์คฌ๋ค. ๊ทธ๋ฆฌ๊ณ memberService(์ธํฐํ์ด์ค)์ ์ฐ๊ฒฐ๋ ๊ตฌํ์ฒด๋ฅผ ์ ๋๋ก ๊ฐ์ง๊ณ ์ค๊ธฐ ์ํด์ ์ด๊ธฐํ๋ฅผ ํด์ค๋ค.
๊ทธ๋ฌ๋ฉด ํ์ ์๋ ํ ์คํธ ์ฝ๋์์ ์ฐ๊ฒฐ๋ ๊ตฌํ์ฒด์ ๋ง์ถฐ ํ ์คํธ ์ฝ๋๊ฐ ์๋ํ๊ฒ ๋๋ค.
โ๏ธ OrderApp
์คํ๋ง ์ปจํ ์ด๋ ์ฌ์ฉํ์ฌ ํ ์คํธ ํด๋ณด๊ธฐ
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
AnnotationConfigApplicationContext
: java ๊ธฐ๋ฐ์ ์ค์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ Bean ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ณ ์ค์ ํ๋ ์ญํ ์ ์ํํ๋ค.
AnnotationConfigApplicationContext์ ํด๋น ํ ์คํธ์ ํ์ํ Bean์ด ๋ค์ด์๋ ์ค์ ํด๋์ค๋ฅผ ๊ดํธ ์์ ๋ฃ์ด ๋งค๊ฐ๋ณ์๋ก ๋๊ธด๋ค. ๊ทธ๋ฌ๋ฉด Bean์ ๊ด๋ฆฌํด์ฃผ๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ๋๋ ๊ฒ์ด๋ค.(@Bean์ด ๋ถ์ด์๋ ๊ฒ๋ค์ ๊ด๋ฆฌํจ) ์ฌ์ฉํ๊ธฐ ์ํด์ ๊ทธ ์๋ ์ค์ ์๋ ์ฝ๋์ฒ๋ผ getBean์ ํตํด ์ค์ ํด๋์ค์ ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋๋ค. (๋ง์ฝ @Bean์ด ์๋ค๋ฉด ๊ฐ์ ธ์ฌ ์ ์๋ค)
์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด์. ์ค์ ํด๋์ค๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฃ์์ด๋ ํ ์คํธ๋ฅผ ํ๊ธฐ ์ํด์ ์ค์ ํด๋์ค ์ ์ด๋ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง ์๋ ค์ค์ผํ๋ค. ๊ทธ๋ ๊ธฐ์ "memberService"์ "orderService"์ธ ๋ฉ์๋ ์ด๋ฆ์ ์ ์ด getBean์ ํตํด ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
๋งจ ์์ MemberService์ OrderService๊ฐ ๋ถ์ด์๋ค. ๊ทธ ์ด์ ๋ ํ์ฌ ํ ์คํธ ํด๋์ค ๋ด์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ฆ์ ๊ฐ๊ฐ memberService, orderService๋ฅผ ๋ถ์ฌ์คฌ๋๋ฐ ๊ทธ ์ด๋ฆ๋ค์ (๊ฐ์ ธ์ฌ) ํ์ ์ ์์ ์ ์ํ ๊ฒ์ด MemberService์ OrderService๊ฐ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๊ฐ ํ์ ์ ๋ง๊ฒ ์ ์๋ ํด๋์ค๋ฅผ ๊ฐ์ ธ์จ ๋ฉ์๋ ์ด๋ฆ ๋ค์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. MemberService.class์ OrderService.class์ ๊ฐ์ด ๋ง์ด๋ค. ๋ง์ผ memberService ๋ฉ์๋๋ฅผ ์ค์ ํด๋์ค ๋ด์ MemberService.class๋ก ์ง์ ์ ํด๋จ๋๋ฐ ํ ์คํธ์์ ๋ค๋ฅธ ํด๋์ค๋ก ๋ฐ๊ฟ ๊ฒฝ์ฐ ์ค์ ๋น๊ณผ ๊ธฐ๋ํ ๋น์ ํ์ ์ด ์๋๋ผ๋ ๊ฒฐ๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ .class๋ ์๋ง๊ฒ ์ ์ด๋จ์ง๋ง ๋งจ ์์ MemberService์ OrderService๋ฅผ ๋ค๋ฅธ ํ์ ์ ์ ์ ๊ฒฝ์ฐ์๋ ํ์ ์ด ๋ค๋ฅด๋ค๋ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
[ โถ๏ธ ]
ํผ์ ์ฒ์ฒํ ๊ณต๋ถํ๋ฉฐ ์์ฑํ์ต๋๋ค.
์๋ชป๋ ๋ด์ฉ์ด ์ ํ์์ ์ ์์ผ๋, ๊ฐ์ํ๊ณ ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๐ ๋ชจ๋๋ค ํ์ดํ
ํ์ธ์ ๐