인프런 커뮤니티 질문&답변

Byunguk Ahn님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

컨트롤러에서 호출하는 서비스 질문드립니다.(+더티체킹)

24.07.25 09:17 작성

·

65

0

안녕하세요 항상 양질의 강의 해주셔서 먼저 감사드립니다.

 

현재 코드 작성 중에 어떤게 더 나은 방법인지 궁금해서 문의드립니다.

카드 충전하는 서비스가 있다고 가정하면 컨트롤러를 통해 카드 충전 서비스를 호출할 예정입니다.

class Controller {
private final ChargeService chargeService;
 void charge() {
    chargeService.charge();
  }
}

위와 같이 충전 진행 시, 내부에서는 카드를 찾고 외부 API를 통해 충전을 진행 후 더티체킹을 통해 카드 상태를 업데이트 할 예정입니다.

class ChargeService {
  private final CardFindService cardFindService;
  private final ChargeHistoryService chargeHistoryService;
  void charge() {
    var card = cardFindService.findCard();
    cardApiService.charge(); // 외부 API 호출
    chargeHistoryService.save(); // 충전 내역 저장
    card.updateStatus(); // 카드 상태 변경
  }
}

여기서 궁금한게 충전을 진행하는 ChargeService 내에서 더티체킹을 통해 카드의 상태를 업데이트 하는게 좋을지, 아니면 컨트롤러단에서 ChargeService와 CardUpdateService를 각각 호출해주는게 좋을까요?

class Controller {
private final ChargeService chargeService;
private final CardUpdateService cardUpdateService;
 void charge() {
    chargeService.charge();
    cardUpdateService.updateCardStatus();
  }
}

OSIV를 꺼둔 상태에서 진행 시 chargeService 내 하나의 트랜잭션 내에서 충전 내역과 카드 상태까지 업데이트를 하는게 편리해 보이긴 하지만, chargeService 내에서 카드의 상태를 업데이트하는 역할까지 주어지는 것 같아 고민이 됩니다.

만약 서비스 2개를 각각 호출하게 되면 cardFind도 각 서비스 내에서 1회 씩 총 2번 호출되는 점도 마음에 걸립니다.

이와 같은 상황에서는 어떤 방식이 실무에 더 적합하고 좋을지 의견 부탁드리겠습니다.

감사합니다.

답변 1

1

y2gcoder님의 프로필 이미지

2024. 07. 25. 09:35

안녕하세요. Byunguk Ahn님, 공식 서포터즈 y2gcoder입니다.

정답은 없으나 도움이 되길 바라면서 말씀을 드리고 싶습니다!

외부 API 호출 시간이 길지 않다면 같은 트랜잭션으로 묶어서 처리할 것 같고, 외부 API 호출 시간이 길다면 하나의 큰 서비스 내에서 카드 충전, 카드 상태 업데이트에 대한 로직을 따로 호출할 것 같습니다. 각 서비스 내에서 여러 번 호출되는 문제는 같은 트랜잭션으로 묶었을 때보다 더 문제가 안될 경우가 많습니다 🙂 (특히 pk나 인덱스로 호출한다면 더 그렇습니다)

먼저 생각하신 바대로 진행해보시고, 안되면 바꾸셔도 됩니다 🙂

 

감사합니다.