DB의 값을 linked list 처럼 사용하게 해주는 case when then

김종완·2022년 8월 25일
0

Jpa Case When Then

이번에 카테고리를 만들고 카테고리에 우선순위도 부여할 일이 생겼다. 카테고리에 우선순위를 부여한다는 것

차체는 문제가 별로 없다. 하지만 이미 우선 순위가 정해져 있는 상태에서 insert, update, delete 쿼리를 수행하게 된다면 기존의 우선순위 값이 겹치게 될 수 있고 그러면 뒤 순위의 우선순위 값들을 모두 1씩 더해주는 로직이 필요하다.

이를 해결하기 위해 Case When Then을 활용해보려 한다.

만든 로직

@Modifying
    @Query("update Category as c " +
            "set c.priority = case " +
            "when :priority <= c.priority then (c.priority + 1) " +
            "else c.priority " +
            "end")
    fun categoryUpdate(priority: Int)

    @Modifying
    @Query("update Category as c " +
            "set c.priority = case " +
            "when :priority < c.priority then (c.priority - 1) " +
            "else c.priority " +
            "end")
    fun categoryDelete(priority: Int)

구글링한 결과 위와 같이 사용하여 원하는 로직을 개발 할 수 있을 것으로 보인다. 우선 새로 카테고리를 추가하게 되면 위 categoryUpdate 메소드를 실행시켜서 insert될 카테고리의 우선순위를 확보한 다음 insert를 시킨다.

그다음으로 delete를 할 때는 categoryDelete 메소드를 실행시킨다. 해당 메소드를 실행시켜 우선순위가 낮은 카테고리의 우선순위를 1씩 마이너스한다. 그렇게 우선순위를 유지한다.

마지막으로 업데이트 할 때이다. 업데이트할 때는 categoryDelete, categoryUpdate 메소드 두개를 모두 실행시킨다. 그 이유는 카테고리 우선순위가 변경 될 경우 우선 해당 카테고리가 기존 위치에서 빠져나오기 때문에 categoryDelete 메소드를 실행시키고 다음으로 categoryUpdate 로직을 실행시킨다.

참조한 자료

Update priority of other records based on new /old value in SQL Server

만났던 에러

unexpected token: - near

위 에러는 then 절에 c.priority - 1을 실행할 때 괄호로 묶어주지 않아서 발생한 에러였다. 아무래도 then 절에 연산이 있을 경우 괄호로 묶어야 문법 오류가 발생하지 않는 것으로 보인다.

profile
개발에 재미를 느끼며 꾸준히 성장하는 개발자 김종완 입니다.

0개의 댓글