다가오는 다음을 향해
[JPA] JPA 구현하기(기초) 본문
JPA 구현하기(기초)
참고 : https://www.inflearn.com/course/ORM-JPA-Basic/unit/21685?category=questionDetail
※ 공부 정리 목적으로 작성된 글입니다.
📌 개발환경
MacBook Pro M1
IntelliJ IDEA (Ultimate Apple Silicon 2022-02)
Maven
java-1.8
JPA - Hibernate 2.1.214 (설치방법: https://tira-0.tistory.com/236)
☘️ pom.xml 파일에 JPA 하이버네이트, 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-SNAPSHOT</version>
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
☘️ JPA 설정 - persistence.xml
- persistence.xml : JPA 설정 파일 입니다.
- 파일경로 : /META-INF/persistence.xml
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
#JPA가 생성하는 SQL을 출력
spring.jpa.show-sql=true
#JPA가 자동으로 테이블을 생성해주는 기능 (사용: create , 미사용: none)
Spring.jpa.hibernate.ddl-auto=none
☘️ JPA 엔티티 매핑
1. Member 테이블을 생성합니다.
create table Member (
id bigint not null,
name varchar(255),
);
2. Member 엔티티 클래스 생성 및 매핑합니다.
package hellojpa;
import javax.persistence.Entity;
import javax.persistence.Id;
@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;
}
}
- @Entity : 객체와 테이블을 매핑합니다.
- @Id : 데이터베이스 기본키와 매핑합니다.
☘️ 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 emf = Persistence.createEntityManagerFactory("hello");
// 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
// 트랜잭션
EntityTransaction tx = em.getTransaction();
// 트랜잭션 시작
tx.begin();
try {
// 회원 수정 - JPA를 통해서 엔티티를 조회하면 JPA가 관리하며, 트랜잭션으로 commit을 할 때 값이 변경되었는지 체크한다. 변경사항이 있으면 update 후 commit한다.
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " + findMember.getName());
findMember.setName("HelloJPA");
// 트랜잭션 - 커밋
tx.commit();
} catch (Exception e) {
// 트랜잭션 - 롤백
tx.rollback();
} finally {
em.close(); // 엔티티 매니저 종료
}
emf.close(); // 엔티티 매니저 팩토리 종료
}
}
ㅁ EntityManagerFactory
- persistence.xml의 설정정보를 사용해서 JPA를 동작시키기 위한 엔티티 매니저 팩토리를 생성합니다.
- 엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 합니다.
ㅁ EntityManager
- 엔티티 매니저 팩도리에서 엔티티 매니저를 생성합니다.
- 엔티티 매니저 내부에 데이터 소스를 유지하면서 데이터 베이스와 통신합니다.
- 데이터베이스 커넥션과 밀접한 관계가 있기 때문에 쓰레드간에 공유하거나 재사용하면 안됩니다.(동시성 문제 발생)
- 사용이 끝난 엔티티 매니저는 반드시 종료해야합니다.
ㅁ 트랜잭션
- JPA는 항상 트랜잭션 안에서 데이터를 변경해야 합니다.(트랜잭션없이 데이터 변경 시 예외 발생)
'JPA' 카테고리의 다른 글
[JPA] 영속성 관리 - 내부 동작 방식 (0) | 2022.12.29 |
---|---|
[SpringBoot JPA] JPA 구현하기(기초) (0) | 2022.12.15 |