[스프링 핵심원리 기본편] 7.3 어떤 의존 관계를 선택?! ➡️ 생성자 주입

코린이서현이·2023년 11월 12일
0

😣들어가면서😣

학과공부도 놓치면 안돼~~~
하지만 못하게 되어도 어떻게든 되겠지. 내가 어떻게든 해결하겠지... 뭐ㅎ
그렇다면 오늘의 계획 절반을 못하더라도 이것또한 제가 해결하지 않을까요?
아니요.

🙆 생성자 주입을 선택해라!

❣️ 생성자 주입을 선택해야하는 이유

📌 불변

  • 대부분의 경우 의존관계를 변경하지 않기 떄문에, 변경하지 못하는 생성자 주입이 최고👍
  • setXxx 메서드를 public으로 열어두어야 한다. ➡️ 위험성이 있는 설계 방법😣
  • 생성자 주입은 객체를 생성할 때 딱 1번만 호출되므로 이후에 호출되는 일이 없다.

✔️ 따라서 불변하게 설계할 수 있다.

📌 누락

⭐ 누락을 방지한다.

💭 한번 생각해보자

✔️ 프레임워크 사용 없이 순수한 자바코드로 테스트 코드를 작성하는 경우

  • 테스트 코드 짤 때 이런 경우가 자주 발생한다.
  • 🤔 수정자 주입을 쓰는 경우
@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;
  }
  • 🤔 테스트 코드 작성
class OrderServiceImplTest {
  @Test
  void createOrder() {
    OrderServiceImpl orderService = new OrderServiceImpl();
    orderService.createOrder(1L, "itemA", 10000);

  }
}

💻 실행 화면 : ⚠️ 오류가 나요

java.lang.NullPointerException

➡️ 왜그럴까요? OrderServiceImpl() 는 사용할 수 있는 멤버레파지토리가 있어야하는데, 넣어주지 않았기 때문이다. ✔️ 스프링프레임워크를 사용했으면 빈으로 등록하면서, 의존관계를 주입을 했겠지만, 지금은 순수 자바코드!! ⚠️ 따라서 오류가 발생한다.

🔨 생성자주입을 사용했다면?

✔️ 컴파일 오류로 아주 간단하게 해결~!!

⭐ 즉, 누락할 일이 없다.


class OrderServiceImplTest {
  @Test
  void createOrder() {
    MemoryMemberRepository repository = new MemoryMemberRepository();
    repository.save(new Member(1L,"name", Grade.VIP));

    OrderServiceImpl orderService = new OrderServiceImpl(repository, new FixDiscountPolicy());
    Order order = orderService.createOrder(1L, "itemA", 2000);
    assertThat(order.getDiscountPrice()).isEqualTo(1000);
  }
}

📌 final 키워드 사용

final키워드를 사용하면, 생성자를 통해서 꼭 필드를 설정할 수 있도록 한다.
👉 안하면 오류 발생
➡️ 생성자에서만 값을 넣어줄 수 있고, 다른 곳에서는 오류를 낸다.
➡️ 생성자에 값이 설정 되지 않는 오류를 컴파일 시점에 모두 막아준다.

✔️ final키워드를 사용하는 것 자체가 좋다. 👍

  private final MemberRepository memberRepository;
  private final DiscountPolicy discountPolicy;

💡 정리하자면!

  • 기본으로 생성자 주입을 사용하고, 필수 값이 아닌 경우에는 수정자 주입 방식을 옵션으로 부여하면 된다.

⭐ 컴파일 오류는 세상에서 가장 빠르고, 좋은 오류다!

👏마무리하면서👏

음 졸려 하지만 해내자. 
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글