당니의 개발자 스토리

주문과 할인 도메인 실행과 테스트 본문

스프링/스프링 핵심 원리 - 기본편

주문과 할인 도메인 실행과 테스트

clainy 2024. 1. 17. 17:42

주문과 할인 도메인 실행과 테스트

주문과 할인 도메인을 실행하고 테스트 해보겠습니다.

먼저, 주문이 우리가 원하는 대로 잘 동작하는지 메인 메서드를 만들어 볼게요.

hello.core 밑에다가 MemberApp 만든 것처럼,

OrderApp을 만들겠습니다. 그리고 psvm + enter 하시면,

메인 메서드가 만들어집니다. 먼저 테스트 하는데 필요한 MemberService를 만들고, OrderService도 만듭니다.

이렇게 해놓고, 필드를 만들어서 memberId를 1이라고 선언 하겠습니다. 왜냐면 Member를 저장해야되니까요.

그래서 이러한 id를 가진 Member를 만듭니다.

그리고나서,

우리가 만든 Member를 memberService를 통해서 메모리 객체에 넣어놔야되겠죠. 그래야 이따가 주문에서 찾아쓸 수 있으니까요.

이제 주문을 생성해야죠.

그리고 나서, soutv 해서 이 order를 출력하면 됩니다.

그러면,

Order에 있는 toString()이 호출되어서 출력된다고 했습니다.

이제 실행해보면,

잘 나오는 걸 확인할 수 있습니다.

한 개 더해볼까요?

cmd + d 해서 위에줄 복사해서 붙여넣기 한 다음, 다시 돌려보면, 9000원이 나오는 걸 볼 수 있습니다.

물론, 이렇게 메인 메서드로 하는 건 좋지 않죠. 자동화된 테스트를 하는게 중요합니다.

 

그래서 이제 junit으로 이걸 그대로 옮겨오겠습니다.

test 폴더에서 우리가 지금 테스트 하려는 패키지명이 order이므로, 그대로 order 라는 패키지를 만들어줍니다.

그리고 OrderServiceTest 라는 클래스를 만들어줍니다.

테스트 하기 위해 필요한 MemberService와 테스트 하려는 OrderService를 필드에 선언해줍니다.

@Test 해주고 작성하면 됩니다. 근데 여기서 Long이 아니라, long으로 해도 괜찮습니다.

long primitive type이라고 하는데, 이렇게 선언하면 null을 넣을 수가 없기 때문에 여기서는 Long 이라고 했어요. 이후에 혹시나 db에 넣고 할 때, null이 들어갈 수도 있기 때문에 처음 객체 생성 단계에서 Long 으로 한 겁니다. 딱히 중요하진 않습니다.

그래서 일단, Member를 생성해줍니다. 그리고 회원가입을 해주면,

이렇게 됩니다. 그리고 나서 이제 주문을 생성해야 하므로,

이렇게 하고, 할인금액을 검증해보는 겁니다.

VIP인 경우에는 1000원이니까 그냥 1000 적어주면 됩니다.

돌려보면, 잘 된 걸 볼 수 있습니다.


이제 한꺼번에 보기 위해서, 전체 테스트를 돌려보겠습니다.

test 폴더 밑에 있는 hello.core에서 전체 테스트를 돌려볼 수 있습니다.

근데 얘는 뭔가하면 처음에 주어지는 테스트로, 자동으로 생성된 겁니다. @SpringBootTest 라고 되어있는데, 얘는 실행하면 스프링을 띄우고 해야됩니다. 그래서 오래 걸립니다.

나중에 라이브러리가 많아지고, db랑 연결되고 하면, 테스트 뜨는 시간이 엄청 느려질 겁니다.

그래서 단위 테스트가 중요한 겁니다. 여기서 단위 테스트라고 말하는 거는 스프링이나 이런 컨테이너에 도움 없이 그냥 순수하게 자바 코드로 테스트를 하는 거예요.


잠깐 정리를 해보면,

이 그림이 핵심이죠. 클라이언트가 주문 서비스에서 주문을 생성하고 주문 서비스가 회원 저장소에서 회원을 조회하고, 할인정책을 적용해서 결과물을 클라이언트에 반환하는 겁니다.

이렇게 이 그림대로 다 만들었고, 그러면 다음 시간에는 실제 정액 할인 정책을 정률로 바꾸거나 했을 때, 정말 우리가 개발한 게 진짜 객체 지향적으로 잘 개발된 게 맞냐, 클라이언트에 영향을 주지 않냐를 볼 겁니다.

지금 보면, 다형성을 굉장히 잘 활용했습니다. 역할과 구현을 잘 분리했죠. 인터페이스랑 구현체를 따로 잘 구현했습니다.

그런데 과연 정률 할인 정책으로 깔끔하게 바꿀 수 있는가? 분명히 우린 지금 다형성을 잘 활용을 했는데! 정률 할인 정책으로 깔끔하게 바꿀 수 있는가? 라는 것을 다음 시간에 해볼 거에요.

갑자기 악덕 기획자가 나타나서 요구사항을 바꾸기 시작할 겁니다.