![[자바 ORM 표준 JPA 프로그래밍 - 기본편] 2. JPA 시작하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKE4bV%2FbtsCTx8l3R7%2Fo0Ktnbpk3fFGSa72BITDM1%2Fimg.png)
인프런 김영한 강사님의 [자바 ORM 표준 JPA 프로그래밍 - 기본편]을 수강하고 정리한 글입니다.
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런
현업에서 실제로 JPA로 개발을 하고 있습니다. 그런 입장에서보면 지금 작성하고 있는 코드들이 어떻게 작동하는지 이해하는데 큰 도움을 주는 강의입니다. 다음은 제가 느낀 이 강의의 장점들
www.inflearn.com
📌 JPA 설치
✅ 라이브러리 추가
Maven의 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jpa-basic</groupId>
<artifactId>ex1-hello-jpa</artifactId>
<version>1.0.0</version>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
</dependencies>
</project>
✅ JPA 설정 - persistence.xml
persistence.xml은 JPA 설정 파일로서, /MEAT-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.persistence로 시작하는 속성들은 JPA 표준 속성을 의미하고,
hibernate로 시작하는 속성들은 하이버네이트 전용 속성을 의미한다.
✅ DataBase 방언
각각의 DB는 제공하는 SQL 문법과 함수가 조금씩 다른데, 이를 방언이라고 한다.
방언은 SQL 표준을 지키지 않는 특정 DB만의 고유 기능이라고 볼 수 있다.
그런데 JPA는 특정 DB에 종속하지 않는다.
따라서 hibernate.dialect 라는 속성에 방언 관련 설정을 해줘야 한다.
참고로 하이버네이트는 40가지 이상의 DB 방언을 지원한다.
📌 JPA 애플리케이션 개발
✅ JPA 구동 방식
✅ 객체, 테이블 생성 및 매핑
@Entity : JPA가 관리할 객체
@Id : DB PK와 매핑
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id
private Long id;
private String name;
//Getter, Setter …
}
위 JPA 코드는 아래 쿼리문과 일치한다.
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
✅ JPA 실습 : 회원 등록 / 수정 / 삭제
- 회원 등록
package hellojpa;
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) {
// 로딩 시점에 DB 당 하나만 생성해야 함.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// DataBase Transaction Start!
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// Code
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
// member 저장
em.persist(member);
// Dabase Transaction End!
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
- 회원 수정
package hellojpa;
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) {
// 로딩 시점에 DB 당 하나만 생성해야 함.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// DataBase Transaction Start!
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// Code
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
// Dabase Transaction End!
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
- 회원 삭제
package hellojpa;
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) {
// 로딩 시점에 DB 당 하나만 생성해야 함.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// DataBase Transaction Start!
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// Code
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.id = " + findMember.getId());
System.out.println("findMember.name = " + findMember.getName());
// member 저장
em.remove(findMember);
// Dabase Transaction End!
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
주의점
EntityManagerFactory는 하나만 생성하여 애플리케이션 전체에 공유해야 한다.
EntityManager는 Thread간 공유하지 않는다. (사용하고 버려야 한다.)
JPA의 모든 데이터 변경은 Transaction 내부에서 실행한다.
✅ JPQL
가장 단순한 조회 방법이라고 말할 수 있다.
- JPQL로 전체 회원 검색하기
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
// 로딩 시점에 DB 당 하나만 생성해야 함.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// DataBase Transaction Start!
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// Code
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList();
for(Member member : result)
System.out.println("member.name = " + member.getName());
// Dabase Transaction End!
tx.commit();
} catch(Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
JPA를 사용하면 엔티티 객체 중심으로 개발 할 수 있다고 그랬다.
그런데 문제는 검색 쿼리다.
검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색하게 된다면, 모든 DB 데이터를 객체로 변환하여 검색한다는 것인데, 이는 불가능하다.
결국 애플리케이션이 필요한 데이터만 DB에서 불러오기 위해 결국 검색 조건이 포함된 SQL이 필요해질 수 밖에 없다는 것이다.
이 문제를 해결하기 위해 JPA는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어를 제공한다.
SQL 문법과 매우 유사하다. SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 지원한다.
JPQL은 엔티티 객체를 대상으로 쿼리하고, SQL은 DB Table을 대상으로 쿼리한다는 점이 차이점이다.
'Backend > JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 6. 다양한 연관관계 매핑 (0) | 2024.01.04 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 5. 연관관계 매핑 기초 (0) | 2024.01.04 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 4. 엔티티 매핑 (0) | 2024.01.04 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 3. 영속성 관리 - 내부 동작 방식 (0) | 2024.01.04 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 1. JPA 소개 (1) | 2024.01.03 |
개발자가 되고 싶어요.