본문 바로가기
슬기로운 자바 개발자 생활/스프링 및 자바웹 서비스

Java map object value to integer Casting

by 슬기로운 동네 형 2023. 6. 15.
반응형

Java map object value to integer Casting

 

 프로젝트를 하고 있는데 이곳은 패턴을 Map을 사용해 데이터베이스에서 값을 가져온다.

 한때 Vo객체와 Map객체 패턴을 놓고 뭐가 더 좋네 말들이 많았던 기억이 있는데 내 입장에서는 뭐든 관계없다.

 다만, 숫자로 계산을 하는 서비스를 만든다고 한다면 두 패턴의 장단점을 잘 이해하고 사용해야 한다.

 데이터베이스에서 Map형태로 값을 가져오게 되면 Number 타입들은 BigDecimal 형태로 Map Object에 담기는 것으로 보인다. 자바로 가져와 Number 값들을 비교나 연산을 하게 되는 어떤 로직들이 들어가게 되면 꼭 숙지해야 된다.

 뭐든 캐스팅이 될줄 알았는데 int 캐스팅은 먹질을 않고 to_String을 사용하지 않고 Map에서 iMap.get('invoiceAMt') 형태로 사용하면 에러가 난다.

 BigDeciaml을 사용해보니 잘 된다.

Map 결과값

데이터를 화면에 찍어보니 숫자는 더블쿼테이션이 없으므로 자동으로 형변환이 되었다는 추측이 들었다.

        List<Map<String, Object>> castingList = list.stream()
                .map(iMap -> {

                    log.info("오브젝트 상태의 값 : " + iMap.get("INVOICE_AMT"));

                    BigDecimal b = new BigDecimal(iMap.get("INVOICE_AMT").toString());
                    BigDecimal tt = new BigDecimal("0");
                   // b = BigDecimal.valueOf(iMap.get("INVOICE_AMT"));
                    log.info("캐스팅 된 결과는 : "+b);
                    if(b.compareTo(tt) == 1 ){
                        log.info("0 이상입니다." +  b.toString());
                    }else if(b.compareTo(tt) == 0 ){
                        log.info("0 이네요" +  b.toString());
                    }else if(b.compareTo(tt) == -1 ){
                        log.info("0 작네요" + b.toString());
                    }

                    //Integer?
                    log.info("오브젝트 상태의 값 : " + iMap.get("INVOICE_AMT"));

                    int intNum = Integer.parseInt(iMap.get("INVOICE_AMT").toString());
                    log.info("int 로 표현 " + intNum);

                    return iMap;
                })
                .collect(toList());

로그

int 캐스팅이 안된다.

반응형

댓글