UserService.class

서비스의 계층은 다음과 같다. Controller → UserService(StravaService) → UserRepository

StravaService는 내부에서 딱히 엔티티를 저장하지 않는다. 단순히 API를 통해 가져온 라이드 오브젝트를 다시 UserService에게 리턴해준 다음 이 오브젝트들을 User 오브젝트에 담고 한번에 UserRepositroy에 user를 저장하면서 함께 저장되도록 한다.

UserService의 addUser() 메소드의 주요 로직은 다음과 같다.

  1. Token, UserInfo, UserStatus 요청
  2. 서버 DB에 해당 User 존재하는 지 확인, 없으면 새 User 오브젝트 생성
  3. StravaService.getRide() 요청, 예외처리
  4. User오브젝트에 List<Ride>추가, DB 저장

지금은 서버에 해당 유저에 대한 정보가 존재하는지(이전에 요청한 적이 있는지) 확인하기 위해 DB를 직접 조회하는 방식을 사용하고 있다. 나중엔 여기에 Redis cache를 도입해보자.

UserInfo는 Ride 데이터와는 별도로 스트라바 상에서 업데이트 될 수 있다. 이를 판단하는 필드는 UserInfo.updated_at 필드로 가지고있는 updated_at과 비교해 갱신여부를 결정한다.

StravaService는 업데이트할 Ride 데이터가 없는 경우에는 NoUpdateDataException을 발생시키는데 이 예외를 감지하는 경우 별도의 Ride 오브젝트 관련 로직은 처리하지 않고 단순 저장후 리턴한다.

UserServiceTest.addNewUserTest()

간단하게 내부에서 의도한대로 UserRepositroy에 저장하는지도 검증했다.

UserServiceTestWithSpring.addNewUserTest()

이번엔 실제로 어떤 쿼리가 발생하는지 확인하기 위해서 모킹하지 않고 실제 오브젝트들과 스프링컨텍스트를 이용해서 테스트 해봤다.

일단 처음으로 발생한 문제.

UserService.addUser()