Book Study/스프링 부트 핵심 가이드

06. 데이터베이스 연동 (5)

정진킴 2023. 11. 2. 23:17

6.7 엔티티 설계

  • Spring Data JPA를 사용하면 데이터베이스에 테이블을 생성하기 위해 직접 쿼리를 작성할 필요가 없다.
  • JPA 에서 엔티티는 데이터베이스의 테이블에 대응하는 클래스이다.
  • 엔티티에는 데이터베이스에 쓰일 테이블과 컬럼을 정의하고 어노테이션을 사용하여 테이블 간의 연관관계를 정의한다.
package com.springboot.jpa.data.entity;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table (name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long number;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer price;

    @Column(nullable = false)
    private Integer stock;

    private LocalDateTime createAt;
    private LocalDateTime updatedAt;
}

6.7.1 엔티티 관련 기본 어노테이션

  • @Entity
    • 해당 클래스가 엔티티임을 명시하기 위한 어노테이션
    • 클래스 자체는 테이블과 1:1로 매칭되며, 해당 클래스의 인스턴스는 매핑되는 테이블에서 하나의 레코드를 의미한다.
  • @Table
    • 엔티티 클래스는 테이블과 매핑되므로 특별한 경우가 아니면 @Table 어노테이션이 필요하지 않다.
    • 해당 어노테이션을 사용할 때는 클래스의 이름과 테이블의 이름을 다르게 지정해야 하는 경우이다.
    • 지정하지 않으면 테이블의 이름과 클래스 이름이 동일하다
    • 서로 다른 이름을 쓰려면 @Table(name = "[테이블명]") 형태로 명시한다.
    • uniqueConstraints 속성을 이용하여 하나 이상의 컬럼을 unique 설정 가능
          @Table(
             uniqueConstraints = {
                   @UniqueConstraint(
                         columnNames = {"companyId", "date"} // 컬럼명 정의
                   )
             }
          )
  • @Id
    • 엔티티 클래스의 필드는 테이블의 컬럼과 매핑된다.
    • 해당 어노테이션이 선언된 필드는 테이블의 기본값 역할로 사용한다.
    • 모든 엔티티는 @Id 가 무조건 필요하다.
  • @GeneratedValue
    • @Id 어노테이션과 함께 사용하며 @Id 가 선언된 필드의 값을 어떤 방식으로 자동으로 생성할지 결정할 때 사용
    • GeneratedValue를 사용하지 않는 방식(직접 할당)
      • 애플리케이션 자체적으로 고유한 기본값을 생성할 경우 사용하는 방식
      • 내부에 정해진 규칙에 의해 기본값을 생성하고 식별자로 사용
    • Auto
      • @GeneratedValue의 기본 설정값
      • 기본값을 사용하는 데이터베이스에 맞게 자동으로 생성한다.
    • IDENTITY
      • 기본값 생성을 데이터베이스에 위임하는 방식
      • 데이터베이스의 AUTO_INCREMENT 를 사용해 기본값을 생성
        • 실무에서는 해당 설정을 이용한다.
  • @Column
    • 엔티티 클래스의 필드는 자동으로 테이블 컬럼으로 매핑된다.
    • 해당 어노테이션은 필드에 몇가지 설정을 하는 경우 사용
    • name : 테이블의 컬럼명을 정의
    • nullable: 레코드 생성 시 컬럼의 null 처리가 가능한지를 명시하는 속성
    • unique: 해당 컬럼을 unique로 설정
  • @Transient
    • 엔티티 클래스에는 선언돼 있는 필드지만 데이터베이스에선느 필요없을 경우 사용