
본 글은 객체를 생성하면서 어노테이션을 사용함으로써 코드를 편리하게 짜는 것이 좋아 보여 객체를 생성할 때 주로 사용하는 어노테이션의 대한 공부 내용을 정리하였습니다
영화 리뷰 웹을 개발 할 때를 예시로 설명을 하겠습니다.
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 객체에 사용된 어노테이션
동일한 이름의 테이블과 매핑 시켜주는 어노테이션
Lombok 어노테이션으로, getter 메서드를 자동으로 생성
Lombok 어노테이션으로, setter 메서드를 자동으로 생성
JPA에서 필수, 빈 객체를 생성하는 기본 생성자를 자동 생성
예) 어노테이션을 안썼을 때 수동으로 작성한 코드
public class Movie {
private String title;
private String genre;
// 기본 생성자
public Movie() {
// 빈 생성자
}
}
Lombok 어노테이션으로, 모든 필드를 인자로 받는 생성자를 자동으로 생성해줍니다.
예) 어노테이션을 안썼을 때 수동으로 작성한 코드
public class Movie {
private String title;
private String genre;
// 전체 매개변수 생성자
public Movie(String title, String genre) {
this.title = title;
this.genre = genre;
}
}
DB의 테이블 이름이 클래스 이름과 다를 경우 매핑할 테이블의 이름을 지정
필드를 기본 키로 지정합니다. 이 어노테이션을 통해 JPA가 해당 필드를 기본 키로 인식합니다.
기본 키 값을 자동으로 생성할 수 있도록 하는 어노테이션입니다.
strategy = GenerationType.IDENTITY는 데이터베이스에서 기본 키 값을 자동으로 증가시키는 방식입니다.
이 어노테이션은 JPA 엔티티의 필드를 데이터베이스의 열(Column)과 매핑하는 데 사용됩니다.
세부적으로 제어하는 법 :
// endDate 필드는 테이블에서 end_date 열과 매핑됩니다.
@Column(name = "end_date")
private LocalDate endDate;
@Column(nullable = false)
private String title; // NULL 불가
@Column(unique = true)
private String email; // 중복 불가
@Column(length = 50)
private String content; // 최대 길이 50
@Column(insertable = false)
private String readonlyField; // INSERT 시 제외
@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 객체에 사용된 어노테이션
!! 겹치는 부분은 생략했습니다. !!
다대일 관계를 설정합니다. Review 엔티티가 여러 개의 Movie 엔티티와 관계를 맺을 수 있게 설정합니다. 이는 영화와 리뷰 간의 관계를 나타냅니다.
구체적 의미:
@ManyToOne(fetch = FetchType.LAZY)
private Movie movie;
외래 키(Foreign Key)를 지정하는 어노테이션입니다. movie_id가 Movie 테이블의 기본 키를 참조하도록 설정합니다.
구체적 의미:
@JoinColumn(name = "movie_id", nullable = false)
private Movie movie;
Hibernate에서 제공하는 어노테이션으로, 엔티티가 처음 생성될 때 필드에 자동으로 현재 시간(타임스탬프)을 설정합니다.
제가 공부한 내용만 정리한 것이기에 모든 어노테이션을 정리한 것이 아닙니다!
없는 부분은 더 찾아서 공부하는 것을 추천드려요.