본문 바로가기
개발아닌개발/springboot

Map<String, Object>의 안에 Object를 int로 바꾸는 방법

by 불청객 2021. 11. 10.
반응형

Spring Tool Suite 4

 

 

 

springboot 에서 PostgerDB를 이용하여 사용자의 로그인 요청이 오면, 아이디와 패스워드를 확인하여 결과값을 반환하기 위함.

※ UserRepository (JPA extends)는 작성되어있다는 가정

 

 

작성한 쿼리문의 결과값이다.

user_id_chk 가 참(1) 인 경우, 아이디가 있음

user_password_chk가 참(1) 인 경우, 아이디와 패스워드가 일치한다는 것

 

이를 통해 패스워드가 잘못된건지, 존재하지 않는 아이디의 로그인 시도인지 알 수 있다.

 

 

 

 

 

UserRepository.java

@Query(value = ~~~~~~~~)
Map<String, Object> Loginresult(String userid, String password);

 

반환값 Map의 String은 user_id_chk, user_password_chk 

반환값 Map의 Object는 1, 0 

 

 

여기서 내가 필요한건 Object의 값(로그인 여부에 따른 반환값)인데,

상기 이미지에 나와있다시피 Postgre DB에는 bigint로 되어 있지만, 가져와야하는 값은 int다.

참고로 말하지만 Object를 int로 변경할 순 없다!

 

 

 

 

그렇다면 혹시, 흔히 시도해볼수있는 강제로 형변환 시켰을땐 어떨까?

강제로 (int)로 캐스팅하여 if 조건문에 넣었을때 빌드는 될지 언정, 해당 구문이 수행되면 에러가 나온다.

더보기

class java.math.BigInteger cannot be cast to class java.lang.Integer (java.math.BigInteger and java.lang.Integer are in module java.base of loader 'bootstrap')

 

반응형

 

 

해결방법

 

Loginresult 쿼리 결과를 result라는 Map에 담은 뒤,

하기와 같이 입력하면 int로 받을 수 있다.  

//Map<String, Object> result

Integer.parseInt(String.valueOf(result.get("user_id_chk")))
Integer.parseInt(String.valueOf(result.get("user_password_chk")))

 

그럼 조건문을 사용할때,

하기와 같이 사용하면 코드가 수행되더라도 오류 없이 결과가 잘 나온다.

if(Integer.parseInt(String.valueOf(result.get("user_id_chk"))) == 0 ) 

if(Integer.parseInt(String.valueOf(result.get("user_password_chk"))) == 0)
728x90
반응형

댓글