대머리개발자

비트 연산은 생각보다 파워풀한 친구다. 본문

개발이야기/개념

비트 연산은 생각보다 파워풀한 친구다.

대머리개발자 2024. 8. 19. 15:59
728x90

있고 없고를 쉽게 판단할 수 있다.

예를들어 루틴의 스케쥴을 만들 경우

 

0x1000000 월

0x0100000 화

0x0010000

0x0001000

0x0000100

0x0000010

0x0000001 일

 

오늘 수행해야할 루틴(미션)을 가져올때 진짜 심플하게 가져올 수 있다.

select id from routine where (weekSchedule & 0x0010000) = 0x0010000 and userId = '가즈아';

 

각 루틴이 가지고 있는 스케쥴 Value에서 수요일 비트 Value(0x0010000)를 AND(&) 연산하면 된다.!

모든 부분을 심플하게 처리할 수 있다.

 

문제는 JPA에 지원이 안 된다. 쉬바. 

..
.where(qChallengers.status.eq(Status.S)
                .and(bitAnd(qRoutine.weekSchedule, Utils.getTodayBit() ))
                .and(qRoutine.authStartDt.before(LocalTime.now()))
                .and(qRoutine.authEndDt.after(LocalTime.now()))
                .and(qRoutineResult.performDt.isNull)
)
..

fun bitAnd(column: NumberPath<Long>, bitMask: Long): BooleanExpression {
        return Expressions.booleanTemplate("{0} & {1} = {1}", column, bitMask)
}

 

컴파일은 문제 없지만 실제 수행하면..  오류 빵빵

org.hibernate.query.sqm.ParsingException: 
line 6:55 mismatched input '?' 
expecting {<EOF>, '.', '[', '+', '-', '*', '/', '%', '||', AND, BY, DAY, EPOCH, GROUP, HOUR, MINUTE, MONTH, NANOSECOND, OR, ORDER, QUARTER, SECOND, WEEK, YEAR}

 

네이티브로 해야 하나.. 아니면... 비지니스에서 발라야 하나...

 

일단. 진짜 어지간하면 네이티브는 지양하니깐...

 

이단. 개인당 루틴이 많아야 10개 안팎의 "데이터"만  가볍게 존재하니 가져 와서 발라내느것으로 체크!

 

페이징처리가 필요할 정도의 데이터라면.. 무조건 네이티브.

fun search(searchInfo: SearchInfo): List<RoutineListDto> {
    val todayBit = Utils.getTodayBit()
    return routineRepository.searchPerforming(searchInfo).filter { it.weekSchedule and todayBit == todayBit }
}

 

 

좋았따!..무ㅓ든 그냥 하는것이 아니라 개똥철학을 붙이자!

 

728x90