하나의 컨트롤러로 다중쿼리문 동작시 에러

조회수 343회

스프링부트, 리액트로 웹사이트 만들고 있습니다. 백앤드쪽 코드 문제인데 먼저 코드 보여드립니다.

 //채팅방 나가기와 채팅방에 아무도 남아있지 않다면 해당 채팅방 관련 데이터 삭제
@PutMapping("/chatroom/leave")
    public ResponseEntity<UserChatRoomInfo> chatRoomLeave(@RequestBody ChatDTO dto) {
        try {
            int result = ucriService.chatRoomLeave(uiService.findByNickname(dto.getNickname()).getUserId(), dto.getChatRoomSEQ());
            chatService.leaveChatRoom(dto.getChatRoomSEQ());
            return ResponseEntity.status(HttpStatus.OK).body(null);
        } catch (Exception e) {
            log.info("delete error");
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
        }
}
public int chatRoomLeave(String id, int code) {
        return dao.updateLeaveStatus(id, code);
    }

@Query(value = "UPDATE USER_CHATROOM_INFO SET LEAVE = 'Y' WHERE USER_ID = :id AND CHATROOM_SEQ = :code", nativeQuery = true)
    int updateLeaveStatus(@Param("id") String id, @Param("code") int code);

    @Transactional
    public void leaveChatRoom(int chatroomSeq) {
        // 모든 유저의 LEAVE 값이 'Y'인지 확인
        boolean allUsersLeft = userChatRoomInfoDAO.allUsersLeft(chatroomSeq);
        log.info("allUsersLeft : " + !allUsersLeft);
        if (!allUsersLeft) {

            // 채팅 메세지 테이블에서 해당 채팅방 관련 데이터 삭제
            chatMessageDAO.deleteByRoomSEQ(chatroomSeq);

            // 유저 채팅방 정보 테이블에서 해당 채팅방 정보 삭제
            userChatRoomInfoDAO.deleteByChatroomSeq(chatroomSeq);

            // 채팅방 테이블에서 해당 채팅방 데이터 삭제
            chatRoomDAO.deleteByRoomSEQ(chatroomSeq);

        }

    }

    @Query(value = "SELECT COUNT(*) FROM USER_CHATROOM_INFO WHERE CHATROOM_SEQ = :chatroom_seq AND LEAVE = 'N'", nativeQuery = true)
    boolean allUsersLeft(@Param("chatroom_seq") int chatroomSeq);

    @Modifying
    @Query(value = "DELETE FROM CHATMESSAGE WHERE CHATROOM_SEQ = :id", nativeQuery = true)
    int deleteByRoomSEQ(@Param("id") int id);

   @Modifying
    @Query(value = "DELETE FROM USER_CHATROOM_INFO WHERE CHATROOM_SEQ = :chatroom_seq", nativeQuery = true)
    int deleteByChatroomSeq(@Param("chatroom_seq") int chatroomSeq);

    @Modifying
    @Query(value = "DELETE FROM CHATROOM WHERE CHATROOM_SEQ = :id", nativeQuery = true)
    int deleteByRoomSEQ(@Param("id") int id);

컨트롤러와 호출하는 서비스, dao, 쿼리문입니다. db는 오라클 사용하고 있습니다.

작동 순서는 ucriService.chatRoomLeave가 돌아가서 db를 update하여 데이터 하나의 특정값을 Y로 바꿉니다

이후 chatService.leaveChatRoom를 통해 특정값이 Y를 가지고 있지 않은 데이터들을 조회하고 조건에 따라 delete쿼리문들이 돌아갑니다.

코드를 짤때는 분명 잘 될거라 생각했는데 ucriService.chatRoomLeave까지만 되고 그 다음 코드는 동작을 못하고 오류가 있는지 catch로 바로 빠져나와 버리더라구요 스프링부트 콘솔창에는 SQL Error: 1002, SQLState: 24000, ORA-01002: 인출 시퀀스가 틀립니다 이런 메세지가 출력됩니다.

프론트에서 백으로 필요한데이터가 잘 전달되는건 확인했습니다.

조금 알아보니 트랜잭션때문에 오류가 발생하는 거라고 하네요 ucriService.chatRoomLeave동작후 강제로 커밋시키는 방법은 없나요?

이외 해결할 수 있는 방법 찾아주신다면 감사하겠습니다

아직 배워가는 단계라 많이 어렵네요 ㅠㅠ

  • 쿼리문마다 트랜잭션걸어서 해결했습니다 어렵내요 ㅠㅠ minsu705@gmail.com 2023.10.29 01:43

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)