강의

멘토링

커뮤니티

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

우민수님의 프로필 이미지
우민수

작성한 질문수

제미니의 개발실무 - 커머스 백엔드 기본편

코드 느끼기

@Transactional에 관해서 질문드립니다.

해결된 질문

작성

·

29

1

안녕하세요!

강의를 보던 중 ReviewService의 트랜잭션 처리에 대해 궁금한 점이 있어 질문드립니다.

 

addReview 함수에서 리뷰를 저장하는 add()와 포인트를 적립하는 earn() 두개의 중요한 함수를 사용하고 있는데, 이는 각각 별도의 트랜잭션으로 처리되어 리뷰는 저장되고 포인트는 적립되지 않는 문제가 발생할 수 있을 것 같습니다.

 

현재 설계에서 addReview()에 @Transactional을 붙이지 않은 특별한 이유가 있으신지 궁금합니다. 혹은 만약 의도적으로 별도 트랜잭션으로 분리한 것이라면 그 이유가 궁금합니다.

 

항상 감사합니다.

답변 3

1

제미니님의 프로필 이미지
제미니
지식공유자

안녕하세요! 질문 감사드립니다 😃

이 부분은 의도적으로 Transaction 을 걸지 않은 게 맞습니다! (고민해보시라고 의도한 바인데 고민을 하고 계시다니 아주 좋네요!)


트랜잭션을 잠시 떠나서 다른 관점으로 생각해보면 "Review 작성 후 Point 작성이 실패했다해서, 반드시 Review가 롤백이 되어야하나?, 이게 고객이 심각한 문제를 겪는 것일까?" 를 생각해볼 수 있을 것 같습니다

물론 이것 또한 상황마다 다르기 때문에 반드시! 포인트는 완벽히 그 순간에 100% 지급되야해! 라는 비즈니스적 요구사항과 니즈가 있다면 묶어주는게 맞다고 생각합니다

결국 리뷰 작성 시 포인트가 지급이 안되는 문제가 얼마나 빈번하게 발생 하는지, 그것이 얼마나 중요한 사항인지에 따라 선택하면 되는 부분이라고 봐주시고

다양한 관점으로 생각해보시면서 고민해보시면서 느껴보시면 좋을 것 같습니다! 😃

 

다만 지금 구조에서는 문제가 생긴다면 포인트 적립에 대한 재적립을 수동으로 해줘야합니다, 이건 운영 리소스를 쓰겠다는 것 이기 때문에 이 관점으로 우리는 운영 리소스가 적기 때문에 트랜잭션을 걸어야한다! 라는 주장도 아주 합리적이라고 생각합니다 (지급 실패 재시도를 만들면 되지 않나? 라는 의견이 나올 수도 있겠죠!)


이런 관점들을 계속 느끼시면서 Point개념이 얼마나 타 개념에 응집되고 결합될것인가?에 대한 고민도 같이 해봐주시면 강의를 100% 즐기실 수 있다고 봅니다! 😀

+추가적으로 조금 기능을 발전 시켜간다면 Point 적립 자체는 @Async로 처리하도록 만들 수 있을 것 같습니다 😃 이 관점도 생각해보시면 좋을 것 같습니다!


모쪼록 답이 되었길 바랍니다! 추가 질문은 편하게 부탁드립니다!
완강까지 잘 부탁드리고 수강평도 기대하겠습니다!

0

우민수님의 프로필 이미지
우민수
질문자

답변 감사합니다!

답변을 보고 나니 제가 놓치고 있던 관점들이 훨씬 명확해진 것 같습니다.
특히 문제 발생 시 포인트 적립에 대한 별도 처리가 없다는 점이 궁금했는데,
의도적으로 트랜잭션을 걸지 않으신 이유와 그 안에 담긴 설계적 포인트를 이해할 수 있었습니다.

남은 강의도 “나라면 어떤 선택을 할까?”, “이 비즈니스에서 무엇이 중요한 요구사항일까?” 같은 관점으로 더 깊이 있게 보도록 하겠습니다!
정성스러운 답변 정말 감사합니다 :)

0

안녕하세요, 인프런 AI 인턴입니다. 우민수님.

강의에서 사용된 트랜잭션 처리 방식에 대한 궁금증을 가지고 계신 것 같습니다. @Transactional 애너테이션은 일반적으로 하나의 작업 단위를 전체적으로 성공하거나 실패하게 만드는 것이며, 이는 데이터의 일관성과 원자성을 유지하는 데 도움을 줍니다.

트랜잭션의 중요성

  1. 일관성 유지: 트랜잭션이 없다면 각 작업(addReview, earn 등)이 개별적으로 커밋되어 일부 작업이 성공하고 일부는 실패할 수 있습니다. 이는 데이터 불일치를 초래할 수 있습니다.

  2. 원자성: 모든 작업이 하나의 트랜잭션 내에서 처리되어, 작업 중 하나라도 실패하면 이전의 모든 작업이 롤백됩니다.

addReview()에 @Transactional을 붙이지 않은 이유

  • 만약 addReview 내의 각각의 작업이 독립적으로 처리되길 원한다면 (예: 리뷰는 저장되지만, 포인트 적립은 일시적으로 보류 가능한 경우) 이렇게 설정할 수 있습니다.
  • 혹은 코드가 단순히 누락된 경우일 수도 있습니다.

비슷한 질문을 다룬 토론이 있습니다:
- 서비스 레이어에서 @Transactional을 사용해야 하는 이유
- OrderService에서 조회에 트랜잭션 걸어준 이유가 있을까요?

이 토론에서는 @Transactional을 사용하는 여러 가지 이유와 그 필요성을 설명하고 있어, 좀 더 깊이 있는 이해를 도울 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

우민수님의 프로필 이미지
우민수

작성한 질문수

질문하기