학과공부도 놓치면 안돼~~~
하지만 못하게 되어도 어떻게든 되겠지. 내가 어떻게든 해결하겠지... 뭐ㅎ
그렇다면 오늘의 계획 절반을 못하더라도 이것또한 제가 해결하지 않을까요?
아니요.
✔️ 따라서 불변하게 설계할 수 있다.
⭐ 누락을 방지한다.
✔️ 프레임워크 사용 없이 순수한 자바코드로 테스트 코드를 작성하는 경우
@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
키워드를 사용하는 것 자체가 좋다. 👍
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
음 졸려 하지만 해내자.