점프투스프링부트(스프링부트+JPA)

2장 2-03 요약 (ORM 개념, JPA 개념, H2 데이터베이스 설치와 환경설정, JPA 환경설정)

여행자0 2024. 12. 12. 19:13

데이터베이스 관리(삽입,삭제,수정,조회) 는 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 쿼리가 표출되도록 설정한 내용이다.