기존 프로젝트에서는 사용자의 정보를 다루는 UserService와 라이드 정보를 다루는 StravaService로 분리해서 서비스 레이어를 구성했었다. 하지만 사실 UserService는 Strava Service가 돌려준 데이터를 기반으로 User 오브젝트에 맵핑하고 DB에 저장하는 역할을 담당했다.
일단 User 오브젝트에는 프로필 데이터 이외에도 사용자의 라이드 정보가 전부 담겨야 하기 때문에 userService에서 stravaService를 호출해 라이드 데이터를 가져와 DB에 저장하는 로직은 유지해야 할 것 같다. 라이드 데이터를 가져오는 작업은 시간이 쫌 걸리지만 어처피 이 데이터를 클라이언트에게 리턴되어야 하는 데이터이기 때문에 블로킹 방식으로 구현하도록 하자.
webClient 오브젝트를 직접 사용하는것은 너무 코드가 복잡해지기 때문에 이를 한번 감싸서 단순한 메소드로 기능을 제공하는 StravaApiClient 클래스를 작성했다.
이제 Strava API에 접근할 때에는 이 오브젝트를 통해서 할 수 있다.
내 서비스는 항상 외부 API에 의존하고 있기 때문에 테스트가 매우 오래걸린다는 단점이 있다. 그러면 이번엔 Mockito를 통해서 외부 API를 사용하지 않고 로컬환경에서만 테스트 하도록 해 개발시간을 줄여보도록 하자.
API에 접근하기 위해선 StravaApiClient 오브젝트를 사용해야 하는데 이 오브젝트를 MOCK 오브젝트화 하여 테스트에 사용하도록 해보자.
우선 API를 통해 받아놓은 JSON 데이터들을 static 디렉토리에 저장해놓고 beforeEach 메소드로 테스트 실행에 앞서 JSON을 오브젝트화 해놓는다.
그다음 Mock오브젝트화 된 StravaApiClient가 이 맵핑된 오브젝트를 리턴하도록 하면 끝이다. 이제 이 StravaApiClient를 이용한 Service 로직을 만들어보자
일단 테스트 코드를 작성했다.
가장 기본적인 로직인 User를 생성하고 DB에 저장하는 로직이다. UserService는 StravaApiClient와 userRepository를 주입받아 사용하는데 이 두 오브젝트의 로직은 이미 검증되기도 했고 UserService의 검증과는 상관이 없기 때문에 Mock오브젝트로 대체한다.
UserService에서 사용자 프로필 정보를 가져와서 DB에 저장하는 로직도 잘 작동하는 것 같다.
UserService에서 담당해야 하는 작업은 꽤 많지만 일단은 다 재껴두고 사용자 요청이 발생하면 사용자 데이터로 User 오브젝트를 생성하고 라이드 데이터를 전부 가져와서 저장하는 로직까지 만들자.
라이드 데이터를 다루는 로직은 StravaService로 별도의 로직으로 나누자