πŸ“• Backend

Spring / μ˜μ‘΄κ΄€κ³„ μ£Όμž… - μƒμ„±μž, μˆ˜μ •μž, ν•„λ“œ, λ©”μ†Œλ“œ

Dongwoongkim 2023. 2. 3. 22:17

μ—¬λŸ¬κ°€μ§€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…λ°©λ²•

크게 4κ°€μ§€ 방법이 μžˆλ‹€.

 

1. μƒμ„±μž μ£Όμž… 

2. sertter μ£Όμž…

3. ν•„λ“œ μ£Όμž…

4. λ©”μ†Œλ“œ μ£Όμž…

 

1. μƒμ„±μž μ£Όμž…

μƒμ„±μž μ£Όμž… 방식은 μ§€κΈˆκΉŒμ§€ μ‚¬μš©ν•΄μ˜¨ λ°©λ²•μœΌλ‘œ μƒμ„±μžλ₯Ό ν†΅ν•΄μ„œ 의쑴 관계λ₯Ό μ£Όμž… λ°›λŠ” 방법.

@Component
public class OrderServiceImp implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    
    @Autowired
    public OrderServiceImp(MemberRepository memberRepository, DiscountPolicy discountPolicy)
    {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

 

νŠΉμ§•

μƒμ„±μž ν˜ΈμΆœμ‹œμ μ—μ„œ λ”± 1번만 ν˜ΈμΆœλ˜λŠ” 것이 보μž₯됨.

λΆˆλ³€, ν•„μˆ˜ μ˜μ‘΄κ΄€κ³„μ— μ‚¬μš©ν•˜λŠ” 방법

 

Tip : μƒμ„±μž λ©”μ†Œλ“œκ°€ ν•˜λ‚˜λ°–μ— μ—†λŠ” 경우 @Autowiredλ₯Ό μƒλž΅ν•΄λ„ μžλ™ μ£Όμž…λœλ‹€. λ¬Όλ‘  μŠ€ν”„λ§ λΉˆμ— ν•œν•΄μ„œ

 

2. setter μ£Όμž… 

setter라 λΆˆλ¦¬λŠ” ν•„λ“œμ˜ 값을 λ³€κ²½ν•˜λŠ” μˆ˜μ •μž λ©”μ†Œλ“œλ₯Ό 톡해 μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…ν•˜λŠ” 방법.

νŠΉμ§•

- 선택, λ³€κ²½ κ°€λŠ₯성이 μžˆλŠ” μ˜μ‘΄κ΄€κ³„μ— μ‚¬μš©

- μžλ°”λΉˆ ν”„λ‘œνΌν‹° κ·œμ•½μ˜ μˆ˜μ •μž λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법

 

@Component
public class OrderServiceImp implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public void setMemberRepository(MemberRepository memberRepository)
    {
        this.memberRepository = memberRepository;
    }

    @Autowired
    public void setDiscountPolicy(DiscountPolicy discountPolicy)
    {
        this.discountPolicy = discountPolicy;
    }

μ°Έκ³  : @Autowired의 κΈ°λ³Έ λ™μž‘μ€ μ£Όμž…ν•  λŒ€μƒμ΄ μ—†μœΌλ©΄ 였λ₯˜κ°€ λ°œμƒν•œλ‹€. μ£Όμž…ν•  λŒ€μƒμ΄ 없어도 λ™μž‘ν•˜κ²Œ ν•˜λ €λ©΄ @Autowired(required = false) 둜 μ§€μ •ν•˜λ©΄ λœλ‹€.

 

3. ν•„λ“œ μ£Όμž…

이름 κ·ΈλŒ€λ‘œ ν•„λ“œμ— κ·Έλƒ₯ λ°”λ‘œ μ£Όμž…ν•˜λŠ” 방법

 

@Component
public class OrderServiceImp implements OrderService{
    
    @Autowired private MemberRepository memberRepository;
    @Autowired private DiscountPolicy discountPolicy;
    

μ½”λ“œκ°€ κ°„κ²°ν•˜λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ, μ™ΈλΆ€μ—μ„œ 변경이 λΆˆκ°€λŠ₯ν•΄μ„œ ν…ŒμŠ€νŠΈν•˜κΈ° νž˜λ“€λ‹€λŠ” 치λͺ…적인 단점이 μžˆλ‹€.

μ‚¬μš©ν•˜μ§€ 말자.

 

DI ν”„λ ˆμž„μ›Œν¬κ°€ μ—†λŠ” 순수 μžλ°”μ½”λ“œμ—μ„œλŠ” 아무것도 ν•  μˆ˜κ°€ μ—†λ‹€.

순수 μžλ°”μ½”λ“œμ—μ„œλŠ” @Autowiredκ°€ λ™μž‘ν•˜μ§€ μ•Šμ•„ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ•ˆλ˜μ–΄ ν…ŒμŠ€νŠΈλ₯Ό ν•  μˆ˜κ°€ μ—†λ‹€.

 

@Test
void filedInjectionTest()
{
    OrderServiceImp orderServiceImp = new OrderServiceImp();
    orderServiceImp.setMemberRepository(new MemoryMemberRepository());
    orderServiceImp.setDiscountPolicy(new FixDiscountPolicy());

    Member member = new Member(1L,"kimdongwoong",Grade.VIP);
    MemberRepository memberRepository = ac.getBean(MemberRepository.class);
    memberRepository.save(member);
    Order itemA = orderService.createOrder(1L, "itemA", 1000);
    System.out.println(itemA);
    
}

이와 같은 μˆœμˆ˜ν•œ μžλ°” ν…ŒμŠ€νŠΈ μ½”λ“œμ—λŠ” λ‹Ήμ—°νžˆ @Autowiredκ°€ λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ setterλ₯Ό 톡해 μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. @SpringBootTest 처럼 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆλ₯Ό ν…ŒμŠ€νŠΈμ— ν†΅ν•©ν•œ κ²½μš°μ—λ§Œ κ°€λŠ₯ν•˜λ‹€.

 

 

 

4. 일반 λ©”μ†Œλ“œ μ£Όμž…

일반 λ©”μ†Œλ“œλ₯Ό ν†΅ν•΄μ„œ μ£Όμž… 받을 수 μžˆλ‹€.

νŠΉμ§•

1. ν•œλ²ˆμ— μ—¬λŸ¬ ν•„λ“œλ₯Ό μ£Όμž…λ°›μ„ 수 μžˆλ‹€.

2. 잘 μ‚¬μš©ν•˜μ§„ μ•ŠλŠ”λ‹€.

@Component
public class OrderServiceImp implements OrderService {
    private MemberRepository memberRepository;
    private DiscountPolicy discountPolicy;

    @Autowired
    public void Autowired_method1(MemberRepository memberRepository, DiscountPolicy discountPolicy)
    {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }