[JPA] Entity 생성 및 구조 확인

배지원·2022년 11월 2일
0

SpringBoot

목록 보기
6/11

H2 데이터베이스 설치

1. DB 설치

  • h2는 최고의 실습용 DB이다.
  • 프로그램 크기가 가볍다
  • 웹용 쿼리툴 제공한다
  • MYSQL, Oracle 데이터베이스 시뮬레이션 기능

H2 설치 경로 : http://www.h2database.com/

설치 후에는 h2파일의 bin폴더안에 h2.bat 파일을 실행시킨다.

h2.bat 파일을 실행하면 자동으로 h2 데이터베이스 페이지가 열린다.

2. 라이브러리 추가

JPA 라이브러리 추가

<dependency> 
 	<groupId>org.hibernate</groupId> 
 	<artifactId>hibernate-entitymanager</artifactId> 
 	<version>5.3.10.Final</version> 
 </dependency>

H2 데이터베이스 추가

<dependency> 
 	<groupId>com.h2database</groupId> 
 	<artifactId>h2</artifactId> 
 	<version>1.4.199</version> 
 </dependency>
  • H2사이트에서 다운받은 버전과 라이브러리 추가하는 버전이 같아야함
    만약 다르면 오류가 발생할 수도 있음

추가 라이브러리 추가(JAVA11일 경우만)

  • 만약 JAVA11일 경우 라이브러리를 한개 더 추가해 줘야 한다.
<dependency>
   <groupId>javax.xml.bind</groupId>
   <artifactId>jaxb-api</artifactId>
   <version>2.3.0</version>
</dependency>

3. JPA 설정하기

  • JPA 파일을 하나 새로 만들어서 설정한다.
  • 위치 : src/main/java/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.hbm2ddl.auto" value="create" />-->
 </properties>
 </persistence-unit>
</persistence> 
  • javax로 시작하는 것은 다른 jpa에서도 사용할 수 있는것
  • hibernate로 시작하는 것은 현재 hibernate에서만 사용할 수 있는 것
  • 필수속성에는 h2.Driver와 연동하겠다는 설정과 h2데이터베이스의 유저, 이름, 비밀번호 설정등 h2 데이터베이스와 연동하기 위한 설정들이 들어간다.

JPA는 특정 데이터베이스에 종속하지 않는다

  • 각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다르다.
    MySQL : VARCHAR 일때 Oracle은 VARCHAR2를 사용한다.
    이처럼 데이터베이스들은 서로 다른 문법을 사용하기 때문에 JPA는 방언을 통해 서로 다른 문법들을 처리한다.

    방언 : SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능


                               <= MySQLDBDialect(Mysql방언)
    JPA => Dialect(방언) <= OracleBDialect(Oracle방언)
                               <= H2DBDialect(H2방언)
  • 옵션설정에서는
    • property name="hibernate.show_sql" value="true"jpa
      => 실행할때 실행된 쿼리문이 출력됨
    • property name="hibernate.format_sql" value="true"
      => 쿼리문이 출력될때 줄간격을 맞춰줌
    • property name="hibernate.use_sql_comments" value="true"
      => 쿼리가 어디서 나왔는지 알려줌 (insert hellojpa.Member)
            


4. JPA 실습 및 Entity 구조

객체와 테이블을 생성하고 매핑하기

  • @Entity : 해당 클래스가 엔티티임을 명시하기 위한 어노테이션으로 클래스 자체는 테이블과 일대일로 매칭되고 해당 클래스의 인스턴스는 매핑되는 테이블에서 하나의 레코드를 의미한다.

  • @ID : 엔티티 클래스의 필드는 테이블의 칼럼과 매핑된다. 해당 어노테이션이 선언된 필드는 테이블의 기본값 역할로 사용된다. 또한 모든 Entity는 꼭 @ID를 필요로 한다.

  • @Table(name="tablename") : Entity클래스는 테이블과 매핑되므로 특별한 경우가 아니면 @Table이 필요하지가 않다. 해당 어노테이션은 클래스의 이름과 테이블의 이름을 다르게 지정하는 경우 사용한다.

  • @Column : DB에 저장되는 테이블 칼럼의 설정을 담당함(칼럼명을 정하거나 칼럼을 설정값들을 정함 유니크값인지, not null인지 등등)

    • @Column(name="cloumnname") : 엔티티 클래스의 필드는 자동으로 테이블 칼럼으로 매핑된다.

    • @Column(nullable = false) : not null이 찍힘

    • @Column(length=10) : 데이터베이스에 저장하는 데이터의 최대 길이

    • unique : 해당 컬럼 유일성 보장

  • @Transient : Entity 클래스에는 선언돼 있는 필드지만 데이터베이스에서는 필요없는 경우 이 이노테이션을 사용해 데이터베이스에서 이용하지 않게 할 수 있다.

@Entity
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer price;

    @Column(nullable = false, name = "stock")
    private Integer stock;

    @Transient
    private String test;


    private LocalDateTime createdAt;
    private LocalDateTime updateAt;
}


JPAMain 클래스 생성 및 동작 확인

@Entity
@Table(name = "MEMBER")
public class Member {
    @Id
    private Long id;
    @Column(name="username")
    private String name;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class JpaMain {
    static EntityManagerFactory emf =  Persistence.createEntityManagerFactory("hello");    // jpa 설정파일에서 지정한 설정이름 작성

    static EntityManager em = emf.createEntityManager();
	// Factory에서 유저의 요청이 있으면 EntityManager를 통해 작업을 한다.

    static EntityTransaction tx = em.getTransaction();     // jpa는 꼭 트랜잭션을 통해 실행됨

    public static void main(String[] args) {
        JpaMain jp = new JpaMain();
        tx.begin();             // 트랜잭션 실행

       // 실제 동작하는 코드 작성하는 공간

        try {
            jp.add();           // insert
            jp.update();        // update

            tx.commit();        // DB에 데이터 전송
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.clear();
            emf.close();
        }
    }

    // insert
    public void add(){
        Member member = new Member();               // DTO 호출
        member.setId(4L);                           // DTO에 값 넣음
        member.setName("HelloA");
        em.persist(member); // jpa에 데이터를 저장함
    }

    // update
    public void update(){
        Member findMember = em.find(Member.class,1L);    // 1의 값을 가져옴
        findMember.setName("test");
    }
}


정리

  • H2 데이터베이스 실행하는법을 알 수 있다.
  • JPA사용을 위해 기본 설정(persistence.xml)을 해야 동작한다
  • JPA는 EntityManagerFactory를 통해 동작한다.
  • EntityManager는 Factory에서 유저의 요청이 있을때마다 EntityManager를 통해 작업을 한다.
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 이루어져야 한다.
  • 트랜잭션이 begin()으로 시작


출처 : 자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
Web Developer

0개의 댓글