티스토리 뷰
[SpringBoot/GDSC] H2 데이터 베이스 설치 및 JPA(Java Persistence API) 활용과 예제
YouJungJang 2023. 10. 10. 14:42본 포스팅은 인프런 김영한 강사님의 스프링 부트 입문 강의 섹션 6 <스프링 DB 접근 기술>을 수강하고 배운 점을 정리했습니다.
1. H2 데이터 베이스 설치 (윈도우 11 기준)
H2 데이터 베이스는 개발이나 테스트 용도로 가볍고 편리한 DB, 웹 화면을 제공한다.
인메모리 관계형 데이터베이스로 별도의 설치가 필요 없이 프로젝트 의존성만으로 관리할 수 있다.
메모리에서 실행되기 때문에 애플리케이션 재시작할 때마다 초기화된다.
1) H2 데이터 베이스 버전 1.4.200을 설치한다.(최근에 나온 버전을 설치하면 일부 기능이 정상 작동하지 않는다고 한다)
-> 만약 이전에 설치하고 실행한 적이 있다면 다시 설치한 이후에 ~/test.mv.db 파일을 꼭 삭제해야 한다.
2) 다운로드 후 설치한다.
3) 'h2.bat' 파일을 실행해야 하는데 이 파일의 위치는 아래와 같다.
C:\Program Files (x86)\H2\bin
띄어쓰기만 잘못해도 오류를 뱉어내므로, cd 명령어를 사용해 하나하나 차근차근 타고 가는 걸 추천한다.
맨 처음 cmd 창을 켜면 C드라이브에 유저 디렉터리에 위치해 있는데 'cd..'명령어를 이용해 C 드라이브로 나와야 한다.
이후 cd 뒤에 위 경로를 작성하면 bin 디렉터리 안에 h2.bat 파일을 찾을 수 있다.
+ 리눅스와 다르게 디렉터리의 파일들을 조회하려면 'ls'가 아닌 'dir'을 입력해야 한다.
4. 윈도우 기준 'h2.bat'을 입력하면 데이터 베이스 서버가 실행된다.
+ 강의 자료에서 ~/test.mv.db 파일을 확인할 때 경로와 나의 컴퓨터 내의 경로가 달랐다.
윈도우 11 사용자의 경우 위 경로에서 찾을 수 없다면 나처럼 C:\Users\[사용자명] 디렉터리를 조회해 보자
완료!
중간에 JDBC에 관련된 내용은 생략했다.
20년 전에 쓰던 방식이고 이제는 다른 편리한 대체 방법을 쓴다고 하니 따로 실습을 진행하지 않았다.
2. JPA(Java Persistence API)
JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해 준다.
JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있어서 개발 생산성을 크게 높일 수 있다.
사용 설정 1. build.gradle 파일에 JPA, h2 데이터베이스 관련 라이브러리를 추가한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
사용 설정 2. 스프링 부트에 JPA 설정 추가한다.
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
- show-sql : JPA가 생성하는 SQL을 출력한다.
- ddl-auto : JPA는 테이블을 자동으로 생성하는 기능을 제공하는데 none를 사용하면 해당 기능을 끈다. create를 사용하면 엔티티 정보를 바탕으로 테이블도 직접 생성해 준다.
사용 설정 3. JPA 엔티티 매핑: Member 클래스에 @Entity 애노테이션을 적어서 매핑해 준다.
이후엔 JPA로 실행하고 싶은 코드에 적절한 애노테이션을 추가하면 된다.
아래는 JPA 회원 레포지토리 코드 중 이름으로 인스턴스를 찾아내는 findByName 코드의 일부이다.
public Optional<Member> findByName(String name) {
List<Member> result = em.createQuery("select m from Member m where
m.name = :name", Member.class)
.setParameter("name", name)
.getResultList();
return result.stream().findAny();
}
}
createQuery 매서드의 매개변수로 들어가는 sql문이 일반 sql쿼리와 다르게 select에서 '객체 자체(m)'를 셀렉해 오는 것을 볼 수 있다. 이것이 JPA의 특징이라고 할 수 있다.
JPA의 동작 원리는 아래와 같다.
정리하자면 스프링 데이터 JPA가 제공하는 기능은
1. 인터페이스를 통한 기본적인 CRUD
2. findByName() , findByEmail()처럼 메서드 이름 만으로 조회 기능 제공
3. 페이징 기능 자동 제공
이렇게 정리할 수 있다.