[Spring Boot] JPA 시작하기

아는벌·2023년 3월 7일
0

web (2)

목록 보기
15/20

JPA 시작하기

의존성 설정

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

spring data jpa 의존성을 추가한다.
그 외에도 h2, lombok을 추가로 설정해줬다.

Entity 클래스 생성

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name="SARAM")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SaramEntity {
    @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long seq;
    private String id;
    private String name;
    private int age;
}

매핑 어노테이션

JPA는 매핑 어노테이션으로 어떤 객체가 어떤 테이블과 관계가 있는지 알아냄!

@Entity

  • 테이블과 매핑한다고 JPA에 알려줌
  • @Entity가 사용된 클래스를 엔티티 클래스라고 함

@Table

  • 엔티티 클래스와 매핑할 테이블 정보를 알려줌
  • name="테이블이름" 으로 해당 엔티티를 테이블이름 테이블에 매핑
  • name 속성을 생략하면 클래스 이름을 그대로 테이블 이름으로 매핑

@Id

  • 엔티티 클래스의 필드를 테이블의 pk 칼럼에 매핑
  • @Id가 사용된 필드를 식별자 필드라고 함

@GeneratedValue

  • strategy - 자동 생성 전략 선택(Generation Type 지정)
  • generator - 이미 생성된 키 생성기를 참조

[식별자 값 생성 전략]

  • IDENTITY
    • @GeneratedValue(strategy = GenerationType.IDENTITY)
    • 기본 키 생성을 데이터베이스에 위임
    • AUTO_INCREMENT
  • SEQUNCE
    • @GeneratedValue(strategy = GenerationType.SEQUNCE)
    • 데이터베이스 Sequense Object 사용
    • 데이터베이스에서 자동으로 숫자를 generate 해줌
    • 매핑할 데이터베이스의 시퀀스가 필요함(@SequenceGenerator)
  • TABLE
    • @GeneratedValue(strategy = GenerationType.TABLE)
    • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
    • @TableGenerator 필요
  • AUTO
    • @GeneratedValue(strategy = GenerationType.AUTO)
    • 기본 설정 값
    • 방언에 따라 위 전략을 자동으로 지정

(https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html)

@Column

  • 필드를 칼럼에 매핑

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"
             xmlns:xsi="http://www.w3.org/2001/XMSchema-instance">

    <persistence-unit name="SaramJPA">
        <class>org.comstudy.saramjpa.domain.SaramEntity</class>
        <properties>
            <!-- 필수 속성 - Database Source 설정 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> <!-- JDBC 드라이버 -->
            <property name="javax.persistence.jdbc.user" value="userId" /> <!-- DB 접속 ID -->
            <property name="javax.persistence.jdbc.password" value="userPw" /> <!-- DB 접속 PW -->
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test" /> <!-- DB 접속 URL -->

            <!-- DB Dialect 설정 -->
            <!-- DB 변경 시 DB 방언(Dialect)만 교체 -->
            <!--
                  오라클 10g : org.hibernate.dialect.oracle10gdialect
                  MySQL : org.hibernate.dialect.mysql5innodbdialect
                  SQL Server : org.hibernate.dialect.sqlserver2012dialect -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />

            <!-- 옵션 JPA 구현체(Hibernate) 설정 -->
            <property name="hibernate.show_sql" value="true" /> <!-- hibernate가 실행한 SQL을 출력 -->
            <property name="hibernate.format_sql" value="true" /> <!-- hibernate가 실행한 SQL 출력 시 정렬 -->
            <property name="hibernate.use_sql_comments" value="true" /> <!-- 쿼리 출력 시 주석도 함께 출력 -->
            <property name="hibernate.id.new_generator_mappings" value="true" /> <!-- JPA 표준에 맞춘 새로운 키 생성 전략 사용 -->

            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>

src/main/resources/META-INF/persistence.xml 해당 경로로 persistence.xml를 생성하고 자신의 개발환경에 맞게 수정한다.
* web에서는 application.yml에서 설정한다.

하이버네이트 설정

  • create : Session factory가 실행될 때에 스키마를 지우고 다시 생성. 클래스패스에 import.sql 이 존재하면 찾아서, 해당 SQL도 함께 실행함.
  • create-drop : create와 같지만 session factory가 내려갈 때 스키마 삭제.
  • update : 시작시, 도메인과 스키마 비교하여 필요한 컬럼 추가 등의 작업 실행. 데이터는 삭제하지 않음.
  • validate : Session factory 실행시 스키마가 적합한지 검사함. 문제가 있으면 예외 발생.

시작하기

public class JPAClient {
    public static void main(String[] args) {
    	// 엔티티 매니저 팩토리 생성
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SaramJPA");
        // 엔티티 매니저 생성
        EntityManager em = emf.createEntityManager();
        // 트랜잭션 기능 획득
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin(); //트랜잭션 시작
  
            SaramEntity saram = new SaramEntity();
            saram.setId("HONG");
            saram.setName("홍길동");
            saram.setAge(25);
            
            // 등록
            em.persist(saram);	

			// 한 건 조회
            SaramEntity searchSaram = em.find(SaramEntity.class, 1L);
            System.out.println("Saram 검색 => "+searchSaram.toString());
            
            tx.commit(); //트랜잭션 커밋
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback(); 
        } finally {
            em.close();
        }
        emf.close();
    }
}

EntityManagerFactory 생성

// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("SaramJPA");

persistence.xml파일에 설정된 영속성 유닛 정보가 로딩될 수 있도록 Persistence.createEntityManagerFactory("SaramJPA")의 SaramJPA와 같은 이름을 persistence.xml의 <persistence-unit name="SaramJPA">에서 설정한 name과 같게하여 엔티티 매니저 팩토리 생성한다.
엔티티 매니저 팩토리는 애플리케이션 전체에 한 번 생성하고 공유해서 사용한다.

EntityManager 생성

 // 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();

엔티티 매니저를 통해 CRUD 기능을 수행할 수 있다.
엔티티 메니저는 데이터베이스 커넥션과 밀접한 관계가 있어 스레드간에 공유하거나 재사용하면 안된다.

트랜잭션 생성

EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득

try {

    tx.begin(); //트랜잭션 시작
    logic(em);  //비즈니스 로직
    tx.commit();//트랜잭션 커밋

} catch (Exception e) {
    tx.rollback(); //트랜잭션 롤백
}

등록/수정/삭제 작업은 항상 트랜잭션 안에서 데이터를 변경해야 실제 SQL이 생성되고 처리된다. 트랜잭션을 시작하기 위해 엔티티 메니저에서 트랜잭션 API를 받아온다.


Git

https://github.com/EunbiAn/webkit-backend/tree/master/springboot_jpa_day28

참고

https://ultrakain.gitbooks.io/jpa/content/

0개의 댓글