Spring boot Database - Entity
1. TDD(Test Driven Development)
- 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-auto에 create기 때문에 서버가 다시 실행되면 데이터가 재부팅된다.
이런 경우는 테스트할때 유용하지만 프로젝트할때에는 기능을 꺼야 할 것이다.
# 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 어노테이션이 필요하지 않다.