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개의 댓글

관련 채용 정보