데이터가 들어갈 테이블에 대한 상세 명세
엔티티: 데이터 하나하나를 말함
기본 엔티티 이름 -> 테이블 명

@Entity :
엔티티명 : 기본값 : 클래스명
참고) JPQL(Java Persistence Query Language)
name, value - 엔티티 명을 직접 설정
@Table : @Table 애노테이션은 JPA 엔티티 클래스가 매핑될 데이터베이스 테이블에 대한 정보를 지정할 때 사용된다.



(확인했으니 테이블 drop하기)
Table클래스 내부 메서드

컬럼 여러개 조합해서 인덱스 만들때 사용
테이블에 생성할 인덱스를 지정함

unique: true로 설정하면 해당 인덱스가 유니크 인덱스로 생성된다. 기본값은 false
🔹 예시

columnList = "createAt DESC": createAt 컬럼에 대해 내림차순으로 인덱스를 생성

인덱스 부여됨
배열 형태로 인덱스 두개 부여

columnList = "email, password": email과 password 컬럼에 대해 인덱스를 생성
unique = true: 유니크 인덱스를 생성하여 email과 password의 조합이 유일함을 보장
UNIQUE 제약조건이 두개를 조합한 형태로 추가되었다.

@Temporal@GeneratedValue: 자동 증감 번호
@GeneratedValue 어노테이션을 통한 기본키를 생성하는 전략(기본키를 생성하는 방법)

기본값 Auto
오라클은 시퀀스
mysql은 테이블 전략..
🔹 예시



◻ application.yml
...
hibernate:
ddl-auto: update # 증감번호 증가하는지 확인하려면 기존 데이터가 남아있게 해줘야한다.. update는 기존 데이터를 drop하지 않고 남겨둠 (create는 drop한다)
#ddlAuto
...

Member2 데이터도 수동으로 넣어줌

flush()는 한번만 해도 됨


@Lob :CLOB, BLOB 타입 매핑application.yml의 ddlAuto 다시 create로 바꿔주기...

@CreationTimestamp, @UpdateTimestamp

추가한 시간과 수정한 시간의 차이 확인

-@Enumerated : enum 타입 매핑
🔹 예시



Enum클래스 ordinal 메서드: 열거된 상수의 순서를 반환해줌
-> 사용xxx

순서 바뀔 수 있으니 Ordinal 사용x 타입을 스트링으로!! 항상 바꿔줘야함

🔽

@Transient: 해당 필드 데이터베이스 매핑 무시

introduction 매핑 무시됨
@Column 속성



unique는 null을 허용하기 때문에 필수항목에서는 Notnull을 붙여줘야함
...
@Column(nullable = false,unique = true) //null허용하지않음
private String email;
@Column(nullable = false)
private String password;
@Column(nullable = false, name = "name")
private String userName;
...
...
public class Member extends BaseEntity {//기본 클래스 명이 테이블 명이 된다.
...
@Column(length = 60, nullable = false,unique = true)
private String email;
...
@Column(length = 40, nullable = false, name = "name")
private String userName;
...
@Column(length = 10)
@Enumerated(EnumType.STRING)
private Authority authority;
}
...

@MappedSuperclass //공통 속성을 사용할 상위 클래스
@Getter @Setter
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreationTimestamp
@Column(updatable = false)//수정 x, 추가만 가능해야함
private LocalDateTime createdAt;
@LastModifiedDate //스프링 표준적 애노테이션
@Column(updatable = false) //수정X
private LocalDateTime modifiedAt;
}



update 불가하게 해둬서 시간 바뀌지 않았음
지금까지 설계한 엔티티에서는 등록시간, 수정시간 멤버변수가 공통으로 들어가 있다. 하지만 실제 서비스를 운영할때 보통 등록시간과 수정시간, 등록자, 수정자를 테이블에 넣어 놓고 활용한다.
Spring Data Jpa에서는 Auditing 기능을 제공하여 엔티티가 저장 또는 수정될 때 자동으로 등록일, 수정일, 등록자, 수정자를 입력해준다.
엔티티의 생성과 수정을 감시하고있다!!
이러한 공통 멤버 변수들을 추상 클래스로 만들고 해당 추상 클래스를 상속받는 형태로 엔티티를 수정해주는게 좋다.
@MappedSuperclass : 공통 속성화를 위한 상위 클래스, 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공해줌
@CreatedDate: 엔티티가 생성되어 저장될 때 시간을 자동으로 저장한다./ @LastModifiedDate: 엔티티의 값을 변경할 때 시간을 자동으로 저장한다.
-> 엔티티의 상태 변화에 따라서 값이 업데이트(DB와 상관x)
-> 변화 감지를 위한 이벤트 리스너


Member 엔티티에 Auditing 기능을 적용하기 위해서 BaseEntity 클래스를 상속받는다.

🔽 🔽

Auditing을 적용하기 위해 애노테이션 추가
이벤트 감지 할 수 있게 설정해줘야함
➡ @EntityListeners
✅ Auditing 기능을 사용하기 위해서 설정 클래스도 필요하다.
@EnableWebMvc는 필요없음
@EnableJpaAuditing 붙여줘서 Auditing기능을 활성화 시킨다. - Configuration 어노테이션을 통해 JPA 에서 auditing 을 가능하게 하는 어노테이션임

🔽테스트4 실행



: 기본키를 여러 컬럼을 조합해서 생성
: 게시글 조회수 - UV
브라우저 정보(User-Agent) + IP + 회원번호(0) : UID + 게시글 번호(ID)
복합키를 정의하는 방법
<1> @IdClass 사용
뷰 카운트 저장할 엔티티 클래스 생성


ID를 묶어주는 ID클래스 필요함


uid는 오라클에 정의된 예약어라 사용할 수 없다
@Column - name 이나 큰따옴표를 사용해서 바꾸면 된다.

🔽 테이블 생성됨

<2> @EmbeddedId ,@Embeddable


🔽
