코딩은 마라톤

[자바 ORM 표준 JPA 프로그래밍] 2장. Java + Gradle 설정 본문

Backend/JPA

[자바 ORM 표준 JPA 프로그래밍] 2장. Java + Gradle 설정

anxi 2024. 1. 28. 14:13

책에 나온 설정 방법

- 이클립스

- Java 1.6

- Maven

- H2 1.4.187

 

변경 사항

- IntelliJ 인텔리제이

- Java 11

- Gradle

- H2 2.1.214

 

 

build.gradle

dependencies {
    implementation 'org.hibernate:hibernate-entitymanager:5.6.15.Final'
    implementation 'org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final'
    runtimeOnly 'com.h2database:h2:2.1.214'

    /* java 11일 경우 설치 */
    implementation 'javax.xml.bind:jaxb-api:2.3.0'

    compileOnly 'org.projectlombok:lombok:1.18.28'
    annotationProcessor 'org.projectlombok:lombok:1.18.28'
}

 

- 기존 (Maven)

  • hibernate-entitymanager
  • H2 database

- 추가 (Gradle)

  • javax.persistence:hibernate-jpa
  • javax.xml.bind:jaxb-api (Java 11 일 경우 필히 설치해준다.)
  • lombok (getter, setter를 쓰기 위해 추가하였다.)

- 필수

  • H2 database에 버전을 꼭 명시해줘야한다. (그렇지 않을 경우, persistence.xml에 jdbc.driver가 찾지 못하는 상황 발생)

 

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="JAVA-ORM-JPA">
    <class>start.Member</class>
    <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"/>
    </properties>
  </persistence-unit>
</persistence>

 

- 필자는 스프링 프레임워크를 사용하지 않았기 때문에 하위 부분을 추가해야 환경에서 엔티티 클래스를 찾을 수 있다.

    <class>본인의 엔티티 Path</class>

 

Member

package start;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "MEMBER")
@Getter
@Setter
public class Member {

  @Id
  @Column(name = "ID")
  private String id;

  @Column(name = "NAME")
  private String username;

  private Integer age;
}

 

JpaMain

package start;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {

  public static void main(String[] args) {

    /* 엔티티 매니저 팩토리 - 생성 */
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("JAVA-ORM-JPA");

    /* 엔티티 매니저 - 생성 */
    EntityManager em = emf.createEntityManager();

    /* 트랜잭션 - 획득 */
    EntityTransaction tx = em.getTransaction(); // 트랜잭션 API

    try {
      tx.begin(); /* 트랜잭션 - 시작 */
      logic(em); /* 비즈니스 로직 - 실행 */
      tx.commit(); /* 트랜잭션 - 커밋 */

    } catch (Exception e) {
      tx.rollback(); /* 트랜잭션 - 롤백 */
    } finally {
      em.close(); /* 엔티티 매니저 - 종료 */
    }
    emf.close(); /* 엔티티 매니저 팩토리 - 종료 */
  }

  /* 비즈니스 로직 */
  private static void logic(EntityManager em) {
    String id = "id1";
    Member member = new Member();
    member.setId(id);
    member.setUsername("성민");
    member.setAge(2);

    // 등록
    em.persist(member);

    // 수정
    member.setAge(24);

    // 한 건 조회
    Member findMember = em.find(Member.class, id);
    System.out.println("findMember= " + findMember.getUsername() + ", age= " + findMember.getAge());

    // 목록 조회
    List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
    System.out.println("members.size = " + members.size());

    // 삭제
    em.remove(member);
  }
}