2023년 7월 기준으로 작성되었습니다.
스프링 완전 정복 로드맵을 DB 2편까지 마치고, JPA 로드맵으로 오니까 아무래도 예전 강의여서 그런지 호환되지 않은 내용이 많았다.
특히 기본편에서 JPA 시작하기 -> Hello JPA - 프로젝트 생성에서 스프링 부트 없이 Maven으로 프로젝트를 하시길래
여태까지 배웠던 것이 스프링 부트 + Gradle 조합이어서 처음에는 이렇게 프로젝트를 해보았다.
하지만 여러가지 문제에 봉착했고, 다음과 같은 QNA를 보고나서야 스프링 부트를 사용하는 것은 포기했다.
그래도 JDK 11, Gradle로 프로젝트를 진행하고 싶은 사람에게 발생할 수 있는 문제와 해결책을 모아보았다.
사용하는 IDE로 Gradle 프로젝트를 대충 생성한 다음
1. build.gradle에 의존성을 추가한다. (H2 데이터베이스는 1.4.200 기준)
implementation 'org.hibernate:hibernate-entitymanager:5.3.10.Final'
runtimeOnly 'com.h2database:h2:1.4.200'
02-08 변경점) hibernate 5.3.10 버전과 H2 데이터 베이스 1.4.200 사이에는 외래키가 매핑되어 있는 테이블은 삭제하지 못하는 문제점이 있다. 5.4.22 버전으로 변경한다.
implementation 'org.hibernate:hibernate-entitymanager:5.4.22.Final'
1-2. 그리고 JDK 11을 사용한다면, 다음 의존성도 추가한다. (자바 8에는 있고, 11에는 없는 라이브러리 추가)
implementation 'javax.xml.bind:jaxb-api:2.3.1'
07-19 변경점) 1-3. 이전 로드맵에서 배웠던 lombok을 사용하고 싶어서 다음 의존성도 추가했다.
// 스프링 부트는 없고, Gradle 5.X 이상 프로젝트에서 롬복을 사용하도록 추가 - 현재 1.18.28 버전
compileOnly 'org.projectlombok:lombok:1.18.28'
annotationProcessor 'org.projectlombok:lombok:1.18.28'
2. src/main/resources/META-INF/persistence.xml를 직접 만들고 다음 내용을 추가한다.
<?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:tcp://localhost/~/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.id.new_generator_mappings" value="true"/>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
3. 그 다음 강의를 따라가다가 엔티티가 될 Member 클래스를 만들고 나면, Gradle에서는 인식을 잘 못하는 문제가 발생한다.
이 때, persistence.xml에 class 태그를 넣어서 해당 엔티티의 경로를 넣어 주면 해결이 된다.
예를 들면 이렇게
<persistence-unit name="hello">
<class>hellojpa.Member</class> <!-- gradle에서 Entity를 인식하지 못하는 문제 해결!-->
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
나중에 스프링을 사용하면, 엔티티를 인식하지 못하는 문제는 사라지니, 지금은 이렇게 사용하자!
'Spring > 스프링 부트와 JPA 실무 완전 정복 로드맵' 카테고리의 다른 글
[스프링 데이터 JPA 편] - 테스트를 위한 JUnit5에서 의존성 주입은 꼭 @Autowired로 해야 하는 이유 (0) | 2023.03.01 |
---|