언어: 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);
위 함수를 사용해서 일일히 바꿔줘야 하는 칼럼을 변환해주고 다시 담아주면서
캐스팅이 복잡한데 이걸 추가 하는 노고가 필요하긴 하다.
'개발자 전향 프로젝트' 카테고리의 다른 글
SSL 실행 에러: AttributeError: module 'ssl' has no attribute 'wrap_socket' (1) | 2024.05.28 |
---|---|
pip install 중에 발생하는 코덱 에러 : UnicodeDecodeError 'cp949' codec (0) | 2024.05.28 |
QueryDSL 다른 조건으로 같은 테이블 여러번 조인하기 (0) | 2024.04.05 |
웹 워커(Web Worker)란? 언제 쓰는 걸까? feat.타이머 (0) | 2024.02.16 |
싱글스레드 vs 멀티스레드 (1) | 2024.02.15 |