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 엔티티 조회 후 호출

'SpringBoot > JPA' 카테고리의 다른 글

JPA EAGER / LAZY  (0) 2025.02.06
JPQL  (0) 2025.02.03

JPA에서 EAGER와 LAZY는 엔티티 연관 관계를 조회할 때 데이터 로딩 방식을 지정하는 FetchType 옵션이다.

1. EAGER (즉시 로딩)

  • 연관된 엔티티를 즉시 조회합니다.
  • 부모 엔티티를 조회할 때 연관된 자식 엔티티도 즉시 함께 가져옵니다.

특징

  • N+1 문제가 발생할 수 있음
  • 즉시 로딩이므로 불필요한 데이터가 로드될 가능성 있음
  • 연관 데이터가 반드시 필요한 경우 적합

코드 예시

@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="job_id")//생성시 칼럼 이름은 //외래키 만드는 구문
	JobEntity job;

 

2. LAZY (지연 로딩)

  • 연관된 엔티티를 실제로 접근하는 시점에 조회합니다.
  • Proxy 객체를 통해 데이터를 필요할 때만 로딩합니다.

특징

  • N+1 문제를 예방할 수 있음 (JPQL 또는 Fetch Join으로 최적화 가능)
  • 필요할 때만 데이터를 로드하여 메모리와 성능 최적화
  • 연관 데이터가 필수적이지 않을 경우 적합

코드 예시

@Entity public class Parent { @OneToMany(fetch = FetchType.LAZY) private List<Child> children; }

EAGER vs LAZY 요약

특징EAGER LAZY

로딩 시점 즉시 지연
성능 이슈 N+1 문제 위험 최적화 가능
사용 사례 데이터 필수 데이터 선택적

권장 사항

  • 기본적으로 FetchType.LAZY를 사용하는 것이 좋다
  • 필요한 경우에만 JPQL의 fetch join이나 @EntityGraph를 통해 최적화 하는것이 좋다

'SpringBoot > JPA' 카테고리의 다른 글

JPA 어노테이션  (0) 2025.02.06
JPQL  (0) 2025.02.03

JPQL (Java Persistence Query Language)**는 **JPA (Java Persistence API)에서 사용되는 쿼리 언어 객체 지향 프로그래밍 환경에서 데이터베이스에 접근하기 위해 사용되며, SQL과 유사하지만 엔티티(Entity)와 필드를 대상으로 쿼리를 작성하는 것이 특징

JPQL 특징

  • 객체 중심 쿼리 언어: JPQL은 SQL처럼 테이블과 컬럼을 대상으로 하지 않고 엔티티와 필드를 대상으로 쿼리
  • 데이터베이스 독립적: 특정 DBMS에 종속되지 않음
  • 표준 JPA 쿼리 방식: JPA가 지원하는 모든 데이터베이스에서 사용 가능

JPQL 예제

기본 JPQL

java
복사편집
// 모든 고객 정보 조회 String jpql = "SELECT c FROM CustomerEntity c"; TypedQuery<CustomerEntity> query = entityManager.createQuery(jpql, CustomerEntity.class); List<CustomerEntity> customers = query.getResultList();

위 쿼리에서:

  • CustomerEntity는 JPA 엔티티 클래스
  • c는 엔티티의 별칭(alias)
  • SELECT c는 CustomerEntity 객체를 가져옴

조건절 추가

java
복사편집
String jpql = "SELECT c FROM CustomerEntity c WHERE c.name = :name"; TypedQuery<CustomerEntity> query = entityManager.createQuery(jpql, CustomerEntity.class); query.setParameter("name", "Alice"); CustomerEntity customer = query.getSingleResult();

JPQL과 SQL 비교

특징JPQLSQL

대상 엔티티 테이블
필드 참조 엔티티 필드 컬럼 이름
표준화 JPA 표준 DB 종속적
사용 목적 객체 데이터 관리 DB 데이터 관리

JPQL 장점

  1. 데이터베이스 독립성: 데이터베이스 변경에 영향을 덜 받음
  2. 객체 지향 쿼리: 엔티티 객체를 기반으로 쿼리 작성
  3. 코드 가독성: 엔티티 기반으로 이해하기 쉬운 쿼리 작성

정리

JPQL은 JPA의 핵심 기능 중 하나로, 객체 지향 프로그래밍과 관계형 데이터베이스 사이의 간극을 줄여줍니다. SQL과 비슷한 구문을 사용하면서도 객체를 직접 다룰 수 있다는 점에서 효율적입니다. JPA 기반 프로젝트에서는 필수적으로 알아야 하는 기술입니다.

'SpringBoot > JPA' 카테고리의 다른 글

JPA 어노테이션  (0) 2025.02.06
JPA EAGER / LAZY  (0) 2025.02.06

+ Recent posts