ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA의 의미 및 기본 사용 방법
    Spring/JPA 2023. 12. 31. 16:33
    728x90
    반응형

    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
Designed by Tistory.