Spring/Spring boot icia 68일차

Spring boot Database - Entity

swkn 2023. 5. 30. 13:51

1. TDD(Test Driven Development)

  1. Spring Data JPA(Java Persistence API)
    a. DataBase 테이블을 자바 객체처럼 사용
    b. 테이블의 역할을 하는 Entity 클래스 사용
    c. save() , findById() , findAll() , deleteById() 등등 정해진 메서드이름을 사용

 

 

2. 이름 수정

 

application.yml로 확장자 변경

 

application.yml의 내용 추가

들여쓰기가 매우 중요하기 때문에 잘 확인해야 한다.

 

 

3. Entity class

1. Entity를 테이블처럼 사용

패키지를 하나추가하고 Entity class를 생성

 

2. Primary key  지정

package com.example.demo_2.entity;

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

@Entity // 해당 클래스를 Entity 클래스로 정의하겠다.
// 테이블을 Java 객체화 할때 사용
public class NationEntity {
    @Id // Primary Key 컬럼 지정
    private Long id;
}

쿼리문이 나간 것을 확인할 수 있다.

데이터베이스로 확인해보면 id 칼럼이 추가된 것을 볼 수 있다.

 

3. Auto_increament

위와 같이 설정이 먹힌 것을 볼 수 있다.

추가로 id는 항상 MySQL에서 auto_increment 속성을 추가했는데 class에서도 가능하다.

package com.example.demo_2.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity // 해당 클래스를 Entity 클래스로 정의하겠다.
// 테이블을 Java 객체화 할때 사용
public class NationEntity {
    @Id // Primary Key 컬럼 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
    private Long id;
}

auto_increament가 적용되었다.

 

 

4.  Class 이름 지정

클래스 이름은 이렇게 되어있는데

테이블 이름은 _가 붙어있음을 볼 수 있다.

자동적으로 _를 붙이는 것이다.

이것이 맘에 들지 않는다면

@Table(name = "nation_table") // table 이름 지정

@Table 어노테이션을 사용해서 이름을 지정할 수 도있다.

 

5. Column 생성 - not null , unique

 

그리고 column도 추가 가능하다.

    // column 추가
    @Column
    private String nationName;

마찬가지로 _가 붙고 , 크기를 지정하지 않는다면 255가 default이다.

이것도 따로 지정가능한데

    // column 추가
    @Column(length = 50, nullable = false)
    private String nationName;

length로 지정가능하고 , nullable = false 이면 not null 속성이다.

크기가 50으로 정해지고 not null 속성이 붙었다.

 

Unique 제약 조건도 가능하다.

    // column 추가
    @Column(length = 50, nullable = false, unique = true)
    private String nationName;

테이블 만든 후에 alter 명령어로 제약조건을 추가한 것을 볼 수 있다.

 

 

6. Entity 클래스 연습

1. 테이블 이름 : album_table

2. 칼럼(실제 DB에 만들어지는 이름)

id = bigint auto_increment

song_name varchar(50) not null,

song_album varchar(50) not null,

song_playtime int,

song_artist varchar(50) not null

song_lyrics varchar(500)

 

package com.example.demo_2.entity;

import javax.persistence.*;

@Entity
@Table(name = "album_table")
public class AlbumEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 50, nullable = false)
    private String songName;

    @Column(length = 50, nullable = false)
    private String songAlbum;

    @Column
    private int songPlaytime;

    @Column(length = 50, nullable = false)
    private String songArtist;

    @Column(length = 500)
    private String songLyrics;

}

테이블이 완성되었다.

 

songArtist로 지정해놓으면 대문자 전에 언더바가 붙어서 song_artist로 필드이름이 지정된다.

 

7. 주의사항

insert into album_table (song_name,song_album,song_playtime,song_artist,song_lyrics)
	value ('I AM','I VE IVE',240,'IVE(아이브)','가사가사');

만약 SQL에 데이터를 삽입하고 프로젝트를 재부팅하면 drop table이 적용되에 데이터가 사라진다.

  # spring data jpa 설정
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    open-in-view: false
    hibernate:
      ddl-auto: create

애플리케이션 파일에 ddl-autocreate기 때문에 서버가 다시 실행되면 데이터가 재부팅된다.

이런 경우는 테스트할때 유용하지만 프로젝트할때에는 기능을 꺼야 할 것이다.

  # spring data jpa 설정
  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    open-in-view: false
    hibernate:
      ddl-auto: update

ddl-auto를 update로 바꾸면 필요할때 초기화기 때문에 데이터가 날아가지 않는다.

 

만약 칼럼을 추가하면

    @Column
    private String songGenre;

alter로 추가된다.

 

 

Spring Framework에서는 항상 DTO를 들고 다녔지만 Spring Boot는 Entity Class로 값을 주고받게 된다.

 

 

그러므로 Service 가 더욱 중요하게 된다.

Entity Class가 변형되면 DataBase에도 변화가 오기 때문에 Http까지 Entity를 사용할 수는 있지만 공개하지 않는다.

그러므로 Service에서부터는 DTO를 사용한다.

 

Repository는 interface class로 작성한다.

package com.example.book.Repository;

import com.example.book.Entity.BookEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BookRepository extends JpaRepository<BookEntity,Long> {
    
}

Long은 PK가 Long타입이기 때문이다.

JpaRepository를 상속받으면 자동으로 Spring 객체기 때문에 @Repository 어노테이션이 필요하지 않다.