Spring Data JDBC 예제 따라하기와 에러해결 (feat. Spring 공식 사이트, HSQL)

yeon·2021년 4월 17일
1

Introducing Spring Data JDBC

위의 내용을 참고하여 Spring Data JDBC 학습을 위해 예제를 따라해보았다.

예제 코드만 따라치고 테스트 코드를 돌려보니 에러가 발생했고, 이를 해결한 과정을 정리해보았다.


1. entity 클래스, repository 인터페이스, configuration 클래스는 예제보고 그대로 하면 된다.
단, CustomerConfig 클래스 생성시 JdbcConfiguration은 deprecated 되어서 AbstractJdbcConfiguration를 extends하면 된다.


2. test 클래스

NullPointerException
예제를 보고 그대로 해보니 customerRepository.save(customer) 이부분에서 NullPointerException이 떴다. 찾아보니 customerRepository가 주입이 되지 않아서 이게 null이기 때문이라고 한다.

예제에서는 @RunWith(SpringRunner.class) 어노테이션을 사용하는데 이건 Junit4에 있는거라고 한다. 여기에 @SpringBootTest 어노테이션을 추가하는게 해결책이였다.

HSQL 의존성 추가
그 다음에 HSQL라이브러리를 추가해줘야할거 같았다.
mvnrepository에서 hsqldb 라고 검색해야한다.

testImplementation group: 'org.hsqldb', name: 'hsqldb', version: '2.5.1'

이걸 build.gradle에 추가해준다.

SQLSyntaxErrorException: unexpected token: AUTO_INCREMENT

이 다음엔 SQLSyntaxErrorException: unexpected token: AUTO_INCREMENT 에러가 발생했다.

검색해보니 HSQL에서는 AUTO_INCREMENT대신 IDENTITY를 쓴다고 한다.

HSQL은 MySQL이나 Oracle 등 다른 Database의 syntax를 지원하는 기능이 있다.
schema.sql에 다음을 추가해주면 HQL에서 MySQL의 syntax를 그대로 쓸수 있다고 한다.

SET DATABASE SQL SYNTAX MYS TRUE; (for mysql)

이걸 추가해주니 해결되었다.

정리해보니 별로 해준게 없지만 블로그를 찾아보면서 이것저것 시도하다 보니 나에게 적용되지 않는 해결책으로 인한 다른 에러들도 발생했다. 필요없다고 생각하는 것들을 지워보다보니 위의 적은 내용들만 추가해주면 예제코드를 잘 테스트할 수 있었다.

findByName() 테스트 failed
findByName()를 테스트하는 부분에서 CustomerRepository의 findByName메소드에 써준 쿼리문에 대한 에러가 뜬다.

쿼리문을 잘 바꾸면 실행될거 같은데 테스트가 통과하도록 바꾸는건 아직 SQL문법을 잘 모르겠어서 일단 패스했다.

HSQL 사용으로 마주한 에러들
entity 클래스 명을 테이블로 변환할때 소문자로 테이블명이 지정되는 걸 명확히 하기 위해서 @Table("customer")를 써줬는데 이거 때문에도 에러가 발생했다.

org.hsqldb.HsqlException: user lacks privilege or object not found 에러를 검색해보니

HSQL은 case-sensitive, 즉 대소문자를 구별하는 것이 디폴트이다.
스키마에서 테이블명과 컬럼명이 자동으로 대문자로 생성된다고 한다.
소문자로 지정하고 싶으면 쌍따옴표로 명시해줘야한다.

나의 경우에 적용해서 스키마 파일에 테이블 생성하는 부분을 다 쌍따옴표로 바꿔서 해봤는데 계속 SQLSyntax 에러가 났다.
schema.sql에서 MySQL문법을 HSQL로 변환하도록 해서 적용이 안되나 생각이 들어서 쌍따옴표를 다 지우고, entity 클래스에 달아준 @Table("customer")도 지우니 해결할 수 있었다.

참고 자료: https://www.javaer101.com/ko/article/2759553.html (NullPointerException 해결)

https://oddpoet.net/blog/2013/11/29/hsql-for-testing/ (HSQL AUTO_INCREMENT 에러)

https://stackoverflow.com/questions/38415734/hsql-database-user-lacks-privilege-or-object-not-found-error (HSQL 에러)

0개의 댓글