์์กด๊ด๊ณ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ 4๊ฐ์ง๊ฐ ์๋ค.
- ์์ฑ์ ์ฃผ์
- ์์ ์ ์ฃผ์ ( setter ์ฃผ์ )
- ํ๋ ์ฃผ์
- ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
[ ์์ฑ์ ์ฃผ์ ]
์์ฑ์๋ฅผ ํตํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์์ฑ์ ํธ์ถ์์ ์ 1๋ฒ๋ง ํธ์ถ๋๋ค.
- ๋ถ๋ณ, ํ์ ์์กด๊ด๊ณ ์ฌ์ฉ
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
์ด๋ ๊ฒ @Component ์ ๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค์ ์์ฑ์๋ฅผ ์์ฑํ๊ณ , @Autowired ์ ๋ ธํ ์ด์ ์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด์ค๋ค.
ํ์ง๋ง, ์์ฑ์๊ฐ ํ๋์ธ ๊ฒฝ์ฐ์๋ @Autowired ์ ๋ ธํ ์ด์ ์ ์๋ตํด๋ ๊ด์ฐฎ๋ค. (์๋์ผ๋ก @Autowired๊ฐ ์ ์ฉ๋๋ค.)
[ ์์ ์ ์ฃผ์ (setter ์ฃผ์ ) ]
setter๋ผ๊ณ ๋ถ๋ฆฌ๋ ํ๋์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์ ์ ๋ฉ์๋๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด ๊ด๊ณ ์ฌ์ฉ
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
์ด๋ฐ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ค์ผ ํ๋ค.
๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๋๋ฌธ์ final์ ์ง์์ค๋ค. (๋ง๋..?)
๊ทธ๋ค์ set~~์ ์์ฑํด์, ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํด์ฃผ๊ณ , @Autowired์ ์ฌ์ฉํด์ ์์ฑํด์ค๋ค.
์ฌ๊ธฐ์๋ @Autowired์ ์๋ตํ๋ฉด ์๋๋ค.
์ ํ์ ์ผ๋ก ์ฃผ์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
@Autowired(required = false)
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
๐ ์์ฑ์ ์ฃผ์ ๋ ์๋๋ฐ ์์ฑ์๋ฅผ ์ ์์ฑํ์๊น?
์๋ฐ๋ ๊ฐ์ฒด ์์ฑ์ ํ๋ ค๋ฉด ๋ฌด์กฐ๊ฑด ์์ฑ์๋ฅผ ์์ฑํด์ผ ํ๋ค. @Autowired์ ์ฐ์ง ์์๋ ์์ฑ์๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ์์กด๊ด๊ณ ์ฃผ์ ์ด ์ฐ์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์์ฑ์๋ก ์ธํด ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋จผ์ ๋๊ณ , ๊ทธ ๋ค์์ setter์ฃผ์ ์ด ์ด๋ฃจ์ด์ง๋ค.
[ ํ๋ ์ฃผ์ ]
ํ๋์ ๋ฐ๋ก ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
@Autowired private MemberRepository memberRepository;
@Autowired private DiscountPolicy discountPolicy;
์ด๋ฐ์์ผ๋ก ํ๋์ @Autowired์ ๋ ธํ ์ด์ ์ ๋ถ์ธ๋ค.
- ํ๋์ฃผ์ ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ์ง๋ง ํ ์คํธ ํ๊ธฐ ํ๋ค๋ค.
- DIํ๋ ์์ํฌ๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์ง ๋ชปํ์ง ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ํธ์ด ์ข๋ค.
ํ ์คํธ๋ฅผํ๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ์๋ก ์์ฑํด์ค์ผ ํ๋ค.
@Test
void fieldInjectionTest(){
OrderServiceImpl orderService = new OrderServiceImpl();
orderService.setMemberRepository(new MemoryMemberRepository());
orderService.setDiscountPolicy(new FixDiscountPolicy());
orderService.createOrder(1L, "itemA", 10000);
}
ํ ์คํธ ์ฝ๋๋ ๋ณต์กํด์ง๊ณ , ์๋ฐ ์ฝ๋์๋ set๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ค์ผํ๋ค.
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
๊ตณ์ด ์ด๋ ๊ฒ ํ๋ ๊ฒ๋ณด๋ค ์ฐจ๋ผ๋ฆฌ setter ์ฃผ์ ์ผ๋ก ํ๋ ๊ฒ์ด ๋ซ๋ค.
[ ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์ ]
์ผ๋ฐ ๋ฉ์๋๋ฅผ ํตํด์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
- ํ๋ฒ์ ์ฌ๋ฌ ํ๋๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ ์ฌ์ฉํ์ง ์๋๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy; // DIP์งํค๊ณ ์์, ์์ ํ ์ธํฐํ์ด์ค์๋ง ์์กด
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
์ผ๋ฐ ๋ฉ์๋ ์ฃผ์ ์ ์์ ์ ์ฃผ์ ๊ณผ ๋น์ทํ ์๋ฆฌ๋ก ๋์๋๋ค.