Pam
Pam 블로그 주인장

bad SQL grammar []

에러

1
2
3
4
5
6
7
8
9
10
11
12
    public Long save(Reservation reservation) {
        final String sql = "insert into reservation (name, date, timeId) values (?, ?, ?)";

        jdbcTemplate.update(connection -> {
                    final PreparedStatement preparedStatement = connection.prepareStatement(sql, new String[]{"id"});
                    preparedStatement.setString(1, reservation.name());
                    preparedStatement.setString(2, reservation.date());
                    preparedStatement.setString(3, String.valueOf(reservation.timeId()));
                    return preparedStatement;
                }, keyHolder);
        return (Long) keyHolder.getKey();
    }

JDBC 템플릿을 통해 예약 데이터를 데이터베이스에 저장하는 실습을 진행하고 있었다. 오류가 발생한 코드는 위와 같다.

error: “Internal Server Error”
message: "PreparedStatementCallback; bad SQL grammar []"
path: “/reservations”
status: 500
timestamp: “2023-12-04T08:26:13.762+00:00”

오류는 위와 같이 발생했다. SQL 문법이 잘못됐을 경우에는 보통 bad SQL grammar [select * from member where name = ?]와 같이 어떤 SQL이 잘못됐는지 알려줬기 때문에 SQL을 인식하지 못했다고 판단했다.

해결 과정

인터넷에 검색하니 나와 비슷한 오류를 겪은 인프런 질문글이 있었다.

위 글의 답변은 아래와 같다.

encrypted_password 컬럼을 인식하지 못하는 것으로 보여집니다.
작성한 쿼리 또는 DB에 해당 테이블의 컬럼이 정상적으로 생성되었는지 확인 부탁드려요.

위 답변으로 인해 컬럼 인식 문제라는 것을 알 수 있었다.

위 답변을 보고 데이터베이스를 확인했다. 데이터베이스

데이터베이스에는 time_id값이 올바르게 생성된 것을 보아 정상적으로 작동했음을 알 수 있었다.

해결

데이터베이스가 문제가 아니니 코드상 SQL문의 칼럼 문제이다.

다시 확인하니 "insert into reservation (name, date, timeId) values (?, ?, ?)"에서 time_id 칼럼이 스네이크 케이스가 아닌 카멜 케이스 timeId로 작성되어 있음을 확인할 수 있었다.

이를 수정하니 해당 오류는 사라졌다. 앞으로 잘 확인하자…