챌린지 생성
이슈내용
데이터 수정 시 롤백 현상
챌린지(금액 제한에 대한 절약 서비스) 기능을 하며
챌린지 내역은 조회하지 않는다고 하여 이전 챌린지 내역을
저장하는 것은 불필요하다고 생각하였다.
하나의 메서드에 수정과 저장이 가능했던 기억이 있어서 한번 시도해보고자 했다.
챌린지를 생성하는 메서드에 이전의 챌린지 내역이 있다면 "수정"을 하고
완전 처음이라면 "저장"을 하는 메서드로 하여 챌린지 참여여부를 하나의 메서드로
표현하고자 했다.
하지만 의도와는 다르게 데이터 생성은 되지만 수정이 되지 않았다.
디버깅을 해보았는데 데이터는 잘 수정되고 return까지 되는 것을 확인했다.
하지만 데이터가 롤백이 되어 수정되지 않았다.
내가 찾은 정보에 따르면, 생성의 주체인 challenge가
save로 데이터 생성은 되지만 수정을 할 수 없다는 것이다.
어떤 키워드로 이문제의 원인을 알아낼까 고민을 하다가
위 글을 보고 transactioal에 대해 떠올랐다.
transactional의 4원칙(ACID)
1. 원자성 (Atomic)
2. 일관성 (Consistency)
3. 독립성 (Isolation)
4. 내구성 (Durability)
이 원칙들이 위배되고 있다고 생각해서 불가능하다고 생각했다.
이전 방법이 불가능하다고 생각하여 challenge 종료 시 newChallenge를 도전하게
스케줄러로서 flag가 될만한 값을 설정하여 생성할지 생성하지 않을지를 선택하게 하였다.
flag가 되는 부분은 Beggar라는 테이블에 있는데 한 메서드 안에 challenge의 생성, Beggar의 수정은 가능했다.
Beggar는 생성의 주체가 아니기 때문에 가능한 것으로 보인다.
이러한 문제를 만난 것이 정말 값진 경험인 것 같다.
결과
챌린지 API 화면
챌린지를 도전하지 않은 상태의 Beggar 테이블
5만원 챌린지를 누르기전 화면
챌린지를 신청한 후 선택 화면
챌린지를 시작한 후 Beggar 테이블
Beggar 테이블에서 어떤 챌린지를 도전중인지 조회하기 위함과
스케줄러로 일정시간이되면 null로 다시 바꿔주기 때문에 도전여부를 표현하였다.
challenge 테이블 일부
회고
다른 멘토님, 개발자님들의 조언으로는
내가 이전에 의도했던 방법이 처음부터 잘못된 방법이었다고 한다.
Transactional은 "법칙"이 아니라 "원칙"이다.
현업에서는 원칙대로 되지 않는 경우도 많다고 말씀해 주셨다.
Transactional에 대해 가볍게 알고 있었는데 이번 기회를 통해 좀 더 자세히 알아보고
싶어졌다.
실전 프로젝트) Apoorpoor
'프로젝트 회고' 카테고리의 다른 글
실전 프로젝트) Apoorpoor - 아이템 이미지 나타내기 (0) | 2023.07.04 |
---|---|
실전 프로젝트) Apoorpoor - 작성했던 테스트 코드의 방향성 (0) | 2023.07.02 |
실전 프로젝트) Apoorpoor - 아이템 필터 (0) | 2023.07.02 |
실전 프로젝트) Apoorpoor (0) | 2023.07.01 |
미니 프로젝트) HANGHAE66 (2) | 2023.05.12 |