BE/Spring & Spring Boot

[Spring Boot, JPA] 관련 어노테이션

baek-dev 2025. 1. 1. 13:47

1. 엔티티(Entity)관련 어노테이션

@Entity

  • 이 클래스가 JPA에서 관리되는 엔티티임을 선언
  • 데이터베이스 테이블에 매핑된다

주의사항 : 

  • 반드시 기본 생성자 (public or protected)가 필요하다
  • @Entity가 붙은 클래스는 final일 수 없다
@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
}

 

@Table

  • 엔티티 클래스와 매핑될 데이터베이스 테이블을 지정한다
  • 기본적으로는 클래스 이름을 테이블 이름으로 사용하지만, 커스텀 이름을 지정할 때 사용한다

속성 :

  • name : 매핑할 테이블 이름
  • schema : 스키마 이름
  • catalog : 카탈로그 이름
  • uniqueConstraints : 고유 제약 조건 설정
@Entity
@Table(name = "users", schema = "public")
public class User { }

 

@Id

  • 엔티티의 기본 키(Primary Key)를 지정한다
@Id
private Long id;

 

@GeneratedValue

  • 기본 키의 값을 자동으로 생성하도록 설정한다

속성 :

  • strategy : 키 생성 전략 (기본값은 AUTO)
    • AUTO : JPA구현체가 자동 선택
    • IDENTITY : 데이터베이스에서 기본키 생성
    • SEQUENCE : 데이터베이스 시퀀스를 사용
    • TABLE : 별도의 테이블에서 키 생성
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

@Column

  • 데이터베이스 테이블의 열과 매핑될 필드를 지정한다

속성 :

  • name : 매핑할 열 이름
  • nullable : null 허용 여부
  • length : 문자열 열의 최대 길이
  • unique : 고유값 여부
@Column(name = "username", nullable = false, length = 50)
private String username;

 

@Transient

  • 해당 필드는 데이터베이스와 매핑되지 않도록 설정
  • JPA가 관리하지 않는 비영속 필드로 설정
@Transient
private String tempValue;

 

@Enumerated

  • 열거형(enum) 타입을 데이터베이스에 매핑한다

속성 : 

  • EnumType.STRING : 열거형 값을 문자열로 저장
  • EnumType.ORDINAL : 열거형 값을 숫자로 저장
@Enumerated(EnumType.STRING)
private Role role;

 

@Lob

  • 대용량 데이터를 지정할 때 사용
    • 문자열(String) : CLOB 형식
    • 바이트 배열(byte[]) : BLOB 형식
@Lob
private String description;

 

@Temporal

  • 날짜/시간 필드를 매핑할 때 사용
  • java.util.Date와 매핑될 때만 사용, java.time 패키지는 사용하지 않는다

속성 :

  • TemporalType.DATE : 날짜만 저장
  • TemporalType.TIME : 시간만 저장
  • TemporalType.TIMESTAMP : 날짜와 시간 저장
@Temporal(TemporalType.DATE)
private Date createdDate;

 

@Embedded

  • 다른 클래스의 필드를 포함하여 중첩된 객체로 매핑할 때 사용함
@Embedded
private Address address;

 

@Embeddable

  • @Embedded에서 사용될 클래스를 정의
@Embeddable
public class Address {
    private String street;
    private String city;
}

2. 관계(Relationship) 매핑 관련 어노테이션

@OneToOne

  • 두 엔티티 간의 1:1 관계를 매핑

속성 :

  • mappedBy : 관계의 주인 설정
  • cascade : 상태 전이 설정
  • fetch : 로딩 전략 설정 (EAGER or LAZY)
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "profile_id")
private Profile profile;

 

@ManyToOne

  • 다대일(N:1) 관계를 매핑
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;

 

@OneToMany

  • 일대다(1:N) 관계를 매핑

속성 : 

  • mappedBy : 관계의 주인 설정
  • cascade : 상태 전이 설정
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Order> orders;

 

@ManyToMany

  • 다대다(N:N) 관계를 매핑
@ManyToMany
@JoinTable(name = "user_roles",
    joinColumns = @JoinColumn(name = "user_id"),
    inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;

 

@JoinColumn

  • 외래키 열을 명시적으로 지정할 때 사용

속성 :

  • name : 외래키 열 이름
  • referencedColumnName : 참조할 대상 열 이름
@JoinColumn(name = "profile_id", referencedColumnName = "id")
private Profile profile;

 

@JoinTable

  • 다대다 관계를 위한 중간 테이블을 매핑한다
@ManyToMany
@JoinTable(
    name = "user_roles",
    joinColumns = @JoinColumn(name = "user_id"),
    inverseJoinColumns = @JoinColumn(name = "role_id")
)
private List<Role> roles;

3. 고급 매핑 관련 어노테이션

@Inheritance

  • 엔티티 상속 전략을 정의한다

속성 :

  • strategy : 상속 전략
    • SINGLE_TABLE : 단일 테이블 전략
    • JOINED : 조인 전략
    • TABLE_PER_CLASS : 클래스별 테이블 전략
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class BaseEntity { }

 

@MappedSuperclass

  • 공통 필드를 열 엔티티에서 공유할 때 사용
  • 이 클래스를 상속하는 엔티티는 @Entity가 필요함
@MappedSuperclass
public abstract class BaseEntity {
    @Id
    @GeneratedValue
    private Long id;
    private LocalDateTime createdAt;
}

 

@DiscriminatorColumn

  • 상속 매핑에서 자식 클래스 구분 컬럼을 정의
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)

 

@DiscriminatorValue

  • 엔티티 구분값을 지정
@DiscriminatorValue("USER")
public class User extends BaseEntity { }

4. 트랜잭션 및 영속성 컨텍스트 관련 어노테이션

@Transactional

  • 트랜잭션 범위를 정의
  • 클래스 또는 메서드 단위로 선언 가능

속성 : 

  • readOnly : 읽기 전용 트랜잭션 설정
  • rollbackFor : 특정 예외 발생 시 롤백할 예외 설정
@Transactional(readOnly = true)
public List<User> getUsers() { }

 

@Version

  • 낙관적 락(Optimistic Locking) 을 위한 버전 필드를 지정
@Version
private Integer version;

 

@Cacheable / @CacheEvict / @CachePut

  • 엔티티 캐시를 설정 및 관리

 

 

 

 

출처 : ChatGPT

'BE > Spring & Spring Boot' 카테고리의 다른 글

[Spring Boot] AOP  (0) 2025.01.05
[Spring Boot] DTO  (0) 2025.01.04
[Spring Boot] 관련 어노테이션  (0) 2025.01.01
[Spring Boot] Validation 유효성 검사  (0) 2024.12.30
[Spring Boot] Thymeleaf 타임리프  (0) 2024.12.29