본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 의존관계 자동 주입] 생성자 주입을 선택해라!

@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;
    }

    @Override
    public Order createOrder(Long memberId, String itemName, int itemPrice) {
        Member member = memberRepository.findById(memberId);
        int discountPrice = discountPolicy.discount(member, itemPrice);

        return new Order(memberId, itemName, itemPrice, discountPrice);
    }
}

final 키워드

생성자 주입을 사용하면 필드에 `final` 키워드를 사용할 수 있다. 그래서 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.

  • 생성자에서의 초기화: final 필드는 반드시 생성자에서 초기화되어야 합니다. 이는 모든 의존성이 객체 생성 시 명확히 주입되어야 함을 보장합니다.
  • 불변성 보장: 한 번 초기화된 후 이 필드들은 변경될 수 없습니다. 이는 객체가 사용되는 동안 해당 의존성이 변경되지 않음을 보장하여, 애플리케이션의 안정성과 예측 가능성을 높입니다.
  • 스레드 안전성: final 필드는 객체 생성 후 변경되지 않으므로, 객체가 다른 스레드에 의해 공유될 때 발생할 수 있는 동시성 문제를 방지할 수 있습니다.