Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

@Entity 기본 속성 - 1 본문

JPA

@Entity 기본 속성 - 1

Seung__ 2021. 6. 15. 00:31

1.@Entity


Entity란  JPA가 관리하는 클래스로 @Entity를 통해  테이블과 클래스를 맵핑할 수 있다.

@Entity //Entity에는 primary key가 꼭 필요함., JPA가 관리하고 있는 객체
@EqualsAndHashCode
public class User {

    @NonNull
    private String name;

    @NonNull
    private String email;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    @Id
    @GeneratedValue //자동으로 하나씩 증가함.
    private Long id;

해당 클래스에서 사용하는 변수를  column으로 대응된다고 보면 된다.

table 생성

 

2. @Id


@Entity가 지정된 entity객체는 레코드를 유일하게 식별해줄수 있는 primary key(PK)가 반드시 존재해야 한다.

primary key로 지정할 변수를 @Id로 지정한다.

primary key는 unique + nutnull의 의미로 중복되지 않으며 필수입력 항목이다.

 

primary key로 활용될 변수에 @Id를 지정하면 된다.

   @Id
    @GeneratedValue //자동으로 하나씩 증가함.
    private Long id;

키를 할당하는 방식은 두 가지가 있다.

1) 직접 : PK를 어플리케이션에서 직접 할당

2) 자동 : DB가 자동으로 할당(오라클 : SEQUENCE, MySQL : IDENTITY)

 

 

3. @GeneratedValue


위에서 작성한 long 타입의 id값은 개발자가 직접 정해주는 것이 아니라,

특정 규칙에 의해 자동으로 생성되는 값을 사용한다는 의미이다.

   @Id
    @GeneratedValue //자동으로 하나씩 증가함.
    private Long id;

따라서 Generation Type즉 strategy()가 제공하는 속성이 중요하다.

public @interface GeneratedValue {

    /**
     * (Optional) The primary key generation strategy
     * that the persistence provider must use to
     * generate the annotated entity primary key.
     */
    GenerationType strategy() default AUTO;

    /**
     * (Optional) The name of the primary key generator
     * to use as specified in the {@link SequenceGenerator} 
     * or {@link TableGenerator} annotation.
     * <p> Defaults to the id generator supplied by persistence provider.
     */
    String generator() default "";

 

자동 생성방식은  네 가지 타입이 존재한다. 

 

1) TABLE : PK 생성 TABLE 사용

  db종류 상관없이 id값을관리하는 별도 테이블을 만들고 테이블에서 값을 추출하여 사용

 

2) SEQUENCE : 주로 오라클에서 사용하는 타입, DB 의존적

   인서트를 할대 hibernate 를 증가시켜주는 쿼리를  함꼐 사용.
   인서트 구문이 시행될때 시퀀스로부터 증가된 값을 받아서 실제 트랜잭션이 종료되는 시점에
   인서트 구문에 id를 채워서 쿼리를 하겠다.

 

3) IDENTITY : 주로 MySQL에서 사용. DB 의존적

   DB의 auto incresement값을 활용해서 generation을 제공.
   실제 사용하게 되면 트랜잭션이 종료되기 전에 인서트문이 동작해서 id값을 사전에 받아옴.

 

4) AUTO

  일반적으로 auto라는 값이 디폴트로 사용됨
  각 db에 적합한 값을 자동으로 넘겨줌
  db의존성 없이 코딩을 할 수 있음
  디폴트라 생략도 가능
 

 

일반적으로 db는 고정해서 사용하기 때문에 구체적으로 지정해주자.

 프로젝트 초기 세팅을 제외하고 특별히 고민하지 않을 설정들임.

 

 

4. @Table


@Entity를 통해 class화 table을 맵핑했다. 생성된 table에 여러 속성을 지정할 수 있는데, @Table을 통해 가능하다.

 - catalog나 schema지정가능, 및 이름 지정 가능.

 

1) name

일반적으로 엔티티 이름에 맞는 테이블 네임을 자동으로 지정되나, 특별한 경우에는 별도로 직접 지정 가능.

먼저 아무런 설정 없이 생성해보자.

아래와 같이 table이 생성되는데 이름은 엔티티이름과 동일하게 user라고 자동으로 입력됨.

Hibernate: 
    
    create table user (
       id bigint not null,
        created_at timestamp,
        email varchar(255),
        name varchar(255),
        updated_at timestamp,
        primary key (id)
    )

 

만약 아래와 같이 @Table에 이름을 지정하면?

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
@Entity //Entity에는 primary key가 꼭 필요함., JPA가 관리하고 있는 객체
@EqualsAndHashCode
@Table(name = "user_legacy")
public class User {

table이름이 변경되었다!

Hibernate: 
    
    create table user_legacy (
       id bigint not null,
        created_at timestamp,
        email varchar(255),
        name varchar(255),
        updated_at timestamp,
        primary key (id)
    )

일반적으로는 entity name와 table 이름이 매칭되는 것이 좋다. 

 

2) indexed & uniqueConstraints  

  - uniqueConstraints : 해당 column의 값은 unique하다는 제약조건 설정.

  - indexes : 해당 column으로 index를 생성한다..

 

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
@Data
@Builder
@Entity //Entity에는 primary key가 꼭 필요함., JPA가 관리하고 있는 객체
@EqualsAndHashCode
@Table(name = "user", indexes = {@Index(columnList = "name")}, 
       uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User {

    @NonNull
    private String name;

    @NonNull
    private String email;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    @Id
    @GeneratedValue //자동으로 하나씩 증가함.
    private Long id;

   // @OneToMany(fetch = FetchType.EAGER)
    //private List<Address> address;
}

 

- 실행 결과

  user의 name을 활용하여 index를 생성하였다.

  user의 email에 대하여  unique Constraint가 설정되었다. 즉 email에 해당하는 값은 테이블에서 유일하다.

 

Hibernate: create index IDXgj2fy3dcix7ph7k8684gka40c on user (name)
Hibernate: 
    
    alter table user 
       add constraint UKob8kqyqqgmefl0aco34akdtpe unique (email)

 

 

5.기타


인덱스나 제약사항은 실제로 DB에 적용된 것과 다를 수 있다.

 

JPA entity를 활용하여 DDL(데이터 베이스 객체를 생성, 삭제 등)을 생성하는 경우 적용이 되지만,

Select, insert, update 등의 쿼리를 실행할 때는 아무런 효력이 없다.

 

애초에 클래스를 TABLE에 맵핑할 때 지정한 속성이 적용되기 때문.

즉 이미 생성/삭제 된 이후에 기존의  데이터를 선택, 삭제 하는 행위에는 영향이 없다.

 

따라서 실제 DB에 인덱스가 적용되지 않았는데,

jpa에 인덱스 설정이 되어있다고 해서 인덱스를 활용한 쿼리가 동작하지는 않는다.

(JPA INDEX != DB INDEX)

 

그러므로

일반적으로 인덱스나 제약사항은 DB의 설정에 맡기고 entity에 표기하지 않는 경우가 대다수.

 

 

 

 

'JPA' 카테고리의 다른 글

Entity Listener - 1  (0) 2021.06.15
@Entity 속성 2  (0) 2021.06.15
Query Method : paging  (0) 2021.05.27
Query Method 3 : 정렬  (0) 2021.05.27
Query Method 3  (0) 2021.05.27
Comments