오늘의하루

JPA의 의미 및 기본 사용 방법 본문

Spring/JPA

JPA의 의미 및 기본 사용 방법

오늘의하루_master 2023. 12. 31. 16:33

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();

'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
Comments