[Spring] H2 Console을 이용한 DB Data CRUD

21495 단어 SpringSpring

1) Book.java 생성

hibernate - 폴더 명 : model

model - 파일 명 : Book.java

JPA에서 제공하는 Annotation인 @Entity 사용하기

자동으로 import javax.persistence.Entity; 생성된다.


🥪 Entity Annotation? : 객체와 테이블을 맵핑(Mapping)

: 해당 class(Book)를 JPA가 관리하는 Entity(객체)로 인식하게 한다.

별도의 Table annotation(@Table)을 지정하지 않으면,
해당 클래스의 이름(Book)으로 테이블이 생성된다. → 'Book' Table

@Entity 적용시 주의할 점?

  1. 기본 생성자(Default constructor) 필수
    : JPA가 Entity 객체를 생성할 때 기본 생성자를 활용하기 때문이다!

  2. 값을 저장할 field에 final을 사용하면 안된다.


JPA의 기본 키 생성 전략(크게 2가지)

  1. 직접 할당 : 기본키를 애플리케이션에 직접 할당
ex)
	Book book = new Book();
    book.setId("book1");
  1. 자동 생성 : 대리키 활용
  • IDENTITY : 기본키 생성을 DB에게 위임 (MYSQL의 auto_increment)

  • SEQUENCE : DB 시퀀스 기능을 활용(Oracle에서 지원, MySQL은 미지원)

  • TABLE : 키 생성 테이블을 사용(키를 생성해주는 별도의 테이블을 만들고, 시퀀스처럼 사용하는 방식, 모든 DB에서 사용 가능)

직접 할당 방식을 사용하기 위해서는 @Id만 쓰면 된다.
자동 생성 방식을 활용하려면 @Id + @GeneratedValue 추가, 원하는 키 생성 전략을 선택한다.


2) Book.java 코드 - 직접 할당

package dev.hibernate.model;

import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import java.util.Date;

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

@Entity
// @Table(name="BOOKS")  // table명이 BOOKS로 생성된다
public class Book {


  @Id
  private String id;  // primary key(기본키)
  
  // @Column Annotation : 필드와 DB의 컬럼 맵핑
  @Column(name="book_name", nullable = false)
  private String bookName;  
  // Java에서는 camelCase(bookName)를 사용, DB에서는 snake_case(book_name)사용
  // book table의 컬럼명은 book_name, not null 설정(무조건 기입)
  
  // @Column(name="book_author") : column명은 통일하는게 좋다
  private String author;

  // 시간 관련된 설정, java.util.date, util.Calendar 맵핑할 때 사용
  @Temporal(TemporalType.TIMESTAMP)
  // TemporalType.DATE : 날짜, DB date 타입과 맵핑 (ex_ 2022-03-03)
  // TemporalType.TIME : 시간, DB time 타입과 맵핑 (ex_ 09:30:23)
  // TemporalType.TIMESTAMP : 날짜 + 시간, DB에 timestamp 타입과 매핑 (ex_2022-12-23 11:27:09)
  @Column(name="pub_date")
  private Date pubDate; // java.util로 import 해야함
  
  
  // 기본 생성자 및 Getter, Setter
  public Book() {
  }

  public Book(String id, String bookName, String author, Date pubDate) {
    this.id = id;
    this.bookName = bookName;
    this.author = author;
    this.pubDate = pubDate;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getBookName() {
    return bookName;
  }

  public void setBookName(String bookName) {
    this.bookName = bookName;
  }

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  public Date getPubDate() {
    return pubDate;
  }

  public void setPubDate(Date pubDate) {
    this.pubDate = pubDate;
  }
}

App.js 코드

package dev.hibernate;

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

import dev.hibernate.model.Book;

public class App 
{
    public static void main( String[] args ){

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa"); 
        // persistence.xml의 <persistence-unit name="jpa"> 이므로

        // EntityManagerFactory를 통해 EntityManager 객체 생성
        EntityManager em = emf.createEntityManager();
        Book book = new Book();
        book.setId("book1");
        book.setBookName("The little prince");

        // book data DB에 Insert => EntityManeger 이용
        // 등록, em.persist(등록할 entity); list.add()
        // INSERT INTO BOOK(ID, BOOK_NAME, PUB_DATE) VALUES ('book1', "The little prince","현재 날짜값")
        em.persist(book);

    }
}

F5 클릭해서 App.js 실행하기

persistence.xml

<!-- create : 기존에 테이블이 존재하면 삭제(drop) 후 새로 생성(create), DROP + CREATE  -->
<property name ="hibernate.hbm2ddl.auto" value ="create"/>

코드로 인해, table이 존재하면 drop한 후 create한다 (DROP + CREATE)

BOOK table 생성

H2 Console - BOOK table 생성되어있다.

RUN을 클릭하면 (no rows, 1 ms)로, 아무런 결과가 나오지 않는다


결과 도출을 위한 App.js 코드 수정

EntityTransaction tx = em.getTransaction();

tx.begin();
tx.commit();

추가 후, H2 Console에서 Run 클릭

book1 객체가 DB에 제대로 등록되었다 😄

EntityTransaction의 begin과 commit사이에서 객체를 등록해야한다.


🥯 DB데이터 수정

book.setBookName("다 큰 왕자");

추가 후, F5로 코드 실행

BOOK_NAME 변경되어있다.


🧀 DB 한 행 조회 : em.find()

	Book findBook = em.find(Book.class, "book1");
	System.out.println(findBook.getBookName());

em.find()를 사용하여 findBook에 book1 데이터를 저장한 후,
Console에 출력하여 확인할 수 있다.


🍳 Entity 삭제 : em.remove()

F5 눌러 실행 후, H2 Console 확인

book1 Entity가 삭제되었다!


🧆 Entity란?

Front에서 Back으로 Book order라는 데이터를 보낼 때,

책 이름, 저자, 주소 등과 같은 정보를 보낸다.

BackEnd에서 데이터를 받는 곳은 DTO이고, 실제로 DB에 데이터를 넣을 때 활용되는 것이 Entity이다.

Q. DTO와 Entity의 차이점은? (굳이 DTO로 front에서 데이터를 받아야할까?)

이름만 다르다고 생각할 수 있지만, Entity는 실제 DB Table과 매칭하기 위해 필드들만 가지고 있는 것이다.

DTO는 front 화면에서 필요한 데이터만 보낼 때 사용한다.

Back에서 정보를 관리하기 위해 필요한 필드들은 Entity가 가지고 있다.

즉, 필드가 서로 일치하지 않을 수 있다는 의미이다.

Entity는 DB 매핑용으로 @Id, @Column과 같은 Annotation을 사용하기 때문에, 관계형 DB만의 특성들이 일치하지 않는 부분을 JPA가 해결해준다.

이런 Entity를 front에 그대로 내보내게 되면 오류가 발생할 수 있으므로,
DTO를 사용하는 것이다.

(이해는 잘 안됐지만.. 대충 이렇다고 한다)


좋은 웹페이지 즐겨찾기