본문 바로가기
개발자 전향 프로젝트

[QueryDSL] Hexadecimal to Decimal Conversion (데이터 포맷 변환)

by 샘오리 2024. 5. 21.
728x90
반응형

 

언어:  Java 17

 

사전 설명: 필자의 경우 출력하고자 하는 데이터의 칼럼이 varchar로 되어있음

분명 데이터가 숫자임에도 varchar를 쓰는 이유는 유연하다는 특징이 가장 큰데 이러한 이유로 비즈니스에서 주로 varchar 타입이 선호되고 인터페이스에서도 varchar로 선언된걸 자주 볼 수 있음. 특히 16진수와 같은 데이터는 알파벳도 들어가 있기 때문에 varchar로 사용됨.

 

하지만 varchar, 즉 string은 숫자의 데이터 포맷 변환이 되지 않음.

즉, 데이터 포맷을 변환할 때는 숫자로 변환해야 하고 출력할 때는 문자열로 해야함.

 

추가로 알아야할 것은 QueryDSL에서 선언된 QClass의 칼럼은 StringPath라고 하는 타입을 갖게되는데

이 타입은 실제 값을 주는것이 아니라 말 그대로 경로를 나타내는 것이기 때문에 잘못 변환하게 되면

실제 값이 아닌 경로를 출력하게 됨.

 

예를 들어 

abcHistory.user 라고 하는 칼럼이 있다고 하면

원하는 값은 그 user 칼럼에 담긴 데이터겠지만

잘못된 방법으로 변환 시  abcHistory.user 라고 하는 경로 자체가 출력됨.

 

1-1. StringExpression 변수 선언 및 커스텀 데이터 변환 함수 호출

StringExpression 변수명 = convertHexaToDecimal(테이블명.칼럼명);

 

1-2. 커스텀 데이터 변환 함수 구현 (이 경우 MySQL,MariaDB 문법에 국한된 CONV()함수 사용)

private static StringTemplate convertHexaToDecimal(StringPath 매개변수) {
    return Expressions.stringTemplate("CONV({0}, 16, 10)", 매개변수);
}

 

1-3. 조회하는 부분에 변수 넣고 출력하고자 하는 가명으로 설정 

.select(Projections.bean(DTO 명.class,
        변수명.as("가명"),

 

장점: 구현하기 쉽다.

 

단점: DB 에 국한되어 있다. DB가 바뀌면 문법이 바뀌고 사용할 수 없을 수 있다.

즉, Orm을 쓰는 목적과 상반된다.

 

 

TODO: ORM이 무엇인가? db-agnostic 한 모델 아닌가?

 

db 문법과 상관없이 개발언어만으로 변환을 하든 방법을 찾아야 할 것이다.

이 경우 더 많은 코드가 생기겠지만 유지보수 입장에서는 더 낫다고 볼 수 있다.

 

자바의 경우 아래 함수를 쓰면 decimal로 변환할 수 있다고 한다.

Integer.parseInt(인자,16);

 

 위 함수를 사용해서 일일히 바꿔줘야 하는 칼럼을 변환해주고 다시 담아주면서

캐스팅이 복잡한데 이걸 추가 하는 노고가 필요하긴 하다.

728x90
반응형