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 |