겉바속촉

JPA. Hello JPA 본문

IT 일기 (상반기)/JPA

JPA. Hello JPA

겉바속촉 2023. 3. 22. 18:00
728x90
반응형

 

 

 

 

 

목표 : 애플리케이션 개발

 

 

 

테이블 생성 : Member 테이블

create table Member (
id bigint not null,
name varchar(255),
primary key(id)
);

 

 

 

 

1. 회원등록 : 데이터 넣어주기

 

<JpaMain.java>

public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        Member member = new Member();
        member.setId(1L);
        member.setName("HELLO A");
        em.persist(member);

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

 

 

<Member.java>

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

 

 

 

실행했더니 다음과 같은 에러 발생....

INFO: HHH000204: Processing PersistenceUnitInfo 

INFO: HHH000412: Hibernate Core {5.3.10.Final}

INFO: HHH000206: hibernate.properties not found

 

구글링하다가 다음과 같은 내용을 봐버림:)

 

JDK11 부터 Java EE 모듈이 제거되었다.
JDK11 이상 버전을 사용하는 경우 JAXB 라이브러리를 꼭 추가해줘야한다.

 

라는 것을 보고

 

 

pom.xml에다가 dependency를 추가해줬음

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

 

다시 빌드 후 돌려보니 다음과 같이 쿼리문이 제대로 출력되는 것을 확인할 수 있음

 

 

 

db에서 데이터 확인

 

 

 

2. 회원 조회 : 데이터 조회

 

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 {
            Member findMember = em.find(Member.class, 1L);
            System.out.println("findMember.id = " + findMember.getId());
            System.out.println("findMember.name = " + findMember.getName());

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

 

출력문

 

 

 

 

3. 회원 삭제 : 데이터 삭제

 

그냥 다음과 같이 찾아준 값을 지워주면 ok

       try {
            Member findMember = em.find(Member.class, 1L);

            em.remove(findMember);

            tx.commit();
        }

 

 

 

 

3. 회원 수정 : 데이터 업데이트

DB 조회로 확인해보니 id가 1인 값의 name이 정말로 HelloJPA로 바뀌어있다.

 

 

 

신기한 점은

 

JAVA객체에서 값만 바꿨을 뿐인데

왜?

DB의 값이 바꼈을까

 

 

JPA는 트랜젝션을 커밋하는 시점에 값이 바꼈는지 유무를 다 체크한다고 한다

즉, 체크하여 값이 바뀐 걸 알아챘다면

UPDATE 쿼리를 만들어버린다는 것.......OMG

 

 

 

 

 

 

***중요한 점***

 

Entity Manager Factory는 하나만 생성해서 애플리케이션 전체에서 공유함.

Entity Manager는 스레드 간 공유가되면 절대 nonono.

JPA의 모든 데이터 변경은 트랜젝션 안에서 실행되는 것.

 

 

 

 

 

728x90
반응형

'IT 일기 (상반기) > JPA' 카테고리의 다른 글

JPA. 엔티티 매핑 1. 객체와 테이블 매핑  (0) 2023.03.23
JPA. 프로젝트 생성  (0) 2023.03.22
JPA. JPA란  (0) 2023.03.22