Spring/기본 구성

7. Entity 클래스

초코chip 2024. 1. 18. 14:50

엔티티 클래스

  • 정의: RDMS 테이블과 매핑되는 클래스

 

클래스 애너테이션

@Entity

  • 정의/목적: 해당 클래스가 엔티티임을 알리는 애너테이션
  • 사용법
    • 디폴트 : 클래스 이름과 같은 DB 테이블 매핑
    • name 속성 : name의 값을 가진 DB 테이블 매핑 ex) @Entity(name = "meber_list")
@Entity
public class Entity{}

 

 

Lombok 애너테이션

@NoArgsConstructor

  • 정의: 기본 생성자를 생성해주는 애너테이션
    • 엔티티는 반드시 기본 생성자가 존재해야함 (필수)
  • 특징: 접근 제어자는 public | protected여야만 한다. ( protected가 보안상 안전 )
  • 예시:
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Entity{}

 

필드 애너테이션

기본키(PK) 설정

@Id

  • 정의/목적: 기본키를 지정하는 애너테이션
    • 엔티티에 반드시 존재해야함 (필수)

 

@GeneratedValue

  • 정의: 기본키 생성 방식을 결정하는 애너테이션
  • 목적: surrogate key(일련번호)를 기본키로 사용하는 경우 사용
  • 속성
    • starategy: 기본키 생성 방식 결정 
      • GeneraionType.AUTO : 선택한 데이터베이스 방언(dialect)에 따라 방식을 자동으로 선택(기본값) 
      • GenerationType.IDENTITY : 기본키 생성을 데이터베이스에 위임(= AUTO_INCREMENT) 

 

    @Id
    @GeneratedValue (strategy = GenerationType.IDENTITY)
    private Long id;

 

일반 컬럼 설정

@Column

  • 정의/목적: 컬럼에 대한 여러 설정을 하는 애너테이션
  • 속성:
    • name: 실제 테이블 컬럼 이름 입력
      • 변수명과 동일하다면 생략 가능
    • nullable: null값을 비활성화 하고 싶을때 사용 
      • 디폴트 값은 true
    • updatable: 컬럼 값을 변경 불가능하고 싶을때 사용
      • 디폴트 값은 true
    • unique: 대체키를 설정하고 싶을때 사용
      • 디폴트 값은 false
    @Column(name="id", updatable = false)
    private Long id;

    @Column(name = "user_id", unique = true)
    private Long userId;

    @Column(name = "refresh_token", nullable = false)
    private String refreshToken;

 

외래키(FK) 설정

연관 관계

기본적으로 연관관계 관련 애너테이션은 위 처럼 4가지가 존재하지만, 외래키를 생각해보자

  • 1:1 관계 - 두 테이블중 애플리케이션 관점에서 더 자주 참조하는 테이블에 삽입
  • 1:N 관계 - N쪽인 테이블에 삽입
  • N:M 관계 - 관계 테이블을 생성하여, N:M 관계를 해소

즉, 외래키가 삽입 되는 테이블 기준으로 연관 관계는 1:1과 N:1 만 생각을 해주면 된다.

 

//targetEntity 속성에는 참조하는 테이블 클래스 설정
@ManyToOne(targetEntity = Entity2.class)

 

외래키 지정

  • @JoinColum 애너테이션 사용
    • name: 외래키(fk)의 컬럼 이름
    • foreignKey = @ForeignKey(name = "외래키 제약 이름 설정")
  • 필드는 참조하려는 엔티티 객체를 설정
@ManyToOne(targetEntity = Entity2.class)
@JoinColumn(name = "e2_id", foreignKey = @ForeignKey(name = "fk_entity_e2_id"))
private Entity2 e2;

 

 

최종 예시

package me.jangwoojin.praticeSpringboot;

import jakarta.persistence.*;
import lombok.*;


@Entity // 1. 엔티티 클래스 지정
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 2. 기본 생성자
@AllArgsConstructor
public class Member {
    @Id // 3. 기본키 지정
    @GeneratedValue(strategy = GenerationType.IDENTITY) //자동으로 1증가
    @Column(name = "id", updatable = false) //name 이라는 NOT NULL 컬럼과 매핑
    private Long id;

    @Column(name = "name", updatable = false)
    private String name;
}