안녕하세요! 진짜 오랜만에 다시 글을 쓰게 되었습니다.
오늘은 저번 시간에 미처 못 구현한 주문 그리고 할인해주는 기능을 개발해보도록 합시다!
할인 정책 개발
먼저 기억나실지 모르겠지만 저희는 등급제를 운영하여 VIP등급이면 1,000원을 고정적으로 할인해주는 할인 정책으로 개발하기로 했었습니다. 뭔가 못미덥죠? 저라면 여기서 VIP 얼른 되어서 컵라면 하나씩 공짜로 계속 주문할 것 같네요. 하지만 일단은 이렇게 구현하라니까~~
저희의 shopping 프로젝트에 패키지를 추가해볼까요? 할인이니까 discount라고 하면 좋겠네요.
(자 이제 패키지 2개째!)
불안불안하게 뭔가 나중에 바뀔것같은건 일단 뭐부터 구현해야 할까요??
바로…
인터페이스!! 맞습니다. DiscountPolicy라는 인터페이스를 만들어보죠. 그리고 음… 구현해야할건 그냥 회원의 등급을 확인해서 할인해줄지 말지하는 함수 하나면 될거같아요.
아래와 같이 discount() 함수를 구현할거라고 한번 작성해볼까요?
할인정책 인터페이스
이제 이 할인정책을 구현해봅시다. 고정할인정책으로요!
고정할인 구현 클래스
사용자 즉 Member를 불러와서 그 등급이 VIP이면 위에 선언한 할인할 고정 금액(discountFixAmount), VIP가 아니라면 0을 return해주는 즉! _해당 사용자가 주문을 하면 할인될 금액을 return_해주는 함수 discount()가 완성되었습니다.
주문 기능 구현
이제 거의 다 왔습니다!!
우리 웹사이트의 상품을 누군가가 구매하면 그 주문에 대한 정보를 가지는 주문 엔티티, 그리고 주문을 하게 해주는 기능들을 만들어볼 차례입니다.
주문이 이루어졌을 때 우리는 어떤 정보를 저장해야할지 우선 생각해봅시다.
- 사용자정보(Member의 id값)
- 상품의 이름
- 상품의 가격
- 할인정책을 통해 할인될 가격
썩 좋은 설계는 아니란 것은 알지만 우리는 간단하게 만들어볼 예정이니까 이렇게 구성해보겠습니다.
이제 Order라는 패키지를 만들러 가봅시다! com.naver.shopping 안에 order라는 이름의 패키지를 만들어주세요.
(이젠 수월하게 하시겠죠?)
이젠 늘 그랬듯이 엔티티→인터페이스→구현클래스 순서대로 스무스하게 만들어주겠습니다~
엔티티
먼제 우리가 필요하다 했던 4개의 요소들을 넣어주고 생성자를 만들어줍시다!
밑에 함수 두개를 만들었는데 calculatePrice()는 보시다시피 상품금액에서 할인된 금액을 빼서 사용자가 구매하게될 금액을 return해주는 녀석입니다.
그리고 toString()은 원래 String타입으로 해당 값을 return해주는 함수인데 이 기능을 조금 더 업그레이드해서 콘솔화면에서 Order의 형태를 바로 보기좋게 Override해준 함수입니다.
그 후 4개의 변수들의 getter를 만들어줍시다.
Alt+Insert해서 들어오는거 기억하시죠? 4개 변수 다 선택하고 확인!!
인터페이스
간단하게 주문을 생성하는 함수 하나만 딱 만들어봅시다. 대충 어떻게 해야할지 감이 오시죠? order 패키지 안에 OrderService라는 이름으로 인터페이스를 만들어봅시다.
이름은 createOrder로 지었습니다. 껌일거라 생각하고 가볍게 넘어가겠습니다!
주문 구현 클래스
우리의 서비스 이름에 Alt+Enter를 눌러 서비스 구현을 간단하게 만들어봅시다!
이렇게 만들면 간단하게 틀이 생성됩니다!
createOrder()를 구현 한번 해봅시다.
받아온 memberId를 이용해 Member엔티티형 변수 member를 먼저 만들었습니다. 그리고 우리가 방금 만든 discountPolicy를 이용해서 받아온 itemPrice와 member를 통해 할인될 금액도 불러왔습니다. 마지막으로 Order 엔티티의 형태에 알맞게 항목들을 집어넣어주고 이렇게 만든 Order를 반환해주면 완성입니다!
아 이 위에 memberRepository랑 discountPolicy도 뭘 쓸건지 명시해줘야겠죠. 그럼 OrderServiceImpl은 전체적으로 아래와 같은 코드가 됩니다.
그럼 드디어 구성해야할 요소들은 다 들어왔습니다!!!!!!!!!!!!!! 와!!!!!!!!
잘 작동하나 봐보자
이제 작성한 기능들이 잘 동작되는지 확인해봐야겠죠? com.naver.shopping안에 OrderApp 이라는 클래스를 만들어 확인해봅시다.
OrderApp에선 main함수를 만들어서 직접 실행할 수 있도록 해봅시다. 임의로 member를 하나 만들고 그 사용자가 24900원짜리 USB를 샀다고 한 가정을 작성해볼까요?
(닥치고 USB나 주쇼!)
main함수에 들어간 작업 하나하나 읽어보시길 바랍니다.
자 이제 이 OrderApp을 실행해줍시다!
왼쪽 OrderApp 줄의 초록 삼각형을 클릭하면 바로 실행 가능합니다!
(결과화면)
Order의 toString()을 override한 덕분에 System.out.println()함수에 들어간 order는 string역할을 해야해서 우리가 지정한 toString() 포맷으로 보기 좋게 출력이 되었습니다.
우리가 main()에 넣은 작업대로 잘 실행이 된게 보이시죠?? VIP여서 discountPrice도 1000원으로 잘 나오네요.
중요한건 member의 등급이 바뀌면 어떻게 결과가 바뀔지 확인하는 것이기 때문에 실험체1의 등급을 낮춰줘봅시다.
강등~~~
그리고 실행하게되면????????
이렇게 discountPrice가 0원이 된것을 확인하실 수 있습니다!
마치며
이렇게 우선은 Member와 Discount 그리고 Order의 기능을 구현해보는것을 완료해봤습니다.
근데 우리가 main함수로 임시로 만들어서 테스트하고 잘되면 지우고 참 귀찮죠? 그렇다고 남겨놓기에는 저희 프로젝트가 지저분해지게 되니ㅠㅠ
그래서 다음시간에는 더 간지나게 간편하게 내가 구현한 기능이 잘 실행되나! 알아볼 수 있는 test방법을 알려드리도록 하겠습니다.
테스트하는것도 꽤 재밌습니다!!
해당 글에서 추가된 git commit 내용은 아래 링크에서 확인하실 수 있습니다.
https://github.com/KIMB0B/blog_spring/commit/7946828c9c6a13bb37c3da5464f0d45058323dda
이상 긴 글 읽어주셔서 감사합니다!!!!