JPA 프로젝트 생성
이 강의에서는 H2 데이터베이스와 메이븐을 사용해 JPA를 실습한다.
라이브러리 추가 - 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>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
</project>
- 주의 사항
1. 자바 버전 11 이후부터는 org.hibernate와 com.h2 database가 기본으로 안 들어있다. 그래서 javax.xml.bind를 dependency 해줘야 한다.
2. com2.h2databse의 버전은 내가 다운로드한 버전과 일치해야 한다.
3. 하이버네이트의 버전은 내가 사용할 spring boot의 버전과 자바 버전이 사용 가능 하다고 알려져 있는 것을 사용해야 한다.
Your relational data. Objectively. - Hibernate ORM
Idiomatic persistence for Java and relational databases.
hibernate.org
여기서 하이버네이트와 알맞은 자바버전을 선택한다.
https://spring.io/projects/spring-boot#learn
Spring Boot
Commercial support Business support from Spring experts during the OSS timeline, plus extended support after OSS End-Of-Life. Publicly available releases for critical bugfixes and security issues when requested by customers.
spring.io
여기서 스프링 부트와 알맞은 하이버네이트 버전을 선택한다.
JPA 설정하기 - 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>
<!-- 필수 속성 -->
<!-- javax.persistence로 시작 : JPA 표준 속성 -->
<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"/>
<!-- 옵션 -->
<!--hibernate로 시작: 하이버네이트 전용 속성 -->
<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>
이 파일은 resource 폴더에 META-INF 폴더를 만들어 거기에 생성해야 한다.
데이터베이스 방언
JPA는 특정 데이터베이스에 종속하지 않는다. 이 말은 각각의 데이터베이스에 제공하는 SQL 문법과 함수는 조금씩 다르지만 JPA는 다 비슷하게 고쳐줄 수 있다는 것이다. 제일 중요한 예제로 MySQL은 LIMIT를 사용해 페이징 처리를 하지만 ㅒOracle은 ROWNUM을 통해 페이징 처리를 한다. JPA는 이것을 다 처리해 줄 수 있다.
- hibernate.dialect 속성에 지정
1. H2 : org.hibernate.dialect.H2Dialect
2. Oracle 10g : org.hibernate.dialect.Oracle10gDialect
3. MySQL : org.hibernate.dialect.MySQL5InnoDBDialect 등이 있다.
JPA 실습해 보기
Member파일
먼저 Member 파일을 만들어야 한다. Member 파일은 Table에 집어넣을 요소를 선택하는 것이다.
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
//@Table(name= "User")
public class Member {
@Id
private Long id;
private String name;
/*
@Column(name = "userName")
private String phoneNumber */
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;
}
}
@Entity는 이것이 Entity인지 알려주는 것이고 @Id는 집어넣을 요소라는 것을 알려준다.
만약 넣고 싶은 테이블을 지정해 주려면 @Table( name= "User")를 통해 지정할 수 있다.
@Colunm은 열의 이름이 지정한 이름과 다르다면 지정해주는 것이다.
JpaMain 파일
java 패키지에 JpaMain이라는 메인 클래스를 만들었다.
- 입력 삭제 조회
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) {
EntityManagerFactory enf = Persistence.createEntityManagerFactory("hello");
EntityManager em = enf.createEntityManager();
//EntityTransaction 시작
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
//입력 실습해보기
Member member = new Member();
member.setId(2L);
member.setName("HelloB");
em.persist(member);
//삭제 실습
//Member findMember = em.find(Member.class, 1L);
//em.remove(findMember);
tx.commit();
} catch (Exception e)
//예외를 발생시키면 rollback
tx.rollback();
} finally {
//무조건 실행해야하는 부분이다.
em.close();
}
enf.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) {
EntityManagerFactory enf = Persistence.createEntityManagerFactory("hello");
EntityManager em = enf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
enf.close();
}
}
간단하게 setName해주는 걸로 업데이트를 할 수 있다. JPA는 엔티티를 find로 가져오는 순간 트랜잭션을 관리해주기 때문에 setName으로도 쉽게 변경할 수 있다.
주의
- 엔티티 매니저 팩토리(EntityManagerFactory)는 하나만 생성해서 애플리케이션 전체에서 공유
- 엔티티 매니저는 쓰레드간에 공유를 하지 않고 요청이 들어오는 순간 계속 만들어진다.
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다.
JPQL
모든 것을 다 조회하는 것이 아닌 특정한 값만 조회하기 위해서는 어떻게 해야 할까?
SQL에서는 자신이 짜준 퀴리로 조회를 쉽게 할 수 있었다. JPA도 그것을 가능하게 해 주기 위해 JPQL이 존재한다.
JPQL을 사용하는 이유
JPA를 사용하면 엔티티 객체를 중심으로 개발을 한다.
문제는 검색 퀴리이다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 하게 된다.
모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하다. 그래서 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL을 사용할 수밖에 없다.
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 데이터베이스 테이블을 대상으로 쿼리
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(1)
.setMaxResults(1)
.getResultList();
JPQL을 사용해 간단하게 paging 하는 법이다.
강의 출처 : https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'BackEnd > 자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
JPA 엔티티 매핑(필드와 컬럼 매핑, 기본 키 매핑) (1) | 2022.12.22 |
---|---|
JPA 엔티티 매핑(객체와 테이블 매핑) (0) | 2022.12.22 |
JPA 영속성 관리 - 내부 동작 방식 (0) | 2022.12.22 |
JPA 소개(자바 ORM 표준 JPA 프로그래밍 - 기본편) (0) | 2022.12.21 |
JPA 소개(자바 ORM 표준 JPA 프로그래밍 - 기본편) (0) | 2022.12.20 |