[Spring] H2 Console을 이용한 DB Data CRUD
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 적용시 주의할 점?
-
기본 생성자(Default constructor) 필수
: JPA가 Entity 객체를 생성할 때 기본 생성자를 활용하기 때문이다! -
값을 저장할 field에 final을 사용하면 안된다.
JPA의 기본 키 생성 전략(크게 2가지)
직접 할당
: 기본키를 애플리케이션에 직접 할당
ex)
Book book = new Book();
book.setId("book1");
자동 생성
: 대리키 활용
-
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를 사용하는 것이다.
(이해는 잘 안됐지만.. 대충 이렇다고 한다)
Author And Source
이 문제에 관하여([Spring] H2 Console을 이용한 DB Data CRUD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dingdoooo/Spring저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)