inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

123

Byunguk Ahn

작성한 질문수 3

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번 호출되는 점도 마음에 걸립니다.

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

감사합니다.

java spring spring-boot jpa

답변 1

1

y2gcoder

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

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

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

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

 

감사합니다.

강의 관련 외 질문입니다.

0

81

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

1

101

1

BeanCreationException

0

96

3

Update 후 UpdateMemberResponse 매핑할 때

0

57

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

103

2

페이징 + 검색조건 관련해서 질문드립니다.

0

74

1

Query Dsl Q파일 질문입니다.

0

86

1

루트 쿼리라는것은

0

62

1

메서드를 분리하는 기준

0

71

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

116

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

92

2

fetch join과 영속화와 OSIV의 관계

0

90

2

Distinct 사용 전 결과에 대한 의문

0

118

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

63

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

79

2

dto 필드 속 엔티티 여부

0

63

1

뷰템플릿 사용 시

0

82

2

Result 클래스 관련 질문

0

57

1

@PostConstruct 프록시 관련 질문드립니다

0

88

1

DTO 대신 Form 사용은 안되나요?

0

140

1

OSIV ON 상태일 때

0

99

1

fetch join VS fetch join 페이징 궁금증

0

190

2

양방향 연관관계 알아보는 법?

0

110

1

16강 17강 간단 정리 이게 맞을까요 ?

0

168

2