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
안녕하세요. Byunguk Ahn님, 공식 서포터즈 y2gcoder입니다.
정답은 없으나 도움이 되길 바라면서 말씀을 드리고 싶습니다!
외부 API 호출 시간이 길지 않다면 같은 트랜잭션으로 묶어서 처리할 것 같고, 외부 API 호출 시간이 길다면 하나의 큰 서비스 내에서 카드 충전, 카드 상태 업데이트에 대한 로직을 따로 호출할 것 같습니다. 각 서비스 내에서 여러 번 호출되는 문제는 같은 트랜잭션으로 묶었을 때보다 더 문제가 안될 경우가 많습니다 🙂 (특히 pk나 인덱스로 호출한다면 더 그렇습니다)
먼저 생각하신 바대로 진행해보시고, 안되면 바꾸셔도 됩니다 🙂
감사합니다.