TDD 연습 프로젝트 8 - 멤버십 포인트 적립 API

zunzero·2022년 9월 15일
0

스프링, JPA

목록 보기
16/23

멤버십 포인트 적립 API

요구사항

  • 멤버십 포인트 적립 API
    - 기능: 나의 멤버십 포인트를 결제 금액의 1%만큼 적립한다.
    • 요청: 사용자 식별값, 멤버십 ID, 사용금액
    • 응답: X
    • 기타: 고정 금액 적립 방식으로의 확장이 유연하도록 구현한다.

Repository 계층 개발

Repository 계층에선 따로 개발할 것이 없다.
save 메서드에서 저장과 수정을 동시에 처리하기 때문이다. (영속성 컨텍스트 dirty checking)

Service 계층 개발

멤버십 적립을 위한 로직 개발을 해보자.
MembershipService는 Membership 관련 로직을 처리하는 담당으로, 포인트 계산을 위한 책임을 지는 것은 단일 책임 원칙에 어긋난다. (하나의 클래스는 하나의 책임, 혹은 최소한의 책임만 진다.)
따라서 RatePointService 클래스를 따로 만들면서 테스트를 진행하도록 하겠다.
또한, 현재는 사용 금액의 1% 비율로 적립하는 방식이지만 추후에 다른 방식으로 적립될 가능성을 고려하여 개발해보도록 하겠다.

위와 같이 간단한 테스트 코드를 작성해보았고, 컴파일 에러를 해결해나가면서 service 계층을 완성시키도록 하겠다.

포인트 적립금을 1%로 계산하는 로직을 위와 같이 작성하였다.
하지만 요구사항에서 우리는 비율로 계산하는 것 뿐 아니라, 추후에 고정 금액으로의 계산까지 고려하기를 바라기 때문에, 해당 클래스에 인터페이스를 두어서 구현체를 갈아끼울 수 있도록 하겠다.

마저 Service 계층에 대한 개발을 진행해보도록 하겠다.
멤버십 적립에 관련하여, MembershipServiceTest에 RatePointService를 주입 받아 테스트를 진행한다.

accumulateMembershipPoint 메서드가 존재하지 않아 발생하는 컴파일 에러를 수정해보자.

point값을 변경할 수 있도록 point 변수에만 @Setter를 추가해주었다.

PointService 인터페이스를 주입받아 프로덕션 코드를 완성했다.
작성한 3가지 테스트는 모두 성공적으로 통과했다.

Controller 계층 개발

controller 계층에서 테스트 해 볼 케이스는, 식별 헤더가 없어서 실패하는 경우와 0보다 작은 금액에 관한 요청으로 실패하는 경우가 있다. 나머지 하나는 성공하는 케이스!

다음과 같이 테스트 케이스를 만들고 발생하는 404 에러와 컴파일 에러를 수정하기 위해 아래와 같이 API와 새로운 DTO를 개발했다.

테스트는 모두 성공적으로 통과하면서 해당 API 개발이 마무리 되었다.

profile
나만 읽을 수 있는 블로그

0개의 댓글