SpringBoot/JPA

JPA 어노테이션

NellKiM 2025. 2. 6. 15:34
1. 엔티티 매핑 관련
어노테이션설명
@Entity 클래스가 JPA 엔티티임을 나타냅니다.
@Table(name = "table_name") 엔티티와 매핑되는 테이블 이름을 지정합니다.
@Id 기본 키 필드를 지정합니다.
@GeneratedValue(strategy = GenerationType.IDENTITY) 기본 키 값을 자동 생성합니다.
@Column(name = "column_name") 특정 필드를 테이블 컬럼과 매핑합니다.
@Transient 데이터베이스에 저장하지 않는 필드를 선언합니다.
@Embedded 값 타입 객체를 포함시킬 때 사용합니다.

예시 코드

package com.example.demo.hr;

import java.sql.Date;
import java.util.List;

import org.hibernate.annotations.BatchSize;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.annotation.Generated;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString(exclude={"job","manager","dept"})
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name="tbl_employees")
public class EmpEntity {

	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	Long employee_id;
	
	String first_name;
	String last_name;
	String email;
	String phone_number;
	Date hire_date;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="job_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	JobEntity job;
	
	Long salary;
	Double commission_pct;
	//fetch는 조회연관,cascade는 DML 연관 (나의 ENTITY 변화가 연관관계 ENTITY 영향)
	@ManyToOne
	@JoinColumn(name="manager_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	EmpEntity manager;
	
	
	@ManyToOne(cascade =CascadeType.ALL ,
			fetch=FetchType.LAZY)
	@JoinColumn(name="department_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	DeptEntity dept;
	


}
 

2. 연관 관계 매핑

어노테이션설명
@OneToOne 1:1 관계를 매핑합니다.
@OneToMany 1:N 관계를 매핑합니다.
@ManyToOne N:1 관계를 매핑합니다.
@ManyToMany N:M 관계를 매핑합니다.
@JoinColumn(name = "fk_name") 외래 키 컬럼을 지정합니다.
@JoinTable 다대다 관계에서 조인 테이블을 지정합니다.
@Cascade (Hibernate) 연관된 엔티티에 대한 연산을 전파합니다.

 

3. 데이터 로딩 방식 (FetchType)

어노테이션설명
fetch = FetchType.LAZY 지연 로딩
fetch = FetchType.EAGER 즉시 로딩

4. 상속 매핑

어노테이션설명
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 단일 테이블 전략
@DiscriminatorColumn(name = "type") 상속된 엔티티 타입 구분 컬럼 지정

5. 기타 유용한 어노테이션

어노테이션설명
@Enumerated(EnumType.STRING) Enum 타입 필드를 문자열로 저장
@Temporal(TemporalType.DATE) 날짜 및 시간 매핑
@Lob 대용량 데이터 매핑
@PrePersist, @PostLoad 엔티티 생명주기 이벤트 처리

6. 생명주기 이벤트 콜백

어노테이션설명
@PrePersist 엔티티가 저장되기 전에 호출
@PostPersist 엔티티가 저장된 후 호출
@PreUpdate 업데이트 전에 호출
@PostUpdate 업데이트 후 호출
@PreRemove 삭제 전에 호출
@PostRemove 삭제 후 호출
@PostLoad 엔티티 조회 후 호출