드디어 내일이 중간 발표날입니다. 조금은 해이해진 요즘인데 프론트로부터 알림 구현에 대해 수정 요청이 들어왔습니다. 제가 요청받은 사항은 아래와 같습니다.
- redirect 되는 페이지의 정보를 게시물 타입, 게시물 아이디로 보내주기
- 알림에 알림을 발신하는 멤버의 정보(닉네임, 프로필사진)을 추가
- 알림 목록 조회시 최신순으로 조회
1, 2번을 하고 실행을 눌렀는데 어제와 같은 에러가 발생했습니다. IP 주소를 확인하니 그새 또 변경이 되었더라고요. 제가 무슨 해커도 아니고 맨날 IP 주소가 변경이 되네요. 고정 IP 신청을 하면 된다는데 일단은 버텨봅니다.
비관적 락 pessimistic Lock
@Transactional
@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="3000")})
Optional<PostLike> findByPostLikedIdAndMemberId(Long postLikedId, Long memberId);
이틀 전부터 있던 버그는 위와 같이 비관적 락을 걸어줘서 바꿨습니다.
비관적 락(Pessimistic Lock)을 사용하는 이유는 아래와 같습니다.
1. 트랜잭션이 충돌한다고 가정하고 락을 사용
2. DBMS의 락 기능을 사용
3. 데이터 수정 시 즉시 트랜잭션 충돌 여부를 확인 가능
비관적 락에는 두가지 종류가 있습니다:
- Exclusive Lock은 데이터를 변경하고자 할 때 사용되며, 트랜잭션이 완료될 때까지 유지되어 해당 Lock이 해제될 때까지 다른 트랜잭션은 해당 데이터에 읽기를 포함하여 접근을 할 수 없습니다.
- Shared Lock은 다른 사용자가 동시에 데이터를 읽을 수는 있지만 Write는 할 수 없습니다.
PESSIMISTIC_WRITE 은 Exclusive Lock을 걸고, 데이터를 읽거나, 업데이트하거나, 삭제하는 것을 막습니다.
JPA는 PESSIMISTIC_WRITE 이외에도
- PESSIMISTIC_READ - Shared Lock을 걸고 데이터가 업데이트 되거나 삭제되지 않도록 한다
- PESSIMISTIC_FORCE_INCREMENT - PESSIMISTIC_WRITE와 유사하고 ENTITY의 버전 속성을 추가로 증가시킨다.
EXCEPTION의 경우에는 PersistenceException(락을 가져오는데 실패하면 예외 발생), LockTimeoutException(락을 기다리다가 설정해놓은 wait time을 지났을 때 예외 발생) 이 있습니다.
저는 좋아요 실행 시 충돌이 발생한 것을 이미 봤기 때문에 충돌이 발생한다는 것을 가정하는 비관적 락을 걸었습니다. Lock이 길어지면 Latency가 길어지기 때문에, @QueryHints를 사용하여 Lock에 3초 타임 아웃을 적용했습니다.
결과는?
잘 됩니다.
좋아요를 여러번 연속해서 처리할 때 true 값만 반환이 되던(아마 충돌이 일어나서 실행이 되지 못했겠던) 현상이 사라지고 정상적으로 잘 작동이 됩니다.
프론트 요청 처리하기
새로운 칼럼을 추가하려고 하니 이미 DB가 서버에 올라가 있어서 다 날리고 새로 올리는 작업을 여러번 반복해야했습니다. 저만 칼럼을 수정하고 추가하고 있던게 아니었거든요.. API 명세가 처음이랑은 전혀 다른 모습이 되었습니다. 내일이 중간 발표인데 중간 발표가 끝나면 한번 정리하는 시간을 가져야 할 것 같습니다.
이제는 CRUD 수정하는 정도는 금방 해버립니다. 실제로 위의 1,2,3, 요청은 2 시간도 안걸려서 해결해버렸답니다. JPA가 정말 편해요.. 스프링은 사랑입니다😘
'TIL' 카테고리의 다른 글
TIL 설날 2023 230122 (0) | 2023.01.23 |
---|---|
TIL 최종 프로젝트 중간 발표 230121 (0) | 2023.01.23 |
TIL SQL Error The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server 230119 (0) | 2023.01.20 |
TIL 동시성 문제? 나의 첫 버그 230118 (0) | 2023.01.18 |
TIL 로그인한 유저 비로그인 유저 구분하기 230117 (0) | 2023.01.18 |