6 min to read
[스프링부트 시리즈6]JPA로 DB 사용하기
데이터베이스 사용하는 방법.
JPA로 DB 사용하기
SBB는 방문자가 질문이나 답변을 남길 수 있는 게시판 서비스입니다. 방문자가 글을 작성하면 데이터가 생성되는데 이런 데이터를 작성하려면 저장 및 조회 등의 기능을 구현해야 합니다.
대부분의 웹 서비스들은 이를 관리하기 위해 DB를 사용하는데 DB 관리는 SQL이라는 언어를 통해서 이루어지지만 DB는 자바를 이해하지 못합니다.
따라서 ORM(Object Relation Mapping)이라는 툴을 사용해 자바 문법으로 직접 DB를 다룰 수 있습니다.
ORM, JPA 이해하기
- ORM이란 DB의 테이블을 자바 클래스로 만들어 관리할 수 있습니다.
- SQL 쿼리문과 ORM 코드를 보면, Question이라는 테이블에 id,subject,contect라는 열이 있다고 가정합니다.
-
id subject content 1 안녕하세요 가입인사드립니다. 2 질문있습니다 ORM이 뭔가요? … … … - SQL 쿼리를 사용해 question 테이블에 데이터를 저장하려면 다음과 같습니다.
insert into question(id, subject, content) values (1, '안녕하세요', '가입인사드립니다'); insert into question(id, subject, content) values (2, '질문있습니다', 'ORM이 뭔가요?');
ORM 코드를 사용해 위의 SQL 쿼리를 대체할 수 있습니다.
Question q1 = new Question(); q1.setId(1); q1.setSubject("안녕하세요"); q1.setContent("가입인사드립니다"); this.questionRepository.save(q1); Question q2 = new Question(); q2.setId(2); q2.setSubject("질문있습니다"); q2.setContent("ORM이 뭔가요?"); this.questionRepository.save(q2);
- 데이터를 관리하는데 쓰는 ORM의 자바클래스를 엔티티(Entity) 라고 하며 데이터베이스의 테이블과 매핑되는 자바 클래스입니다.
- ORM을 사용하면 MySQL,오라클 DB, MS SQL 등 DBMS의 종류에 관계없이 일관된 자바코드를 사용해 유지보수가 쉬워지며, 코드 내부에서 안정적인 SQL 쿼리문을 자동작성하므로 통일된 쿼리문을 작성할 수 있습니다.
JPA는 뭔가요?
스프링부트는 JPA(java Persistance API)를 사용해 ORM 표준으로 사용합니다. JPA는 인터페이스의 모음으로서 이 인터페이스를 구현할 실제 클래스가 필요합니다. JPA를 구현한 실제클래스는 대표적으로 하이버네이트(Hibernate)가 있으며, 하이버네이트는 JPA의 인터페이스를 구현한 실제 클래스이자 자바의 ORM 프레임워크로서 스프링부트에서 DB관리를 쉽게 하도록 도와줍니다.
H2 데이터베이스 설치하기
JPA를 사용하기 위해선 DB를 먼저 설치해야 하는데 여기에서는 간편한 H2 데이터베이스를 사용합니다.
- H2 데이터베이스는 자바기반의 경량 DBMS입니다.
- 실무 개발에서는 더 규모있고 굵직한 MySQL 등을 사용합니다.
build.gradle.kts
파일에 다음과 같이 입력해 H2 데이터베이스를 설치합니다.dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' developmentOnly 'org.springframework.boot:spring-boot-devtools' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' } (... 생략 ...)
위의 코드스니펫은 이클립스 기준이기에 인텔리제이에서 쓰려면 아래와 같이 쓰면 된다.
우측 패널의 그레이들 아이콘 선택 후 Reload All Gradle Projects
를 클릭해 필요한 라이브러리를 설치하자.
- 설치한 H2 DB를 사용하려면
src/main/resource
디렉터리의application.properies
파일에 새 설정을 추가해야 합니다. 아래와 같은application.properties
파일을 작성합니다.# DATABASE spring.h2.console.enabled=true spring.h2.console.path=h2-console spring.datasource.url=jdbc:h2:~/local spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=
작성된 항목은 다음과 같습니다:
spring.h2.console.enabled
: H2 콘솔 접속 여부입니다. True로 설정합니다. H2 콘솔을 H2 DB를 웹 UI로 보여줍니다.spring.h2.console.path
: H2 콘솔로 접속하기 위한 URL 경로입니다.spring.h2.datasource.url
: 데이터베이스에 접속하기 위한 경로입니다.spring.datasource.driverClassName
: 데이터베이스에 접속할 때 사용하는 드라이버 클래스명입니다.spring.datasource.username
: 데이터베이스의 사용자명 입니다.(기본값 sa로 설정)spring.datasource.password
: 데이터베이스의 비밀번호 입니다. (로컬 개발용도이므로 패스워드는 없습니다.)
spring.datasource.url
에 설정한 경로에 해당하는 데이터베이스 파일을 만들어야 합니다.spring.datasource.url
을jdbc:h2~/local
로 설정했으므로 사용자의 홈 디렉터리 아래에 H2 데이터베이스 파일로서local.mv.db
라는 파일을 생성해야 합니다. 이 파일을 생성하려면 CMD를 사용합니다. 사용자의 홈 디렉터리(C:\Users\사용자명)
에copy con local.mv.db
명령을 입력 후ctrl + Z
->Enter
를 누르면 생성됩니다. 이때 파일은 빈 파일입니다.- 홈 디렉터리에 새로 만든
local.mv.db
파일을 확인합니다.예를 들어
jdbc:h2:~/test
라고 설정을 했다면test.mv.db
라는 파일을 생성하고local.mv.db
파일을 새로 만들 때 파일명 뒤에.txt
확장자가 붙지 않도록 하십시오. - 이제 H2 콘솔을 사용해 데이터베이스에 접속할 수 있습니다. 로컬 서버를 재시작하고 브라우저에서 URL 주소로 H2 콘솔에 접속하십시오.
http://localhost:8080/h2-console
- 다음과 같은 H2 콘솔 화면이 나타납니다. 언어 설정에서 한국어를 선택하십시오.
- 콘솔화면에서 JDBC URL 경로를
application.properties
파일에 설정한 데이터베이스 연결주소인jdbc:h2:~/local
로 변경하고 연결 버튼을 누르십시오.
JDBC는 Java Database Connectivity의 약자입니다. 자바 프로그램에서 DB와 상호작용 용도의 자바 API입니다.
- 다음과 같이 접속된 화면이 나옵니다.
JPA 환경설정하기
H2 데이터베이스를 사용할 준비가 완료되었고, 자바 프로그램이 H2 데이터베이스를 사용할 수 있도록 해야합니다. 자바 프로그램에서 DB에 데이터를 저장하거나 조회하려면 JPA를 사용해야 합니다. 하지만 JPA를 사용하기 위한 밑작업이 필요합니다.
- 다음처럼
build.gradle.kts
파일을 수정합니다.
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.projectlombok:lombok:1.18.22") // 롬복 의존성 추가
annotationProcessor("org.projectlombok:lombok:1.18.22")
testImplementation("org.springframework.boot:spring-boot-starter-test")
developmentOnly("org.springframework.boot:spring-boot-devtools")
runtimeOnly ("com.h2database:h2")
implementation ("org.springframework.boot:spring-boot-starter-data-jpa")
}
전과 같이 우측 그레이들 패널을 열어 Reload All Gradle Project
를 클릭해 변경사항을 적용하면 JPA 라이브러리가 설치됩니다.
Implementation이란?
build.gradle.kts
에서 작성한implementation
은 필요한 라이브러리 설치를 위한 설정으로서, 해당 라이브러리가 변경되어도 이 라이브러리와 관련된 모든 모듈을 컴파일하는 대신 변경된 부분 모듈만 컴파일하므로 프로젝트 리빌드 속도가 빠릅니다
- JPA 설정을 위해 이번에는
application.properties
파일을 다음과 같이 수정합니다.
# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
추가한 설정 항목은:
spring.jpa.properties.hibernate.dialect
: 스프링부트와 하이버네이트를 함께 사용하기 위해 필요한 설정항목이다.SQL이 아닌 하이버네이트만의 SQL을 사용할 때 필요한 항목으로 하이버네이트의org.hibernate.dialect.H2Dialect
클래스를 설정했다.spring.jpa.hibernate.ddl-auto
: 엔티티를 기준으로 데이터테이블을 생성하는 규칙을 설정한다.
spring.jpa.hibernate.ddl-auto
의 규칙을 더 알아보자.
우리는 spring.jpa.hibernate.ddl-auto
를 update
로 설정했다. 또 어떤 설정값이 있는지 알아보자.
none
: 엔티티가 변경되더라도 데이터베이스를 변경하지 않습니다.update
: 엔티티의 변경된 부분만 데이터베이스에 적용합니다.validate
: 엔티티와 테이블 간에 차이점이 있는지 검사만 합니다.create
: 스프링 부트 서버를 시작할 때 테이블을 모두 삭제한 후 다시 생성합니다.create-drop
:create
와 동일하지만 스프링 부트 서버를 종료할 때에도 테이블을 모두 삭제합니다. 개발 환경에서는 보통update
모드를 사용하고, 운영 환경에서는none
또는validate
를 주로 사용합니다.