작성
·
48
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
안녕하세요, 강의 수강 중 질문이 생겨 여쭤봅니다.
MemberServiceV1에서 memberRespository.update(fromId, fromMember.getMoney() - money); validation(toMember); memberRespository.update(toId, toMember.getMoney() + money); 해당 코드가 있습니다. 트랜잭션을 사용하지 않아서 테스트 코드에서 예외가 발생하며 memberA는 8000원, memberEx는 10000원이 된다고 말씀하셨는데, 근본적인 원인은 validation(toMember); 의 위치 문제가 아닐까 생각이 드네요 ..!
validation(toMember); memberRespository.update(fromId, fromMember.getMoney() - money); memberRespository.update(toId, toMember.getMoney() + money);
이렇게 순서를 바꾸면 검증을 먼저 수행하고 이체를 하니 테스트 코드에서 둘 다 1만원으로 변동이 되지 않던데, 단순히 트랜잭션 이해를 위한 설명으로 생각하면 될지 싶어 여쭤봅니다 !
답변 2
0
안녕하세요. wonderwall09in님, 공식 서포터즈 y2gcoder입니다.
해당 부분은 이체 로직 도중의 에러를 나타내기 위한 장치로 이해해주시면 감사하겠습니다.
이체 로직을 정말 간단하게 설명해보자면
인출할 계좌를 찾아 돈을 인출
입금할 계좌를 찾아 인출한 돈을 입금
로 요약할 수 있을 것 같습니다. 이 때 1번과 2번 사이의 처리 과정 사이에서 에러가 발생했다고 가정했을 때를 주목해주시면 좋을 것 같습니다. 말씀해주신 것과 같이 이체 처리 과정 중간에, 이미 인출할 계좌에서 돈이 빠져나간 후에 에러가 발생한 상황임을 주목한 예시로 봐주시면 감사하겠습니다!
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. wonderwall09in님.
트랜잭션의 핵심 개념은 모든 작업이 성공적으로 완료되지 않으면, 중간에 일어난 모든 변경 사항이 원래 상태로 되돌아가야 하는 것입니다. 현재 질문에서는 validation(toMember)
의 위치가 트랜잭션 동작에 영향을 주는 것으로 볼 수 있습니다.
질문에서 언급한 코드는 트랜잭션 처리 없이 진행되었을 때, 중간에 예외가 발생했을 경우 멤버 A의 금액만 변경되고, 이로 인해 데이터가 불일치하게 되는 문제를 다루고 있습니다. 하지만 순서를 바꾸어 validation(toMember)
를 먼저 수행하면, 검증 실폐 시 금액 조정 로직이 아예 실행되지 않으므로, 그런 문제가 발생하지 않습니다.
위 순서 변경을 통해 예외 처리가 이 전에 수행되므로 로직 변경에 따라 테스트 코드에서 일관된 상태를 유지하게 되지만, 이는 트랜잭션의 중요성을 설명하기 위한 데모의 일환으로 이해하시면 됩니다. 실제 트랜잭션 사용의 경우, 이러한 순서 변경 없이도 트랜잭션 자체가 보호막 역할을 해줍니다.
유사한 내용이 논의된 게시물을 추천드립니다:
- 트랜잭션 이해- 트랜잭션-적용1 부분 질문입니다.
- @Transaction에 대해서 질문드드립니다.
이 링크들에서 트랜잭션의 원리에 대해 더 깊이 있는 설명을 통해 이해하실 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.