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)
'개발아닌개발 > springboot' 카테고리의 다른 글
SpringSecurity 패스워드 암호화 대신 sha512 사용하여 로그인 (0) | 2021.12.15 |
---|---|
[오류] Web server failed to start. Port 8080 was already in use. (0) | 2021.11.23 |
[오류] JPA를 이용하여 UPDATE @query 사용 시, No results were returned by the query (0) | 2021.11.08 |
GetMapping 반복 - Scheduler 실습하기 (0) | 2021.11.08 |
User 내용 수정하는 PUTMapping (0) | 2021.11.08 |
댓글