열심히 끝까지

디바이스 융합 자바(Java) day97 - JPA(Java Persistence API) 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day97 - JPA(Java Persistence API)

노유림 2022. 11. 1. 14:09

[ JPA(Java Persistence API) ]

DAO가 변환되는 과정
1. JDBCUtil
     - connection 확보하고 close하는 것 다 진행
2. Mybatis 

결합도가 낮고 응집도가 높아야 유지보수 용이

자바 객체 <-> 테이블 
   : 자동 매핑
   : 자바 객체의 정보를 멤버변수의 형태로 저장
        - 정보를 Row 형태로 저장
     >> Row 정보를 멤버변수로 자동 매핑하는 것

ORM(Object Relation Mapping)들의 집합, 구현체
   : 객체 관계 매핑하는 실구현체
   : sql문을 자동 생성
       >> sql 만들 필요 없음
   : Mybatis는 DBMS 변경 시 XML을 따로 만들어야하는데,
    JPA는 DBMS에 맞게 SQL문을 자동 생성

자바객체 VO(DTO)를 엔티티, 영속성객체라고 부름

 

JPA Entity 구현

>> JPA 구현체 pom.xml 설정

<!-- JPA -->
<!-- JPA 구현체, JDBC -->
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-entitymanager</artifactId>
	<version>5.1.0.Final</version>
</dependency>

 

2.0에서 2.2로 바뀔 때 큰 변화가 있었다고 함 
버전 2.2것이 옳음
>> 2.2 사용할 수 있도록 해야하겠다!!

        >> JPA 파일 생성

            >> JPA 파일을 생성하기 위해서는 JPA 등록이 필수

                   >> 2.1을 사용해볼 예정

                          만약 APPLY가 활성화되지 않는다면 Disable Library Configuration으로 교체할 것

@Entity
@Table(name="BOARD") // 엔티티 클래스명과 테이블명이 다르다면, 해당 @Table 설정해야함!
public class Board { // 엔티티 클래스 명 == 테이블명

	
	private static final long serialVersionUID = 1L;

	public Board() {
		super();
	}
   
}

 

JPA 설정파일 == persistence.xml
      dialect 설정
      SQL 표준 문법 -> DBMS 사투리(방언)

      dialect DBMS를 사투리(방언)

 

>> 파일 위치

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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_1.xsd">
	<persistence-unit name="test2">
		<class>com.ryo.app.Board</class>
		
		<properties>
		<!-- 필수 항목 -->
			<property name="javax.persistence,jdbc.driver" value=""/>
			<property name="javax.persistence,jdbc.url" value=""/>
			<property name="javax.persistence,jdbc.user" value=""/>
			<property name="javax.persistence,jdbc.password" value=""/>
			<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
			<!-- 이후는 선택 옵션 -->
		</properties>
	</persistence-unit>
</persistence>

 

만약 hibernate.dialect의 값이 mysql을 사용 시 변경되어야 함
>> org.hibernate.dialect.MySQL5Dialect
오라클이면 sequence 속성(자동 증가 함수) 있어야 함

 

Board.java---------------

package com.ryo.app;

import java.io.Serializable;
import javax.persistence.*;

/**
 * Entity implementation class for Entity: Board
 *
 */
@Entity
@SequenceGenerator(
		name="BID_SEQ",
		sequenceName="BOARD_SEQ",
		initialValue=3,
		allocationSize=50
		)
@Table(name="BOARD") // 엔티티 클래스명과 테이블명이 다르다면, 해당 @Table 설정해야함!
public class Board { // 엔티티 클래스 명 == 테이블명

	@Id // pk를 알려주어야만함!! 필수 @이다!!!!!
	@GeneratedValue(
			strategy=GenerationType.SEQUENCE,
			generator="BID_SEQ"
			) // pk 자동 설정 
	private int bid;
	private String writer;
	private String title;
	private String content;
	public int getBid() {
		return bid;
	}
	public void setBid(int bid) {
		this.bid = bid;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	@Override
	public String toString() {
		return "Board [bid=" + bid + ", writer=" + writer + ", title=" + title + ", content=" + content + "]";
	}
	
}

JPAClient.java----------

package com.ryo.app;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JPAClient {
	public static void main(String[] args) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("test2"); // 영속성유닛명
		EntityManager em  = emf.createEntityManager();
		EntityTransaction et = em.getTransaction();

		try {
			et.begin();

			Board board = new Board();
			board.setTitle("타이틀");
			board.setWriter("티모");
			board.setContent("글 내용");
			em.persist(board); // INSERT
			
			et.commit();
		}catch(Exception e) {
			et.rollback();
		}
		// 이 곳이 et.commit이 들어가기도 함
		em.close();
		emf.close();
	}
}