이 게시글은 인프런 김영한님의'자바 ORM 표준 JPA 프로그래밍 - 기본편'을 보며 공부하고 작성한 게시글임을 밝힙니다.
강의 내용 외에도 공부한 내용과 본인생각이 함께 있습니다
💻 하이버네이트 + Maven + H2 DB 사용 (IntelliJ 사용)
java 8이상을 권장한다.
아래 스펙으로 생성한다.
Maven을 사용하는 프로젝트를 잘 생성했다면 라이브러리를 넣는게 중요하다!
(초반에는 따로 넣은게 없기때문에 기본만 잡혀있을것이다)
pom.xml 파일의 dependencies에 어떤 라이브러리를 쓸거라고 넣으면 된다.
https://hibernate.org/orm/releases/
위 사이트에서 사용할 수 있는 버전을 볼 수 있다.
결국 나중에는 SpringBoot와 같이 쓸 것이다.
따라서 여기서 사용 가능한 버전을 고려해야한다.
프레임워크를 사용할 때 버전 선택시 팁이다.
나같은 경우에는 Spring Boot 2.7.9를 사용중이다.
아래 사이트를 보자
https://spring.io/projects/spring-boot#learn
2.7.x 에서 사용되고 있는 버전인 2.7.10에 관한 Reference Doc을 살펴보자.
org.hibernate
와 일치하는 내용을 쭉쭉 찾다보면 지원버전을 볼 수 있다.
궁합을 맞춰서 Maven 프로젝트의 pom.xml 파일의 dependencies에 추가할 때에는 5.6.15로 사용하면 좋다.
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.15.Final</version>
</dependency>
</dependencies>
그리고 데이터베이스를 접근해야하니까, 접근할 수 있는 데이터베이스 드라이버가 있어야한다.
우리는 H2데이터베이스를 쓰기로했으니 이를 dependencies에 추가하자.
❗️주의할 점! H2데이터베이스 다운받은거랑 같은 버전을 사용해야한다!
<pom.xml 전체코드>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jpa-basic</groupId>
<artifactId>ex1-hello-jpa</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
</dependencies>
</project>
artifactId에는 hibernate-entitymanager
을 써야한다.
그렇게하면, 필요한 의존성 연관된 라이브러리들을 쭉 당겨온다.
(하이버네티스 사용시 필요한것을 다 당겨쓸 수 있다)
위와 같이 JPA 하이버네이트를 추가해주고 다시 로드하면 ?!
다양한 라이브러리들이 자동으로 추가된 것을 볼 수 있다.
중간에 jvax.persistence-api:2.2 가 추가된것을 볼 수있다. 이것은 뭘까?
설명하자면 JPA는 인터페이스인데, 인터페이스의 구현체로 지금 하이버네이트를 선택한 것이다.
즉, 하이버네이트가 JPA인터페이스를 갖고있는것이다.
실제로 들어가보면 사용할 JPA 인터페이스들이 다 모아져있다.
H2 데이터베이스
- 가볍다
- 웹용 쿼리툴을 제공
- MySQL, Oracle 데이터베이스 시뮬레이션 기능
우리가 프로그래밍을 배울 때 처음에 'Hello World'를 띄우는것처럼 JPA로 바로 무엇인가 할 수 있는건 아니다.
JPA를 설정한다는 것은 JPA를 띄우기위한 몇가지 세팅 파일을 넣어주는것이다.
그 중 첫번째가 JPA 설정파일이다.
'persistence.xml' 파일을 만들어서 프로젝트에 넣어야한다.
위치 : /META-INF/persistence.xml
❗️표준 위치가 정해져있기때문에 위치가 매우 중요하다!
Maven 구조에서는 자바파일들은 'java'에 넣고, 나머지 파일들은 resources에 넣으면 된다.
따라서 resources 아래에 META-INF 디렉토리를 만들자.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
persistence version : JPA 버전
persistence-unit name : 이름을 뭘로 할건가? (보통 데이터베이스 이름 많이함)
<!-- 필수 속성 --> 이하 내용 : 어쨌든 JPA가 데이터베이스를 사용하기때문에 데이터베이스 접근 정보를 넣어줘야한다.
-> javax.persistence.jdbc.driver : 사용하는 드라이버(여기서는 H2 DB 사용)
-> javax.persistence.jdbc.url : 접근 url -> h2연결할때 쓰는 url과 똑같이 맞춰줘야한다. (user, password 속성도 동일)
-> hibernate.dialect : 아주 중요!! 데이터베이스 방언 표시 ex) H2Dialect : 나 H2 방언 써~ -> jpa는 '니가 이거쓰구나 그럼 내가 알아서 번역해서 사용할게'해서 인식함
필수속성에 보면, 어떤건 javax로 시작하고, 어떤건 hibernate로 시작한다.
어떤 차이가 있을까?
javax: 하이버네이트 라이브러리 말고, 다른 JPA 구현 라이브러리를 사용해도 가능(이게 그대로 적용됨)
-> 표준을 지키는 것
hibernate : 하이버네이트에서만 가능! 다른 라이브러리도 바꾸면 이것도 다 바꿔야함
-> 하이버네이트 전용 옵션
src-main-java 아래에 main()이 있는 파일을 만들어서 환경 테스트 겸 돌려봤는데, 에러가 났다.
java: error: release version 5 not supported
Module ex1-hello-jpa SDK 11 does not support source version 1.5.
아래 이 코드에서 build ~ /build 사이의 코드를 추가해줬다.
참고 = https://www.inflearn.com/questions/19302/error-java-error-release-version-5-not-supported
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jpa-basic</groupId>
<artifactId>ex1-hello-jpa</artifactId>
<version>1.0.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.15.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
</dependencies>
</project>
그리고 다시 실행해보니 'exit code 0'이 뜨며 실행은 잘 됐으나, 아래 처럼 빨간색 표시가뜬다..