πŸ“‚ μŠ€ν”„λ§/κΈ°λ³Έ κ°œλ…

μƒμ„±μž μ£Όμž…μ„ μ„ νƒν•˜λΌ!

Amenable 2023. 4. 7. 00:39

  이전 글을 톡해 μ˜μ‘΄κ΄€κ³„λ₯Ό μ£Όμž…ν•˜λŠ” 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;
    }
}

 

ν•΄λ‹Ή 글은 κΉ€μ˜ν•œ λ‹˜μ˜ 'μŠ€ν”„λ§ 핡심 원리 - 기본편'을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.