문제
/board/list
로 요청시 다음과 같은 에러가 발생한다.
1
2
3
There was an unexpected error (type=Internal Server Error, status=500).
could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
문제 원인
기존 Board 도메인에는 다음과 같이 매핑되어 있었다.
1
2
3
4
5
6
7
8
9
10
11
@Entity
@Table(name="cms_blist")
public class Board {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="bNo")
private long no;
@Column(name="ctNo")
private int categoryNo;
//..
콘솔창에는 다음과 같이 예외가 발생했다.
1
java.sql.SQLException: Unknown column 'board0_.b_no' in 'field list'
왜 bNo
라고 컬럼명을 설정했는데 b_no
로 변경되는 것일까?
https://luvstudy.tistory.com/82 에 따르면, Data Jdbc에서는 name 중간에 대문자가 있으면 _소문자로 기본 변환한다고 한다. 테이블에 b_no
라는 컬럼은 당연히 없기 때문에 필드를 찾을 수 없어 SQLException 에러가 난 것이다.
해결 방법
한편, MySQL에서 테이블명과 컬럼명은 대소문자를 구분하지 않는다. 따라서 다음과 같이 Column 애노테이션의 name 속성을 모두 소문자로 변경해주었다.
1
2
3
4
5
6
7
8
9
10
11
12
@Entity
@Table(name="cms_blist")
public class Board {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
// 소문자
@Column(name="bno")
private long no;
// 소문자
@Column(name="ctno")
private int categoryNo;
그러면 정상적으로 화면이 출력된다!!