본문 바로가기

프로그래밍/스프링[Spring]

[스프링] 스프링 시큐리티 처음에만 로그인이 안 되는 현상[PreparedStatementCallback]



스프링 시큐리티를 이용하여 로그인을 구현하였는데 간헐적으로 올바른 정보를 입력을 해도 처음에만 로그인이 안 되는 현상이 있었습니다.

 

그리고 다시 로그인을 하면 정상적으로 작동하는 현상이 있었습니다.

 

일단 제가 찾아본바로는 아래와 같은 경우에 발생하는 현상이었습니다.

 

 

1. 테스트용이거나 혹은 DB를 가끔식만 사용하는 경우

2. 내가 Mysql DB를 사용하고 있는 경우

 

실 서버에서만 발견되었던 현상이라 이를 해결하고자 에러 메시지를 alert 창으로 간단하게 띄워 보았습니다.

 

별도의 핸들러를 구현하여 에러 메시지를 볼 수 있도록 했습니다

 

에러 내용: 
PreparedStatementCallback; SQL [***************************************************]; 
The last packet successfully received from the server was 64,477,614 milliseconds ago.  
The last packet sent successfully to the server was 64,477,614 milliseconds ago. 
is longer than the server configured value of 'wait_timeout'. 
You should consider either expiring and/or testing connection validity before use 
in your application, increasing the server configured values for client timeouts, 
or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.; 

 

결론은 wait_timeout이나 autoReconnect를 사용하라는 Exception입니다.

 

해석을 해보면 mysql 서버가 일정 시간 idle 상태면 connection을 끊어 버리기 때문에 처음에 로그인이 안 되던 현상이었습니다.

 

그래서 datasource에서 DB접속설정을 하는 Bean에 프로퍼티를 추가하여 해결해 보고자 합니다.

 

아래의 프로퍼티를 추가했습니다.

 

<!-- validationQuery: 유효 검사용 쿼리( 1개 이상의 row를 반환하는 쿼리) -->
<property name="validationQuery" value="select 1"/>
<!-- testWhileIdle: 컨넥션이 놀고 있을때  validationQuery 를 이용해서 유효성 검사를 할지 여부. -->
<property name="testWhileIdle" value="true"/>
<!-- timeBetweenEvictionRunsMillis: 해당 밀리초마다 validationQuery 를 이용하여 유효성 검사 진행 -->
<property name="timeBetweenEvictionRunsMillis" value="7200000"/>

이렇게 설정하여 mysql에서 connection을 끊지 않도록 중간중간 유효성 검사를 진행해서 방지를 합니다.

 

이상입니다 감사합니다~