μ΄μ κΈμ ν΅ν΄ μμ‘΄κ΄κ³λ₯Ό μ£Όμ νλ 4κ°μ§ λ°©λ²(μμ±μ μ£Όμ , μμ μ μ£Όμ , νλ μ£Όμ , μΌλ° λ©μλ μ£Όμ )μ μ΄ν΄λ³΄μλ€. μ΄λ² κΈμμλ 4κ°μ§ λ°©λ² μ€ μμ±μ μ£Όμ μ μ¬μ©ν΄μΌ νλ μ΄μ μ λν΄μ μμλ³΄κ³ μ νλ€.
3κ°μ§ μ΄μ (λΆλ³, λλ½ λ°©μ§, final ν€μλ μ¬μ© κ°λ₯)λ₯Ό κ·Όκ±°λ‘ μμ±μ μ£Όμ μ μ¬μ©ν΄μΌ νλ μ΄μ λ₯Ό μμ보μ.
(λ€μ΄κ°κΈ°μ μμ μμ±μ μ£Όμ μ΄λ μμ±μλ₯Ό ν΅ν΄μ μμ‘΄ κ΄κ³λ₯Ό μ£Όμ νλ λ°©λ²μ΄λ€.)
@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;
}
}
1. λΆλ³ π¦
λλΆλΆμ μμ‘΄κ΄κ³ μ£Όμ μ νλ² μΌμ΄λλ©΄ μ ν리μΌμ΄μ μ μ’ λ£μμ κΉμ§ μμ‘΄κ΄κ³λ₯Ό λ³κ²½ν μΌμ΄ μλ€. μ€νλ € λ³κ²½μ νλ©΄ μ λλ€. (λΆλ³)
μμ μ μ£Όμ μ μ¬μ©νκ² λλ€λ©΄ setter(μλμ setMemberRepository, setDiscountPolicy)λ₯Ό μ΄μ©ν΄μ λ³κ²½ν μ μλ λ¬Έμ κ° μκΈ° λλ¬Έμ μμ±μ μ£Όμ μ μ΄μ©ν΄μ λΆλ³νκ² μ€κ³ν΄μΌ νλ€.
// μμ μ μ£Όμ
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
2. λλ½ λ°©μ§ π¦
μμ μ μ£Όμ μ μ΄μ©νμ¬ μ½λλ₯Ό μ§κ³ ν μ€νΈλ₯Ό νλ κ²½μ°λ₯Ό μκ°ν΄ 보μ. μμν μλ° μ½λλ‘ μ΄λ£¨μ΄μ§ ν μ€νΈμμλ @Autowiredκ° λμνμ§ μκΈ° λλ¬Έμ μμ‘΄κ΄κ³κ° μ£Όμ λμλμ§ ν μ€νΈ μ½λμμ μ μ μλ λ°©λ²μ΄ μλ€. κ·Έλ¦¬κ³ ν΄λΉ κ°μ²΄λ₯Ό μ΄μ©νμ¬ λμμ μνμν€κ² λλ€λ©΄ λΉμ°ν NPEκ° λ¨κ² λλ€.
λ°λ©΄ μμ±μ μ£Όμ μ μ¬μ©νκ² λλ€λ©΄ μ»΄νμΌ μ€λ₯λ‘ λ¬Έμ λ₯Ό νμΈν μ μλ€.
1. μμ μ μ£Όμ μ μ¬μ©ν κ²½μ° (μ»΄νμΌ μ€λ₯ λ°μ X)
// μμ μ μ£Όμ
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discouintPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
@Test
void createOrder() {
OrderServiceImply orderService = new OrderServiceImpl(); // μ»΄νμΌ μ€λ₯κ° λ¨μ§ μλλ€.
orderService.createOrder(1L, "itemA", 10000); // νμ§λ§, μμ‘΄κ΄κ³λ₯Ό μ£Όμ
νμ§ μμκΈ° λλ¬Έμ NPEκ° λ¬λ€.
}
2. μμ±μ μ£Όμ μ μ¬μ©ν κ²½μ° (μ»΄νμΌ μ€λ₯ λ°μ O)
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
@Test
void createOrder() {
// OrderServiceImply orderService = new OrderServiceImpl(); // μ»΄νμΌ μ€λ₯κ° λ°μνλ€.
// μλμ κ°μ΄ λ°λ‘ μμ‘΄κ΄κ³ μ£Όμ
OrderServiceImply orderService = new OrderServiceImpl(new MemoryMemberRepository(), FixDiscountPolicy());
orderService.createOrder(1L, "itemA", 10000);
}
3. final ν€μλ μ¬μ© κ°λ₯ π¦
μμ‘΄κ΄κ³λ₯Ό μ£Όμ νλ λ€λ₯Έ 3κ°μ§ λ°©λ²(μμ μ μ£Όμ , νλ μ£Όμ , μΌλ° λ©μλ μ£Όμ )κ³Ό λ¬λ¦¬ μμ±μ μ£Όμ μ μ΄μ©νλ©΄ final ν€μλλ₯Ό μ¬μ©ν μ μλ€. κ·Έλ¬λ©΄ μλμ κ°μ΄ μ»΄νμΌ μμ μ λλ½λ μ 보λ μλͺ»λ μ 보λ₯Ό μ μ μλ€.
@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;
}
}
ν΄λΉ κΈμ κΉμν λμ 'μ€νλ§ ν΅μ¬ μ리 - κΈ°λ³ΈνΈ'μ μ°Έκ³ νμμ΅λλ€.
'π μ€νλ§ > κΈ°λ³Έ κ°λ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
HTTP μμ²(ν€λ, νλΌλ―Έν°, λ©μμ§) μ²λ¦¬ (0) | 2023.04.20 |
---|---|
μ€νλ§ MVC (0) | 2023.04.19 |
μμ‘΄μ± μ£Όμ - DI(Dependency Injection) (0) | 2023.04.18 |
λ‘κΉ (SLF4J, Logback) (0) | 2023.04.09 |
μμ‘΄κ΄κ³ μ£Όμ λ°©λ² (0) | 2023.04.06 |