시간을 대소비교 할 때는 숫자로 비교하는 것이 가장 편하기 때문에 기존 member_auth
의 expire_dtm
의 데이터 타입을 INT
로 변경했더니 회원 가입을 할 떄 오류가 발생한다.
Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: StatementCallback;
SQL [INSERT INTO forum.member_auth (member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn) VALUES(56, '', 'e67ff01ee499423285426bbb44d05df5', DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'), 1713673255884, 'N');];
Data truncation: Incorrect datetime value: '1713673255884' for column 'expire_dtm' at row 1;
nested exception is com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1713673255884' for column 'expire_dtm' at row 1
MemberAuthDao.java
public class MemberAuthDao extends JdbcTemplate {
private DataSource dataSource;
public int addMemberAuthInfo(MemberAuthDto dto) {
/*
* String sql = String.format("INSERT INTO forum.member_auth " +
* "(member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn) " +
* "VALUES(%d, '', '%s', DATE_FORMAT(NOW(), '%%Y%%m%%d%%H%%i%%s'), %d, 'N'); ",
* dto.getMemberSeq(), dto.getAuthUri(), dto.getExpireDtm());
*/
String sql = "INSERT INTO forum.member_auth (member_seq, auth_num, auth_uri, reg_dtm, expire_dtm, auth_yn) "
+ "VALUES(?, '', ?, DATE_FORMAT(NOW(), '%%Y%%m%%d%%H%%i%%s'), ?, 'N'); ";
Object[] args = {dto.getMemberSeq(), dto.getAuthUri(), dto.getExpireDtm()};
return update(sql, args);
}
Data truncation이라는 단어에서 알 수 있듯이 1713673255884
을 DATETIME
타입으로 변경하려다 값의 범위를 넘어 데이터 일부가 소실된다는 에러이다. member_auth
의 expire_dtm
의 데이터 타입을 더 큰 값의 범위를 담을 수 있는 BIGINT
로 변경했다.