2024. 1. 17. 00:22ㆍWeb/JPA
H2 데이터 베이스 설치
JPA를 사용하려면 DB가 있어야하기 때문에
간단하게 실습용 DB사용
OS 는 windows 사용
IDEA intellij 사용
File -> New -> Project 생성
Name : ex1-hello-jpa
Language : java
JDK : 11
Groupid : jpa-basic
artifactid : ex1-hello-jpa
설정후 프로젝트 생성 해주시면됩니다.
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
maven dependency 설정
JPA 설정 하기
persistence.xlm 파일 만들기
/META-INF/persistence .xlm 위치
persistence -unit name으로 이름 지정
javax.persistence 로 시작 : JPA 표준 속성
hibernate로 시작 : 하이버 네이트 전용 속성
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>
데이터베이스 방언
JPA는 특정 데이터베이스에 종속X
각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
- 가변 문자 : MySQL른 VARCHAR, Oracle은 VARCHAR2
- 문자열을 자르는 함수 : SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
- 페이징 : MySQL은 LIMIT, Oracle은 ROWNUM
방언 : SQL 표준을 지키지 않는 특정 데이터베이스 만의 고유한 기
JPA 실습
JpaMain 클래스 생성
JpaMain 내용
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
//code
em.close();
emf.close();
}
}
객체와 테이블 생성하고 매핑
@Entity : JPA가 관리할 객체
@Id : 데이터베이스 PK와 매핑
Member table 생성
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
Member 클래스 생성
@Entity
public class Member {
@Id
private Long id;
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;
}
}
getter setter 단축키 ALT + Insert
두개 다 만들어준다
JpaMain 클래스에 들어가서
이렇게 코드를 짜보고 오류 없이 실행 되는지 본다
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
오류가 뜬다면
pom.xml에 들어가 dependency를 추가 해주면 잘돌아 간다
<!-- API, java.xml.bind module -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Runtime, com.sun.xml.bind module -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.2</version>
</dependency>
코드 추가후
실행 하면
쿼리가 뜰거다
데이터 베이스에 저장이 돼있는지 보면된다
아주 잘된다
try catch 문을 사용하여 오류가 났을 때 처리하는 로직을 추가 해준다
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin(); // 트랜젝션 시작
try {
Member member = new Member();
member.setId(2L); // id insert
member.setName("HelloB"); // name insert
em.persist(member);
tx.commit(); // 트랜젝션 커밋
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
수정 코드 작성
Member findMember = em.find(Member.class, 1l); // 수정하고싶은 pk 를 넣는다
System.out.println("findMember = " + findMember.getId()); // id를 잘불러왔는지 본다
System.out.println("findMember = " + findMember.getName()); // name을 잘불러왔는지 본다
찾은 데이터가 맞는 지 확인
아주 잘찾아 온다
Member findMember = em.find(Member.class, 1l); // 수정하고싶은 pk 를 넣는다
findMember.setName("helloJPA"); // 찾은 데이터 name 값수정
그대로 실행시켜주면
쿼리를 뱉는다
DB에 저장된것을 확인하면
수정이 잘되었다.
삭제 쿼리 날리는법
Member findMember = em.find(Member.class, 1l); // 수정하고싶은 pk 를 넣는다
System.out.println("findMember = " + findMember.getId()); // id를 잘불러왔는지 본다
System.out.println("findMember = " + findMember.getName()); // name을 잘불러왔는지 본다
em.remove(findMember); // 데이터 삭제
찾은 데이터를 그대로 넣고 삭제코드를 넣어주면 된다
주의할점
엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
엔티티 매니저는 쓰레드간에 공유X (사용하고 버려야 한다)
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL
전체 회원 조회
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());
}
결과
전체 조회 결과를 뱉어낸다
JPQL의 장점은
페이징을 할때
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.setFirstResult(5)
.setMaxResults(8)
.getResultList();
특정 DB에 구애받지 않고 페이징을 할수가 있다.
JPQL
- JPA를 사용하면 엔티티 객체를 중심으로 개발
- 문제는 검색 쿼리
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 애플레케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
- JPA는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공
- SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- JPQL은 엔티티 객체를 대상으로 쿼리
- SQL은 뎅디터베이스 테이블을 대상으로 쿼리
- 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
- SQL을 추상화해서 특정 데이터베이스 SQL에 의존X
- JPQL을 한마디로 정의하면 객체 지향SQL
'Web > JPA' 카테고리의 다른 글
[JPA] 엔티티 매핑 (0) | 2024.01.29 |
---|---|
[JPA] 영속성 관리 (0) | 2024.01.22 |
[JPA] JPA 소개 (2) | 2024.01.02 |