Entity 설계하기/Auditing 공통 속성화

예지성준·2024년 7월 24일

스프링부트

목록 보기
3/6
post-thumbnail

Entity 설계하기

  • 데이터가 들어갈 테이블에 대한 상세 명세

  • 엔티티: 데이터 하나하나를 말함

  • 기본 엔티티 이름 -> 테이블 명

1) 엔티티 매핑 관련 애노테이션

  • @Entity :
    엔티티명 : 기본값 : 클래스명

    참고) JPQL(Java Persistence Query Language)

  • name, value - 엔티티 명을 직접 설정

  • @Table : @Table 애노테이션은 JPA 엔티티 클래스가 매핑될 데이터베이스 테이블에 대한 정보를 지정할 때 사용된다.

    • 테이블 이름, 스키마, 카탈로그 및 테이블에 대한 제약 조건 등을 정의할 수 있다.
    • name : 테이블 명
      : 엔티티 명 == 테이블명
      ex) 실제 테이블 명이 CH_MEMBER인데 클래스는 Member로 정의하고 싶은 경우

(확인했으니 테이블 drop하기)

Table클래스 내부 메서드

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

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

🔹 예시

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

인덱스 부여됨


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

columnList = "email, password": email과 password 컬럼에 대해 인덱스를 생성

unique = true: 유니크 인덱스를 생성하여 email과 password의 조합이 유일함을 보장

UNIQUE 제약조건이 두개를 조합한 형태로 추가되었다.

  • @Temporal
    • Date, Calendar 클래스 관련 : 날짜, 시간, 날짜 + 시간
    • java.time API 사용시 필요 X
      LocalDate, LocalTime, LocalDateTime

  • @GeneratedValue: 자동 증감 번호
    • 기본키에 해당
    • 자료형은 정수형만 가능

@GeneratedValue 어노테이션을 통한 기본키를 생성하는 전략(기본키를 생성하는 방법)

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

  • MySQL에서 AUTO_INCREMENT를 이용해 데이터베이스에 INSERT 쿼리문을 보내면 자동으로 기본키 값을 증가시킬 수 있다. 오라클의 기본키를 생성해주는 Sequence의 경우 기본키의 초기값, 증가값, 최댓값, 최솟값을 지정할 수 있다.

🔹 예시

◻ application.yml

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

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

flush()는 한번만 해도 됨


  • @Lob :CLOB, BLOB 타입 매핑
    대용량 파일 저장하는데 사용/ 멀티미디어 데이터 다룸

application.yml의 ddlAuto 다시 create로 바꿔주기...

  • @CreationTimestamp, @UpdateTimestamp
    insert 시 시간 자동 저장
    update 시 시간 자동 저장

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

-@Enumerated : enum 타입 매핑

🔹 예시

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

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

🔽

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

introduction 매핑 무시됨

@Column 속성

  • 테이블에 매핑되는 컬럼의 이름, 문자열의 최대 저장 길이 등 다양한 제약 조건들을 추가할 수 있다.

  • name : 필드와 매핑할 컬럼의 이름 설정 (기본값은 객체의 필드 이름)

  • unique: 유니크 제약조건 설정

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;
    ...
  • length: varchar2일때(String타입) 길이 상세하게 설정
...
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;

}
...

  • updatable : update 가능 여부(기본값 true)
@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 불가하게 해둬서 시간 바뀌지 않았음

2) 공통 속성화

  • 지금까지 설계한 엔티티에서는 등록시간, 수정시간 멤버변수가 공통으로 들어가 있다. 하지만 실제 서비스를 운영할때 보통 등록시간과 수정시간, 등록자, 수정자를 테이블에 넣어 놓고 활용한다.

  • Spring Data Jpa에서는 Auditing 기능을 제공하여 엔티티가 저장 또는 수정될 때 자동으로 등록일, 수정일, 등록자, 수정자를 입력해준다.

    • 엔티티의 생성과 수정을 감시하고있다!!

    • 이러한 공통 멤버 변수들을 추상 클래스로 만들고 해당 추상 클래스를 상속받는 형태로 엔티티를 수정해주는게 좋다.

@MappedSuperclass : 공통 속성화를 위한 상위 클래스, 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공해줌

@CreatedDate: 엔티티가 생성되어 저장될 때 시간을 자동으로 저장한다./ @LastModifiedDate: 엔티티의 값을 변경할 때 시간을 자동으로 저장한다.

-> 엔티티의 상태 변화에 따라서 값이 업데이트(DB와 상관x)
-> 변화 감지를 위한 이벤트 리스너

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

🔽 🔽

Auditing을 적용하기 위해 애노테이션 추가

이벤트 감지 할 수 있게 설정해줘야함
@EntityListeners

✅ Auditing 기능을 사용하기 위해서 설정 클래스도 필요하다.
@EnableWebMvc는 필요없음

@EnableJpaAuditing 붙여줘서 Auditing기능을 활성화 시킨다. - Configuration 어노테이션을 통해 JPA 에서 auditing 을 가능하게 하는 어노테이션임

🔽테스트4 실행

3) @IdClass

: 기본키를 여러 컬럼을 조합해서 생성

: 게시글 조회수 - UV
브라우저 정보(User-Agent) + IP + 회원번호(0) : UID + 게시글 번호(ID)

복합키를 정의하는 방법

<1> @IdClass 사용

뷰 카운트 저장할 엔티티 클래스 생성

  • 두개를 조합해서 복합키 생성

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

  • 명칭과 동일하게 ID클래스 생성

uid는 오라클에 정의된 예약어라 사용할 수 없다

@Column - name 이나 큰따옴표를 사용해서 바꾸면 된다.

🔽 테이블 생성됨

<2> @EmbeddedId ,@Embeddable

🔽

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글