[Spring Boot] Entity 관련 Annotation 정리

이성민·2024년 12월 5일
post-thumbnail

본 글은 객체를 생성하면서 어노테이션을 사용함으로써 코드를 편리하게 짜는 것이 좋아 보여 객체를 생성할 때 주로 사용하는 어노테이션의 대한 공부 내용을 정리하였습니다

영화 리뷰 웹을 개발 할 때를 예시로 설명을 하겠습니다.

Movie 객체

package entity;

import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDate;
import java.time.LocalDateTime;

@Entity 
@Getter
@Setter
@NoArgsConstructor 
@AllArgsConstructor 
@Table(name = "movie")
public class Movie {

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

    // 타이틀
    @Column(nullable = false) 
    private String title;

    // 장르
    @Column(nullable = false) 
    private String genre;

    // 개봉일
    @Column(name = "release_date", nullable = false) 
    private LocalDate releaseDate;

    // 상영 종료일
    @Column(name = "end_date")
    private LocalDate endDate;

    // 상영 중 여부
    @Column(name = "is_showing", nullable = false)
    private Boolean isShowing;

    // 등록 일자
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;

    // 수정 일자
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;

    // 삭제 여부
    @Column(name = "is_deleted", nullable = false) 
    private Boolean isDeleted = false; 

}

Movie 객체에 사용된 어노테이션

- @Entity :

동일한 이름의 테이블과 매핑 시켜주는 어노테이션


- @Getter :

Lombok 어노테이션으로, getter 메서드를 자동으로 생성


- @Setter :

Lombok 어노테이션으로, setter 메서드를 자동으로 생성


- @NoArgsConstructor :

JPA에서 필수, 빈 객체를 생성하는 기본 생성자를 자동 생성

예) 어노테이션을 안썼을 때 수동으로 작성한 코드

public class Movie {
    private String title;
    private String genre;

    // 기본 생성자
    public Movie() {
        // 빈 생성자
    }
}

- @AllArgsConstructor :

Lombok 어노테이션으로, 모든 필드를 인자로 받는 생성자를 자동으로 생성해줍니다.

예) 어노테이션을 안썼을 때 수동으로 작성한 코드

public class Movie {
    private String title;
    private String genre;

    // 전체 매개변수 생성자
    public Movie(String title, String genre) {
        this.title = title;
        this.genre = genre;
    }
}

- @Table(name = "movie") :

DB의 테이블 이름이 클래스 이름과 다를 경우 매핑할 테이블의 이름을 지정


- @Id :

필드를 기본 키로 지정합니다. 이 어노테이션을 통해 JPA가 해당 필드를 기본 키로 인식합니다.


- @GeneratedValue :

기본 키 값을 자동으로 생성할 수 있도록 하는 어노테이션입니다.
strategy = GenerationType.IDENTITY는 데이터베이스에서 기본 키 값을 자동으로 증가시키는 방식입니다.


- @Column :

이 어노테이션은 JPA 엔티티의 필드를 데이터베이스의 열(Column)과 매핑하는 데 사용됩니다.

세부적으로 제어하는 법 :

1. name

  • 데이터베이스의 열 이름을 지정합니다.
  • 필드명과 테이블의 열 이름이 다를 때 사용합니다.
  • 기본값: 필드명과 동일
// endDate 필드는 테이블에서 end_date 열과 매핑됩니다.
@Column(name = "end_date")
private LocalDate endDate;

2. nullable

  • true이면 해당 열에 NULL 값 허용.
  • false이면 NOT NULL 제약 조건 추가.
  • 기본값: true
@Column(nullable = false)
private String title; // NULL 불가

3. unique

  • 열에 고유 제약 조건을 추가합니다.
  • 기본값: false
@Column(unique = true)
private String email; // 중복 불가

4. length

  • 열의 최대 문자열 길이를 설정합니다. (VARCHAR 열에만 적용)
  • 기본값: 255
@Column(length = 50)
private String content; // 최대 길이 50

5. insertable

  • 해당 필드가 INSERT 시 포함될지 여부를 지정합니다.
  • 기본값: true
@Column(insertable = false)
private String readonlyField; // INSERT 시 제외

6. updatable

  • 해당 필드가 UPDATE 시 포함될지 여부를 지정합니다.
  • 기본값: true
@Column(updatable = false)
private LocalDateTime createdAt; // 수정 불가

Review 객체

package entity;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;

import java.time.LocalDateTime;

@Entity 
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "review")
public class Review {

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

    // 영화와의 관계
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "movie_id", nullable = false) 
    private Movie movie; 

    // 평점
    @Column(nullable = false)
    private Double rating;

    // 리뷰 내용
    @Column(nullable = false, length = 1000)
    private String content;

    // 등록 일자
    @CreationTimestamp 
    @Column(name = "created_at", nullable = false, updatable = false)
    private LocalDateTime createdAt;

}

Review 객체에 사용된 어노테이션

!! 겹치는 부분은 생략했습니다. !!

- @ManyToOne :

다대일 관계를 설정합니다. Review 엔티티가 여러 개의 Movie 엔티티와 관계를 맺을 수 있게 설정합니다. 이는 영화와 리뷰 간의 관계를 나타냅니다.

구체적 의미:

  • ManyToOne :
    Review 객체 여러 개가 하나의 Movie 객체를 참조 가능.
  • fetch = FetchType.LAZY :
    Movie 데이터를 필요로 할 때만 데이터베이스에서 조회합니다. 성능 최적화를 위해 사용됩니다.
@ManyToOne(fetch = FetchType.LAZY)
private Movie movie;

- @JoinColumn :

외래 키(Foreign Key)를 지정하는 어노테이션입니다. movie_id가 Movie 테이블의 기본 키를 참조하도록 설정합니다.

구체적 의미:

  • name = "movie_id" :
    Review 테이블에서 생성될 열 이름이 movie_id임을 지정합니다.
  • nullable = false :
    Review 객체 생성 시 반드시 참조하는 Movie가 있어야 합니다.
@JoinColumn(name = "movie_id", nullable = false)
private Movie movie;

- @CreationTimestamp :

Hibernate에서 제공하는 어노테이션으로, 엔티티가 처음 생성될 때 필드에 자동으로 현재 시간(타임스탬프)을 설정합니다.

  • Hibernate란?
    자바 객체와 관계형 데이터베이스(RDBMS) 간의 매핑을 처리하는 ORM(Object-Relational Mapping) 라이브러리

제가 공부한 내용만 정리한 것이기에 모든 어노테이션을 정리한 것이 아닙니다!
없는 부분은 더 찾아서 공부하는 것을 추천드려요.

profile
BE 개발자

0개의 댓글