반응형
JPA 시작하기
프로젝트 생성
- DB 설치하기
⇒ 실습용으로는 간단하게 사용되고 웹상황에서 콘솔창도 볼 수 있는 H2를 사용한다. H2 설치 가이드는 링크 글을 참고한다. - 프로젝트 생성하기
- Java 8 이상(8권장)
- Maven 프로젝트
- groupId: jpa-basic
- artifactId: ex1-hello-jpa
- version: 1.0.0
- 프로젝트 설정 : Maven
- pom.xml
- 우리가 나중에 사용할 스프링 부트 버전에 있는 org.hibernate 버전을 확인하고, 그에 맞게 바꿔주어야 한다.
https://spring.io/projects/spring-boot#learn → Reference Doc 클릭, → a single HTML page 클릭 - H2 데이터 베이스 버전도 변경 필요!
<?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.6.9.Final</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> </dependencies> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> </project>
- src/main/resources/META-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>
- 우리가 나중에 사용할 스프링 부트 버전에 있는 org.hibernate 버전을 확인하고, 그에 맞게 바꿔주어야 한다.
- pom.xml
JPA 구동 방식
JPA 사용해보기
src/main/java/hellojpa/JpaMain.java 생성
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 emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
emf.close();
}
}
- Persistence 클래스에서 persistence.xml의 persistenceUnitName을 인자 값으로 주면 해당 persistence Unit에 지정된 설정 정보들을 토대로 EntityManagerFactory를 만들어 준다.
- EntityManagerFactory에서 EntityManager를 만들어 준다.
- 생성된 EntityManager로 DB에 SQL을 전달한다.
그럼 이제 Member 클래스를 만들어보자.
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Member {
@Id //pk
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;
}
}
- @Entity : JPA에서 해당 객체를 관리하겠다는 어노테이션
- @Id : 해당 필드가 식별자 역할(pk)을 한다는 어노테이션
회원 등록
package hellojpa;
import javax.persistence.*;
import java.util.List;
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(1L);
member.setName("HelloA");
em.persist(member);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
- 트랜잭션 시작, 커밋 설정이 있어야 오류가 발생하지 않는다.
회원 조회
전체 코드는 위에 있는 코드와 같으므로 try구문 안쪽만 수정하면 된다.
//조회
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " + findMember.getName());
- 멤버를 찾을 때는 find (클래스, pk) 메서드를 사용한다.
회원 수정
//수정
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
- setName 만하고 em.persist()를 사용하지 않았음에도 DB에 값이 변경되는 것을 확인할 수 있다. → 자바의 컬렉션을 다루는것 처럼 JPA가 관리해준다.
회원 삭제
//삭제
Member findMember = em.find(Member.class, 1L);
em.remove(1L);
tx.commit();
정리 : EntityManger의 기본적인 CRUD
저장 : persist();
조회: find();
삭제: remove();
변경: 따로 함수를 호출하기보다는 find를 해서 가져온 객체에서 setter 메서드를 통해 값을 변경하면,commit()이 적용되기 전에 기존 객체와 차이점을 찾아서 자동 업데이트를 해준다.
주의점
- EntityManagerFactory는 시스템마다 1개만 생성해서 애플리케이션 전체에서 공유한다.
- EntityManager는 쓰레드 간에 공유X (사용하고 버려야 한다.)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.
JPQL
- JPA는 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
→ 테이블에서 가져오면 객체지향의 패러다임이 깨지기 때문 - 하지만, 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하다.
→ 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요. - JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
- SQL 문법과 유사하다. : SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
- JPQL은 엔티티 객체를 대상으로 쿼리한다. → DB를 바꾸더라도 방언을 교체할 필요가 없다.
- SQL은 데이터베이스 테이블을 대상으로 쿼리한다.
사용 예시
//전체 회원 조회
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList();
- 테이블 대상이 아닌 객체 대상 으로 조회하므로 엔티티 객체를 중심으로 개발이 가능하다. (Member.class)
JPQL은 한마디로 정의하자면 객체 지향 SQL이다.
이 글은 김영한 님의 "자바 ORM 표준 JPA 프로그래밍 - 기본편" 강의를 듣고 정리한 내용입니다.
반응형