<property name="hibernate.hbm2ddl.auto" value="update" />
이것처럼 DDL을 어떻게 할 지 설정하는 부분이다.
스프링에서는 application.properties에 spring.jpa.hibernate.ddl-auto에서 설정 가능하다.
DDL(Data Defination Language) : 데이터베이스를 정의하는 언어이며, 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 하는 언어이다.

다음과 같은 속성들을 가지며, 이런 DDL들은 개발 단계에서만 사용되어야 한다.
개발 초기 단계에선 update나 create를 사용해도 되지만, 테스트 서버나 스테이징, 운영 서버에서는 validate 또는 none을 사용해야 한다. create는 당연히 DB가 초기화 될 수 있으니 사용을 지양해야 하고, update 역시 alter 쿼리가 날아가는데, 이 쿼리가 날아갈 때 DB Lock이 걸려 서비스가 중단될 수 있기 때문에 사용해선 안된다.
이 어노테이션이 붙은 클래스는 JPA가 관리한다. 즉, JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.
이때, 파라미터가 없고 public, protected 생성자의 기본 생성자가 필수로 들어가야 하고, final, enum, interface, inner 클래스는 사용이 불가하다. 또한, 저장할 필드에는 final을 사용해선 안된다.
속성은
이 어노테이션은 엔티티와 매핑할 테이블을 지정한다.

주로 name 속성을 알아두면 되는데, 기본적으로는 엔티티의 이름을 사용하여 생략이 가능하지만, 엔티티의 이름과 다른 테이블 명을 사용하고 있다면 @Table(name="name")으로 테이블 명을 지정해주어야 매핑이 가능하다.

java의 enum 타입을 매핑할 때 사용한다. @Enumerated(EnumType.STRING)처럼 사용한다.
이때, enum 순서를 데이터베이스에 저장하는 EnumType.ORDINAL을 사용하면 안된다. 도중에 enum이 수정되게 되면 값이 꼬일 수 있기 때문에 데이터를 좀 더 쓰더라도 enum의 이름을 데이터베이스에 저장하는 EnumType.STRING을 사용하는 것이 좋다.

날짜 타입을 매핑할 때 사용한다. 이때, LocalDate(연월), LocalDateTime(연월일)을 사용할 때는 생략이 가능하다.
이 어노테이션에는 지정할 수 있는 속성이 없다. 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑이 된다.
필드가 매핑되지 않고, 데이터베이스에 저장되지 않아 조회도 되지 않는 어노테이션이다. 주로 메모리 상에서만 임시로 값을 보관하고 싶고 데이터베이스에는 반영하고 싶지 않을 때 사용한다.
기본 키는 null이 아니어야 하며, 유일해야 하고 변하면 안되는 값이다.
📌 직접 할당 : @Id만 사용
📌 자동 생성 : @GeneratedValue까지 사용
IDENTITY : 기본 키 생성을 DB에 위임한다. 주로 MySQL, PostgreSQL 등에서 사용한다.
SEQUENCE : 유일한 값을 순서대로 생성하는 특별한 DB 시퀀스 오브젝트를 사용한다. 주로 ORACLE, PostgreSQL, H2 등에서 사용한다. (@SequenceGenerator 필요)
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName=“MEMBER_SEQ",//매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
private Long id;
SequenceGenerator 속성
TABLE : 키 생성용 테이블을 사용하여 DB 시퀀스를 흉내내는 전략이며, 모든 DB에서 사용하지만 성능이 떨어진다는 단점이 있다. (@TableGenerator 필요)
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key ( sequence_name )
)
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
TableGenerator 속성