-
JPA의 의미 및 기본 사용 방법Spring/JPA 2023. 12. 31. 16:33728x90반응형
JPA란?
Java Persistence API의 줄임말이며 자바 ORM 기술 표준을 의미한다.
ORM이란?
Object-Relational-Mapping으로 객체 관계 매핑을 의미한다.
- 객체는 객체대로 관계형 DB는 관계형 DB대로 설계
- ORM 프레임워크가 중간에서 매핑을 해준다.
JPA를 사용하는 이유
1. SQL 중심적인 개발에서 객체 중심으로 개발이 가능하다.
2. 생산성이 높아진다.
3. 유지보수에 용이하다.
4. 패러다임의 불일치를 해결할 수 있다.
5. 성능
6. 데이터 접근 추상화와 벤더 독립성
JPA 설정
/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>
- javax.persistence는 JPA 표준 속성을 의미한다.
- 이는 구현체(현재 hibernate)를 변경해도 그대로 사용가능하다.
- hibernate는 Hibernate 속성을 의미한다.
- hibernate.dialect는 방언을 의미한다.
- 이는 각각의 데이터 베이스가 제공하는 SQL 문법과 함수가 다르기 때문에 이를 각 상황에 맞춰서 매핑해주기 위해 설정하는것이다.
- 예시로 OracleDialect, MySQLDialect 등이 있다.
JPA의 구동 방식
1. /META-INF/persistence.xml에서 설정한 정보를 조회 한다.
2. Persistence 객체를 만든다.
3. Persistence 객체를 사용하여 EntityManagerFactory 객체를 생성한다.
- EntityManagerFactory는 하나만 생성하여 애플리케이션 전체에서 공유한다.
4. EntityManagerFactory로 EntityManager 객체를 만들어서 사용한다.
- EntityManager는 쓰레드간 공유를 해서는 안된다.
JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.
JPA 소스 코드
DTO
@Entity // JPA에서 사용하는 객체라는걸 알려주기 위한 어노테이션 // Table Name은 기본적으로 Class Name으로 지정된다. // 변경하고 싶다면 아래와 같이 지정할 수 있다. // @Table(name = "Member") public class Member { @Id // Primary key를 알려주기 위한 어노테이션 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; } }
JPA 사용 코드
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence-unit Name"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); // 트랜젝션 시작 try{ // Insert Code Member member = new Member(); member.setId(1L); member.setName("JPA1"); // Select Code Member findMember = em.find(Member.class, 1L); // Delete Code Member findMember = em.find(Member.class, 1L); em.remove(findMember); // Update Code Member findMember = em.find(Member.class, 1L); findMember.setName("Hello JAP"); // JPQL 맛보기 List<Member> result = em.createQuery("select m from Member as m") .setFirstResult(1) .setMaxResults(8) .getResultList(); for(Member m : result){ Sysetem.out.println(m.getName()); } tx.commit(); }catch(Exception e){ tx.rollback(); }finally{ em.close(); } emf.close();
728x90반응형'Spring > JPA' 카테고리의 다른 글
JPA 연관 관계 매핑 - start (1) 2024.01.14 JPA 기본키 매핑 (1) 2024.01.12 JPA 엔티티 매핑 (0) 2024.01.02 JPA에서 batch_size를 지정하는 이유는? (0) 2024.01.02 JPA의 영속성 관리 (0) 2023.12.31