본문 바로가기

Spring/JPA

JPA- 관련 개념 정리

@Entity

 엔티티는 JPA가 관리할 객체이다. (테이블에 대응하는 하나의 클래스)

 

@Id 

 데이터베이스 PK와 매핑하는 것이다.

DB에 데이터 저장하기

 1) 데이터 베이스에 테이블 생성하기

1.MEMBER 테이블 생성하기
2.생성된 MEMBER 테이블

 2) 객체를 생성해서 테이블에 데이터 넣기

Member.java

package hellojpa;

import jdk.nashorn.internal.objects.annotations.Getter;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity  //엔티티 등록: JPA가 관리하는 객체임을 알려줌
public class Member {

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

JpaMain.java

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        //엔티티매니저 팩토리 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // 참고로 "hello"는 persistence.xml의 <persistence-unit name="hello">로 부터 옴
        
        //팩토리로 부터 엔티티매니저 생성
        EntityManager em = emf.createEntityManager();
        
        //저장할 멤버
        Member member = new Member();
        member.setId(3L);
        member.setName("helloTeam");

        // EntityManger가 트랜잭션을 얻어옴(DB에 데이터 수정 권환을 가져옴?)
        EntityTransaction tx = em.getTransaction();
        
        try{
            // 데이터 베이스 트랜잭션 시작(DB 데이터 수정 시작)
            tx.begin();

            // 엔티티 저장(여기선 member 객체)
            em.persist(member);

            // 커밋(변경사항 완전 저장, 트랜잭션 종료)
            tx.commit();
        } catch(Exception e) {
            tx.rollback(); //오류 발생 시 롤백    
        } finally {
            //종료
            em.close();
        }
        emf.close();
    }
}

JpaMain.java 실행 후 DB 모습

자바 코드에서 생성한 객체 member가 테이블에 저장된 모습

 

 과정 정리

  1. DB에 테이블 생성하기(SQL 사용) -> create table Member(...);
  2. 엔티티로 쓸 객체 클래스를 자바로 생성 ->class Member{...};
  3. 엔티티매니저 팩토리 객체 생성 -> Persistence.createEntityManagerFactory(persistence-unit-name); 
  4. 팩토리 객체로 부터 엔티티매니저 객체 생성 -> emf.createEntityManager();
  5. 엔티티매니저로 부터 DB의 트랜잭션 얻어옴 -> em.getTransaction();
  6. 트랜잭션 시작 -> tx.begin();  
  7. 엔티티메니로 DB에 넣을 객체를 persist해 저장 -> em.persist(member);
  8. 정보 저장 끝났으면 트랜잭션 커밋 -> tx.commit();
  9. 엔티티매니저랑 팩토리 닫기 -> em.close(); emf.close();

엔티티와 테이블 연결

 근데 나는 지금 Member 엔티티를 Member 테이블에 저장하라고 얘기를 해준 적이 없다. 그럼에도 불구하고 자동으로 테이블을 찾아서 넣어주고 있는데, 이는 관례상 테이블 명과 엔티명이 동일하면 자동으로 찾아서 넣어준다. 만일 테이블명과 엔티티 명이 다른 경우, 직접 테이블을 지정해 줄수도 있다.

 

1) 엔티티를 저장할 테이블 명시하기. @Entity(name = "TABLENAME")

@Entity(name = "Member")  //엔티티를 저장할 테이블 명 
public class Member {

    @Id
    private Long id;
    private String name;
    ....
}

Member 엔티티를 Team 테이블에 저장하는 경우

 2) 엔티티의 필드(멤버)를 저장할 테이블 Column 명시하기. @Column(name = "COLUMNNAME")

테이블 TEAM

테이블 TEAM. 칼럼은 ID와 TEAMNAME

package hellojpa;

import jdk.nashorn.internal.objects.annotations.Getter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity(name = "team")  //테이블명: TEAM (Member -> TEAM)
public class Member {

    @Id
    private Long id;
    @Column(name = "teamname")  //칼럼명: TEAMNAME (name -> TEAMNAME)
    private String name;
	.....
}

실행 후 모습. "엔티티 Member"가 "테이블 Team"에 저장되고, "필드 name"은 "칼럼 TEAMNAME" 에 저장됨

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

JPA- flush와 영속성 관리  (0) 2023.02.28
JPA- 영속성 컨텍스트  (0) 2023.02.28
JPA- EntityManager.find()로 조회하기  (0) 2023.02.16
JPA- 지연 로딩과 즉시 로딩  (0) 2023.02.16
JPA- Transaction  (0) 2023.02.16