2장 2-03 요약 (ORM 개념, JPA 개념, H2 데이터베이스 설치와 환경설정, JPA 환경설정)
데이터베이스 관리(삽입,삭제,수정,조회) 는 SQL을 사용할 줄 알아야 한다.
SQL을 사용하지 않고 자바 문법으로 DB를 관리하는 방법은 없을까? 에서 비롯된 개념이 ORM 이다.
ORM (Object Relational Mapping)
:SQL을 사용하지 않고 자바문법으로 데이터베이스를 다룰 수 있게 하는 도구
ORM은 데이터베이스의 테이블을 자바 클래스로 만들어 관리할 수 있게 한다.
id | title | content |
1 | 질문이 있습니다. | ORM의 개념에 대해 알려주세요! |
question 이라는 테이블에 id, title, content 라는 컬럼(열)이 있다.
위와 같이 데이터를 저장하려면 쿼리문은 다음과 같이 작성한다.
insert into question (id, title, content)
values (1, '질문이 있습니다.', 'ORM에 대해 알려주세요!');
이러한 SQL을 자바 코드로 대신하면 다음과 같이 작성할 수 있다.
Question q = new Question();
q.setId(1);
q.setTitle("질문이 있습니다.");
q.setContent("");
this.questionRepository.save(q);
Question이라는 객체를 생성하고,
id, title, content 의 값을 setter를 통해 넣고,
quesetionRepository.save(q) 를 통해 저장한다.
* questionRepository 는 QuestionRepository의 객체이고,
QuestionRepository.java 파일은 interface 이다.
QuestionRepository 인터페이스는 JpaRepository를 extends 한다.
즉, quesetionRepository.save(q) 에서 save는
JpaRepository의 save 라는 메소드를 사용하여 저장하는 것이다!
ORM의 장점
- MySQL, 오라클 등의 DBMS의 종류에 관계없이 일관된 자바 코드를 사용할 수 있어 유지보수가 편리하다.
- 안정적인 SQL 쿼리문을 자동으로 생성해주므로, 개발자가 달라도 동일한 쿼리문을 작성할 수 있다.
- 그에 따라, 오류 발생률도 줄일 수 있다.
DBMS란
- Database Management System, 말 그대로 데이터베이스 관리 시스템
- DB는 데이터를 담은 통이고, DBMS는 이 통을 관리하는 "소프트웨어" 이다.
JPA란
- 스프링부트는 JPA(Java Persistence API)를 사용하여 데이터베이스를 관리한다.
- 스프링부트는 JPA를 ORM 기술의 표준으로 사용한다.
- JPA는 인터페이스 모음으로, 이 인터페이스를 구현한 실제 클래스가 필요하다.
- JPA를 구현한 실제 클래스에는 대표적으로 하이버네이트(Hibernate)가 있다.
정리하면, 하이버네이트는
- JPA의 인터페이스를 구현한 실제 클래스이자, 자바의 ORM 프레임워크이고,
- 스프링부트에서 데이터베이스를 관리하기 쉽게 도와준다.
인터페이스란
- 클래스가 구현해야 하는 메서드 목록을 정의한 틀
H2 데이터베이스 설치와 환경 설정하기
H2 데이터베이스란
- 보통 개발 환경에서 사용하는 자바 기반의 경량 DBMS
- 개발 시에는 H2 데이터베이스를 사용하여 빠르게 개발하고, 실제 운영 시스템에는 좀 더 규모 있는 DBMS (MySQL, 오라클, MS SQL 등)을 사용하는 것이 일반적임
1) build.gradle 파일에 dependency 추가
dependencies {
//H2 DB
runtimeOnly 'com.h2database:h2'
}
2) 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 데이터베이스를 웹 UI로 본다.
- spring.h2.console.path : H2 콘솔로 접속하기 위한 URL 경로
- spring.datasource.url : 데이터베이스에 접속하기 위한 경로
- spring.datasource.driverClassName : 데이터베이스에 접속할 때 사용하는 드라이버 클래스명
- spring.datasource.username : 데이터베이스의 사용자명 (사용자명으로 기본값인 sa로 설정했다.)
- spring.datasource.password : 데이터베이스의 비밀번호 (공란으로 두었다.)
3) spring.datasource.url 에 설정한 경로에 데이터베이스 파일 만들기
spring.datasource.url 값을 jdbc:h2:~/local 로 설정했으므로,
사용자의 홈 디렉터리(코드에서 ~에 해당하는 경로) 아래에 H2 데이터베이스 파일을 생성해야 한다.
데이터베이스 파일 명은 local.mv.db 로 하자.
이 파일을 생성하기 위해, 명령 프롬프트를 실행한다.
- 사용자의 홈 디렉터리 ( C:\User\사용자명 ) 에 copy con local.mv.db 입력 후 Ctrl+z 키 누른 뒤 Enter 입력
- 위 과정을 하면 해당 경로에 아무 내용이 없는 빈파일이 생성된다.
* properties 파일에 jdbc:h2:~/test 라고 설정했다면, test.mv.db 라는 파일을 생성해야 한다.
* 파일 사이즈는 반드시 0kb로 생성되어야 한다. 1kb로 생성되었다면 파일이 잘못 생성된 것이다.
4) localhost:8080/h2-console 로 접속해서 세팅 마무리하기
- spring.h2.console.path 의 값을 /h2-console 로 하였기 때문에 위 URL 로 접속한다.
- 위 경로로 접속하면 H2 데이터베이스를 웹 화면으로 볼 수 있다.
JDBC URL, User Name, Password 를 properties 파일에서 입력한 내용과 동일하게 작성 후 Connect
* JDBC : Java Database Connectivity의 줄임말, 자바 프로그램에서 데이터베이스와 상호작용을 하는 자바 API 기술
* JDBC는 자바 프로그램과 DB를 연결하여 데이터베이스 작업을 수행할 수 있다.
Connect 시 뜨는 화면이다.
* 실습을 이미 끝낸 상태라 좌측에 테이블이 생성되어 있다.
* 좌측 영역의 기본값으로 INFORMATION_SCHEMA, Users, H2의 버전이 표출된다.
JPA 환경 설정하기
- 자바 프로그램에서 H2 데이터베이스를 사용하기 위해서 JPA를 사용할 것이다.
1) build.gradle 파일에 dependency 추가
dependencies {
//jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
* implementation
: 라이브러리 설치를 위해 가장 일반적으로 사용하는 설정이다.
implementation 으로 설정 시, 해당 라이브러리가 변경되더라도, 이 라이브러리와 연관된 모든 모듈을 컴파일 하지 않고
변경된 내용과 관련이 있는 모듈만 컴파일 하므로 프로젝트를 rebuild 하는 속도가 빠르다.
2) application.properties 파일에 JPA 세팅 추가
# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update
# JPA쿼리표출
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
- spring.jpa.properties.hibernate.dialect : 스프링부트와 하이버네이트를 함께 사용할 때 필요한 설정 항목이다.
표준 SQL이 아닌 하이버네이트만의 SQL을 사용할 때 필요한 항목으로,
하이버네이트의 org.hibernate.dialect.H2Dialect 클래스를 설정했다.
(하이버네이트는 JPA 인터페이스를 구현한 클래스이다. 즉, 하이버네이트를 사용한다 = JPA 사용한다 라고 보면 됨)
- spring.jpa.hibernate.ddl-auto : 엔티티를 기준으로 데이터의 테이블을 생성하는 규칙을 설정한다.
spring.jpa.hibernate.ddl-auto 의 규칙을 더 알아보자
- none : 엔티티가 변경되더라도 데이터베이스를 변경하지 않는다.
- update : 엔티티의 변경된 부분만 데이터베이스에 적용한다.
- validate : 엔티티와 테이블 간에 차이점이 있는지 검사만 한다.
- create : 스프링부트 서버를 시작할 때, 테이블을 모두 삭제한 후 다시 생성한다.
- create-drop : create와 동일하나, 스프링부트 서버를 종료할 때에도 테이블을 모두 삭제한다.
* 개발 환경에서는 보통 update 사용, 운영 환경에서는 none 혹은 validate 를 주로 사용.
# JPA 쿼리 표출 밑에 작성한 두 줄은
자바의 console 창에 JPA 쿼리가 표출되도록 설정한 내용이다.