본문 바로가기

Spring/JPA

JPA 기초와 매핑 : 실습

maven projects에 만들고

멤버 정보를 담는 객체

package reJPA.entity;

import javax.persistence.*;

@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;
    }
}

persistence.xml

<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
    <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"/>

        </properties>
    </persistence-unit>
</persistence>

애플리케이션 개발

엔티티 매니저 설정

엔티티 팩토리 만들어서 거기서 엔티티 매니저 생성해서 관리하게 됨

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

"hello"는 persistence.xml에서 줬던 <persistence-unit name="hello">입니다.

*에러가 났었는데 @Entity 이름 같은 vo클래스가 있으니까 에러 나더라. 그래서 원래 연습하던 곳에 @Entity 어노테이션 날려줬음

emf.close();

EntityManagerFactory 닫아주고... 실제로 쓸 때 팩토리 한번만 create해주고, 실제 쓸 때는 여기서 EntityManager 꺼내서 쓰도록 해야함!

EntityManager em = emf.createEntityManager();

이제 팩토리에서 매니저 얻어와.

웹 어플리케이션에서는 고객 요청 들어올 때 마다 엔티티매니저 만들어서 쓰면 된다. 그리고 이 요청 처리는 모두 트랜잭션 안에서 이루어진다.

EntityTransaction tx = em.getTransaction();

데이터베이스 접근해서 트랜잭션 가지고 옴.

tx.begin();
Member member = new Member();
member.setId(100L);
member.setName("안녕하세요");
em.persist(member);
//담아서 보낸다 insert! = persist

그렇게 tx.commit()하고.

em닫고, emf닫는다.

tx.commit();
em.close();
emf.close();

이걸 try catch문 써서

try{
	Member member = new Member();
  member.setId(100L);
  member.setName("안녕하세요");
	em.persist(member);

	tx.commit();
}catch(Exception e){
	tx.rollback();
}finally{
	em.close();
}

emf.close();

이런 식으로 사용하게 된다.

emf는 왜 finally안에 안 넣고, 밖으로 뺀 걸까?

주의

-엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유(계속 생성하면?? 성능이 아주 구려진다..)

-엔티티 매니저는 쓰레드간 공유하면 안 된다(사용하고 버려야 한다) (사용자 정보 들어갔다. 근데 또 같은 엔티티 매니저에 정보를 넣었다? SQL문이 문제가 생길 수 있음 요청할 때 마다 꺼내서 새로 줘!)

-JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

해당 포스팅은 T아카데미에서 진행한 김영한 강사님의 JPA 유튜브 강의를 듣고 정리한 것입니다 : ) https://www.youtube.com/watch?v=WfrSN9Z7MiA&list=PL9mhQYIlKEhfpMVndI23RwWTL9-VL-B7U

반응형

'Spring > JPA' 카테고리의 다른 글

JPA 필드와 칼럼 매핑  (0) 2021.04.11
JPA persistence.xml과 라이브러리 설정  (0) 2021.04.11
JPA 기초와 매핑  (0) 2021.04.11
JPA에 대해서  (0) 2021.04.11
JPA, 객체지향과 RDB  (0) 2021.04.11