IT수업/SPRINGBOOT

IT 수업 21주차 (150) ORM_JPA

워제하 2024. 5. 16. 11:31

● JPA(Java Persistent API)

자바 ORM(Object Relational Mapping)으로 기술에 대한 API 표준 명세를 의미한다.

JPA는 특정 기능을 하는 라이브러리가 아니고, ORM을 사용하기 위한 인터페이스를 모아둔 것으로 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 방법중 한 가지 이다.
또한, JPA는 단순히 명세이기 때문에 구현이 없다.

 

 

● JPA Entity 관련 애노테이션

@Entity
    해당 클래스가 JPA 엔티티임을 표시한다.
    이 애노테이션을 사용하여 데이터베이스의 테이블과 매핑될 클래스를 정의한다.
@Table
    엔티티와 매핑될 데이터베이스 테이블을 지정한다.
    테이블 이름, 스키마, 인덱스, 고유 제약 조건 등을 설정할 수 있다.
@Id
    해당 필드가 엔티티의 주키(primary key)임을 표시한다.
    주키는 엔티티를 식별하는 데 사용되며, 반드시 필요한 애노테이션이다.
@GeneratedValue
    주키의 값이 자동으로 생성되는 경우 사용된다.
    자동 생성되는 값의 전략(strategy)을 설정할 수 있다.
@Column
    엔티티 클래스의 필드와 데이터베이스 테이블의 컬럼을 매핑한다.
    컬럼의 이름, 길이, NULL 허용 여부, 고유 제약 조건 등을 설정할 수 있다.
@Temporal
    날짜 및 시간 타입의 필드를 매핑할 때 사용된다.
    DATE, TIME, TIMESTAMP 중 어떤 형식으로 매핑할지 지정한다.
@OneToMany, @ManyToOne
    일대다 및 다대일 관계를 매핑한다.
    일대다 관계는 한 엔티티가 여러 다른 엔티티와 관계를 가지는 경우에 사용된다.
    다대일 관계는 여러 엔티티가 하나의 엔티티와 관계를 가지는 경우에 사용된다.
@OneToOne
    일대일 관계를 매핑한다.
    양쪽 엔티티 중 한 쪽에서만 참조가 필요한 경우에 사용된다.
@ManyToMany
    다대다 관계를 매핑한다.
    연결 테이블이 필요하며, 두 엔티티 간의 매핑을 설정한다.
@JoinColumn
    관계 매핑에서 외부 키(Foreign Key)를 지정한다.
    기본적으로 연관 관계의 주 키(primary key)를 참조하지만, 다른 컬럼을 참조하도록 설정할 수 있다.
@Transient
    해당 필드가 영속성 컨텍스트에 저장되지 않는 임시 필드임을 표시한다.
    데이터베이스에 매핑되지 않으며, 엔티티의 상태에 영향을 주지 않는다.

 

 

 

 

04프로젝트를 복사해서 05_ORM_JPA 프로젝트를 만들어준다.

 

 

start.spring.io에 가서 JPA를 받아 Explore를 눌러 코드를 가져온다.

 

build.gradle에 붙여넣기 하고 오른쪽 상단의 코끼리 아이콘을 눌러 새로고침 해준다.

 

 

resources 안에 있는 application.properties에서 DATASOURCE와 JPA를 작성해준다.

 

spring.jpa.show-sql=true                                                    //콘솔창에 표시
spring.jpa.hibernate.ddl-auto=update                                //엔티티생성을 어떻게 할 것인지
spring.jpa.properties.hibernate.format_sql=true                //포맷팅대로 출력할 것인지
spring.jpa.properties.hibernate.jdbc.batch_size=1000      //배치 허용 사이즈, 명령 갯수들
spring.jpa.properties.hibernate.order_inserts=true            //여러개의 insert 명령어가 들어가면 순서 배치 할 것인지
spring.jpa.properties.hibernate.order_updates=true          //여러개의 update 명령어가 들어가면 순서 배치 할 것인지

 

 

 

< TABLE 만들기 >

domain에 entity 패키지를 만들고 그 안에 Book클래스를 만들고 객체들을 작성해준다.

 

@Id는 jakarta로 import해주면 된다.

 

 

 

config에 TxConfig 클래스를 만들고 트랜잭션 코드를 작성해준다.

 

 

그리고 실행하면 workbench에 tbl_book 테이블이 생기게 된다.

콘솔창

 

만약 이전에 tbl_book 테이블이 있다면 tbl_memo만 남기고 bookdb의 테이블들은 모두 삭제 해준다.

 

이번에는 lombok 어노테이션을 사용하고 table어노테이션을 사용해 테이블 이름을 지정한다.

그러면 이름이 book이된 것을 확인 할 수 있다.

 

 

만약 bookcode 이름을 bookCode로 대문자를 적으면 workbench 에서 봤을 때는 book_code가 된다.

 

그러므로 대문자를 사용할 때는 나중을 위해 @Column 어노테이션을 사용해서 이름을 지정해줄 수 도 있다.

 

@id 사용으로 기본키 설정된 bookcode를 auto increment로 지정해본다.

@Id 밑에 @GeneratedValue 어노테이션을 사용한다.

 

not null 옵션을 사용하려면 @NotNull을 사용해주면 된다.

 

 

autoincrement가 필요없는 다음 실습을 위해 book.java에서 @GeneratedValue는 주석처리해주고 만들어진 테이블의 bookcode의 AI를 체크해제 해주고 apply해준다.

 

 

 

 

< CRUD 하기 >

 

domian 패키지에 ropository 패키지를 만들고 그 안에 BookRepository 인터페이스를 만들어준다.

JpaRepository를 상속받는데 <> 안에는 <테이블 이름, 기본키 자료형> 을 적어줘야한다.

 

BookRepository에 커서를 두고 ctrl+shift+t 를 눌러 test 클래스를 만들어준다. 

( test클래스에서는 꼭! @SpringBootTest 어노테이션 붙여주기!!! )

 

그리고 insert를 하기위해 insert 코드를 작성해준다.

 

- Insert

콘솔창

workbench에서 보면 값이 들어간 것을 확인 할 수 있다.

 

 

assertThat을 사용하기 위해 maven repository로 가서 assertJ를 받아온다.

Gradle(Short)

 

build.gradle에 붙여넣기 해준다.

 

그리고 어노테이션을 추가해준다.

 

 

 

 

 

- Update

bookCode가 기본키이기 때문에 현재 테이블에 들어있는 bookCode를 적으면 bookName과 publisher, isbn이 업데이트 되지만 만약 없는 bookCode를 적으면 새로운 값이기 때문에 update가 아닌 insert가 된다.

 

 

 

 

- SelectOne

 

 

 

 

- SelectAll

 

 

- Delete

 

 

 

< 연습 >

user 엔티티 만들고 userRepository 만들기

 

- User.java 엔티티

 

 

- UserRepository.java

 

 

- UserRepositoryTest.java