Spring Boot와 sqlite3 연동, JPA, Hibernate, SQLDialect

2021. 5. 4. 13:29Computer Science/Backend

Spring Boot와 sqlite3 연동하기


Code: https://github.com/C-YooJin/lite

(해당 게시물은 깃허브 코드를 참고하면서 보는 것을 권장합니다.)

 

1. Spring Boot 프로젝트를 생성한다.

나는 보통 빌드 툴로 maven을 사용하기 때문에 pom에 Spring web, Spring Data JPA, sqlite 디펜던시를 추가해주자.

<dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.21.0.1</version>
</dependency>

2. SQLDialect를 설정해준다.

JPA로 어플리케이션을 개발하게 되면 개발자가 직접 JDBC 레벨에서 SQL문을 작성하는게 아니고 JPA가 이를 대신해주게 되는데 그 때 필요한게 Dialect다. SQLDialect는 데이터베이스간의 SQL문법 차이를 보정해주기 위해 JPA가 제공하는 클래스다. 나는 Dialect 클래스를 상속받은 SQLDialect 클래스를 생성해서 해당 클래스를 properties 파일에 경로로 주었다. 

 

참고로 JPA와 Hibernate를 확실히 구분짓고 넘어가는게 좋을 것 같다. JPA란 그냥 어떤 개념이라고 보면 된다. 백엔드에서 디비를 다룰 때 어떤 방식으로 디비를 다루겠다는 명세정도다. JPA를 실제 라이브러리로 구현한 구현체가 Hibernate다. 따라서 SQLDialect는 Hibernate를 활용해서 설정한다고 보면 된다.

 

 

3. properties 파일을 설정해준다.

spring.jpa.database-platform=com.deepjin.lite.SQLDialect
spring.jpa.hibernate.ddl-auto=update

spring.datasource.url=jdbc:sqlite:sqlitesample.db
spring.datasource.driver-class-name=org.sqlite.JDBC

spring.datasource.username=admin
spring.datasource.password=admin

 

4. Run Application

프로그램을 실행시키고나면 db파일이 하나 생긴 걸 확인할 수 있다.

 

5. Entity class

JPA에서의 Entity 클래스란 개발자가 설정한 테이블에 대응하는 하나의 클래스다. 나는 Entity라는 테이블에 id, message, name이라는 컬럼을 만들었다.

 

참고로 Entity class에서 getter setter를 만들 때 단축키가 있다. 인텔리제이같은 경우는 cmd+n 이다. 해당 단축키를 누르고 'Getter and Setter'를 클릭하면 자동으로 생성된다.

 

6. (다시) Run Application

spring.jpa.hibernate.ddl-auto=update

properties 파일에 위 설정덕분에 프로그램을 다시 run 하고나면 자동으로 테이블이 설정 돼 있다. DB브라우저를 설치하고 확인해보겠다.

 

Entity Class에서 설정해준 id, name, message가 잘 들어가있는 걸 확인할 수 있다.

 

7. Data insert

실제로 데이터를 삽입하는 과정이다. resources 폴더 아래에 data.sql 파일을 생성하고 아래를 추가하자.

INSERT INTO ENTITY(name, message) values("Kelly", "This is Kelly");
INSERT INTO ENTITY(name, message) values("Maru", "I'm her dog");

그 다음 properties 파일에 다음을 추가해주자.

spring.datasource.initialization-mode=always

설정이 끝났으면 Run 해보자. 

data.sql 파일에서 INSERT한 데이터가 잘 들어간 모습을 확인할 수 있다.

 

 

[발생했던 에러 로그 정리]

에러 1: Unable to resolve name [com.springboot.sqlite.SQLDialect]

해결 방법: spring.jpa.database-platform=<본인의 SQL dialect 클래스가 있는 패키지>.해당클래스

다른 사람 코드를 참고하다보면 이런 일이 생긴다.

 

에러 2: unsatisfieddependencyexception error creating bean with name 'jdbc converter' ~~

해결 방법: pom.xml에서 

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

 

부분을 주석처리 해주니까 정상 작동 했다. 더 자세히 알아보니 spring-data-jdbc와 spring-jdbc는 역할이 다르다. 이 부분은 따로 포스팅하는게 좋을 것 같다. 참고자료는 아래에.

 

Ref 1. https://okky.kr/article/723141?note=1993239

Ref 2. stackoverflow.com/questions/51923060/spring-jdbc-vs-spring-data-jdbc-and-what-are-they-supporting

Ref 3. brunch.co.kr/@springboot/105