

- 객체는 객체대로, RDB는 RDB대로 설계 후
- 그 사이의 불일치는 ORM이 SQL을 자동 생성하여 해결해 준다는 뜻
- JPA는 ORM을 구현한 기술 중 하나 : 객체를 통해 데이터베이스를 조작할 수 있는 API를 제공하는 것
① 개발자는 비즈니스 로직을 구성하는데만 집중할 수 있음
② 코드의 가독성을 높임
Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어 각종 객체에 대한 코드를 별도로 작성하여 가독성 높임
③ 객체지향적인 코드 작성이 가능하여 생산성이 증가
매핑하는 정보가 Class로 명시하므로 ERD를 보는 의존도를 낮출 수 잇음
④ 유지보수 및 리팩토링에 유리
기존방식에서 MySql 데이터베이스를 사용하다가 PostgreSQL (대용량 데이터) 로 변환한다고 가정해보면, 새로운 쿼리를 짜야하는 경우가 발생. 이런 경우에 ORM기술을 사용하면 쿼리를 수정할 필요가 없음
① 크고 복잡한 프로젝트의 설계가 잘못되면 속도 저하 및 일관성을 무너뜨리는 문제점 발생
② 결국엔 SQL문을 써야할 수도 있음
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문
③ 학습비용이 비쌈
// 오라클 10g 방언으로 사용
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
build.gradle > dependencies에 추가implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.oracle.database.jdbc:ojdbc8'

2) .xml 파일 생성
src/main/resources에 폴더 META-INF생성META-INF에 persistence.xml 파일 생성
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="oracle.jdbc.driver.OracleDriver" />
<!-- oracle id, password -->
<property name="javax.persistence.jdbc.user" value="spring" />
<property name="javax.persistence.jdbc.password" value="spring" />
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<!-- 오라클 10g 방언으로 사용 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<!-- Postgre : 웬만한 쿼리 다 가능 -->
<!-- <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL10Dialect" /> -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- value = none or value = create -->
<!-- 옵션 -->
<!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
<property name="hibernate.show_sql" value="true" />
<!-- SQL 출력 시 보기 쉽게 정렬 -->
<property name="hibernate.format_sql" value="true" />
<!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
<property name="hibernate.use_sql_comments" value="true" />
</properties>
</persistence-unit>
</persistence>
① @Entity 적용하기
@Entity 어노테이션이 붙은 클래스는 데이터베이스에서 하나의 테이블과 매핑 @Entity
@Getter @Setter
public class Member {
@Id
private Long id;
private String name;
}
② jpa 사용하는 클래스 만들기
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf
= Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// transaction 선언
EntityTransaction tx = em.getTransaction();
// transaction 시작
tx.begin();
try {
// 추가
Member member = new Member();
member.setId(2L);
member.setName("UserB");
em.persist(member);
// 회원조회
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.id : " + findMember.getId());
System.out.println("findMember.name : " + findMember.getName());
// 회원 수정
findMember.setName("HelloJPA");
// 회원 삭제
em.remove(findMember);
// transaction 커밋
tx.commit();
// 커밋과 커밋 사이를 하나의 트랜잭션 단위 = 비즈니스 단위
// 오류 나면 트랜잭션 자체가 롤백
}catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
③ ctrl + f11로 실행 후 디비버에서 테이블 확인

jpa 세팅을 위한 기본 프레임
package com.codingbox.jpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Jpabasic {
public static void main(String[] args) {
EntityManagerFactory emf
= Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
emf.close();
}
}
}
@Entity 있으면 기본 프레임만 실행해도 테이블 생성