Programing/Error Resolution(오류해결)

Executing an update/delete query 오류 해결

세기루민 2022. 11. 14. 23:31
728x90

최근 GraphQL + JPA 공부를 하다가 아래와 같은 오류를 접하게 되었다. 

위의 오류를 해석해보면 업데이트와 삭제시 발생할 수 있는 예외처리로 떨어졌다....

사실 위의 오류만 확인해서는 어떤 문제인지 정확하게 알기 어렵다.

일단 로직을 하나씩 봐보도록 하자

1. 서비스 로직

public Boolean updateMemberEmailMask(String memberid) throws Exception{
		
		// 1. 맴버 이메일 조회
		List<Member> memberList = memberRepository.findAll();
		String memberEnEmail = null;
		
		for(Member member : memberList){
			if(member.getMemberid().equals(memberid)){
				// 2. 이메일 마스킹 처리
				String memberEmail = maskingService.maskingMemberEmail(member.getMemberemail());

				// 3. 마스킹 된 이메일 업데이트
				int chk = memberRepository.updateMemberEmailMask(memberid, memberEmail);
				
				// 4. 업데이트 체크 
				if(chk == 0){
					return false;
				}
			}
		}
		return true;
	}

서비스 로직에서는 이메일 조회 후 마스킹 처리, 마스킹 처리 완료 시 테이블에 업데이트를 하는 로직이다. 

2. 레파지토리 로직

public interface MemberRepository extends JpaRepository<Member, Integer> {


    // memberIdUpdate
    @Modifying
    @Query("update member m set m.memberemail = :memberEmail where m.memberid = :memberId")
    int updateMemberEmailMask(@Param("memberId")String memberId, @Param("memberEmail")String memberEmail) throws Exception;
 }

또한 데이터 조회는 JPA의 기본 find를 사용하지만 UPDATE의 경우 직접 JPQL로 작성하였다.


 

코드를 보다가 느낀 건데... Transaction 처리를 하지 않아서 발생한 오류이다.

Update/Delete의 경우 Transactional을 이용하여 lock 혹은 오류 발생 시 롤백 처리를 해야하기 때문에 Transaction 처리가 필요하다.

public interface MemberRepository extends JpaRepository<Member, Integer> {


    // memberIdUpdate
    @Transactional
    @Modifying
    @Query("update member m set m.memberemail = :memberEmail where m.memberid = :memberId")
    int updateMemberEmailMask(@Param("memberId")String memberId, @Param("memberEmail")String memberEmail) throws Exception;
    
}

따라서 와 같이 @Transactional을 추가해주면 오류는 해결된다.

 

728x90