인프런 김영한 강사님의 수업을 들으면서 실습하던 중 아래와 같은 에러가 발생하였습니다.

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "INSERT INTO MEMBER(NAME) VALUE[*]()"; expected "DIRECT, SORTED, DEFAULT, VALUES, SET, (, WITH, SELECT, TABLE, VALUES"; SQL statement:

insert into member(name) value() [42001-200]



java.lang.IllegalStateException: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "INSERT INTO MEMBER(NAME) VALUE[*]()"; expected "DIRECT, SORTED, DEFAULT, VALUES, SET, (, WITH, SELECT, TABLE, VALUES"; SQL statement:
insert into member(name) value() [42001-200]



Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "INSERT INTO MEMBER(NAME) VALUE[*]()"; expected "DIRECT, SORTED, DEFAULT, VALUES, SET, (, WITH, SELECT, TABLE, VALUES"; SQL statement:
insert into member(name) value() [42001-200]



2022-07-05 17:38:53.021  INFO 96188 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
MemberServiceIntegrationTest > join() FAILED

위와 같은 에러가 발생하는 이유는 강사님은 Member.name 에 대해서만 실습을 진행하였는데

저는 PhoneNumber 라는 변수 하나를 추가해서 실습했기 때문이라고 추정됩니다.

 

그런데 DB를 모르니 뭐가 문젠지 통 알 수가 없네요..

천천히 하나씩 뜯어보도록 하겠습니다.

 

가장 먼저

1) Syntax error in SQL statement "INSERT INTO MEMBER(NAME) VALUE[*]()"

2) insert into member(name) value() [42001-200]

 

이 두 문장을 봤을때 INSERT 쿼리에서 문제가 발생했다는 것 같습니다.

그래서 코드를 뜯어 보겠습니다.

"insert into member(name) value()";

- 해석 : member 테이블에 name 컬럼에 value() 값을 넣어준다.

이 부분에서 에러가 발생하는것 같습니다.. 그렇다면 h2 database 쪽 문제로 보이는데

 

 

1. dependency 버전 문제인가?

 

아래 사진을 보면 인텔리제이의 h2 버전이 제가 실행중인 h2 버전과 다른걸 알 수 있습니다.

 

 

제가 사용중인 버전은 아래 사진처럼 1.4.200입니다.

 

아래 사진과 같이 버전을 직접 적어서 dependency를 추가해줍니다.

 

똑같은 오류가 발생중입니다..

 

2. 예외의 원인을 찾아보자

IllegalStateException

위와 같은 예외가 제일 먼저 발생하는데 그 이유는 무엇일까?

 - 위와 같은 오류가 발생한 이유는 이전에 value 값이 들어가지 않았기 때문에 없는 value 에 접근하려고하니 에러가 발생하는 것이였다.

 

3. 오타 해결...

String sql = "insert into member(name) values(?)";

 1) value 가 아니라 values로 값 목록을 찾아야한다.

 2) values ( ? ) 은 레코드를 다수 넣기위한 하나의 문법이다.

 - 둘 이상의 값을 포함하는 배열을 생성 후

 - 쿼리문에 물음표를 작성하면 해당 자리가 값 배열로 대체됩니다.

String sql = "insert into member(name) values(?)";
PreparedStatement pstmt = null;
Connection conn = null;
pstmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

 * Statement.RETURN_GENERATED_KEYS

 : DB상에 AUTO_INCREMENT로 인해 자동으로 생성되어진 key(=id) 를 가져오는 쿼리

 * Statement class

 : SQL 구문 실행하는 역할

 * PreparedStatement class

 : Statement를 상속받는 인터페이스로 동일한 SQL구문을 반복 실행한다면 향상된 기능으로 실행시키는 객체

 - 예시)

 // Statement class
String name = "홍길동";
String memo = "메모 테스트 입니다. 홍길동's 메모장";
String priority = "1";
String sql = String.format("insert into tblMemo values(memoSeq.nextval,'%s','%s',default,%s)", name, memo, priority); 


// PreparedStatement class
sql = "insert into tblMemo values(memoSeq.nextval,?,?,default,?)";
pstat = conn.prepareStatement(sql);

//매개변수 값 대입 + 매개변수 유효화 처리.
pstat.setString(1, name);
pstat.setString(2, memo);
pstat.setString(3, priority);

+ Recent posts