@Entity
클래스 레벨에 @Entity 애너테이션을 붙이면 JPA 관리 대상 엔티티가 된다 -> 데이터베이스의 테이블이 된다는 뜻
애트리뷰트
name
- 엔티티 이름을 설정할 수 있음
- name 애트리뷰트를 설정하지 않으면 기본값으로 클래스 이름을 엔티티 이름으로 사용한다
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity(name = "USERS") // 엔티티명을 USERS로 설정
@Table(name = "USERS") // 테이블명을 USERS로 설정
public class Member {
@Id
private Long memberId;
}
@Table
테이블의 이름을 설정할 때 사용
애트리뷰트
name
- 테이블 이름을 설정한다
- name 애트리뷰트를 설정하지 않으면 기본값으로 클래스 이름을 테이블 이름으로 사용
- @Table 애너테이션은 옵션이며, 추가하지 않을 경우 클래스 이름을 테이블 이름으로 사용함
- 테이블 이름이 클래스 이름과 달라야 할 경우에 추가
주의 사항
- @table은 옵션이지만 @Entity와 @Id는 필수!
- 파라미터가 없는 기본 생성자는 필수로 추가를 권장 -> Spring Data JPA 기술을 적용할 때 기본 생성자가 없는 경우 에러가 발생할 수 있음
- 중복되는 엔티티 클래스가 없고 테이블 이름이 클래스 이름과 같을 경우 @Entity와 @Table의 name 애트리뷰트를 지정하지 않고, 클래스 이름으로 사용하는 게 권장된다
@Id
기본키를 설정한다
JPA에서는 기본적으로 @Id 애너테이션을 추가한 필드가 기본 키 컬럼이 된다
Id값을 할당하는 방법
기본키 직접 할당 : 애플리케이션 코드에서 기본키를 직접 세팅해주는 방식
기본키 자동 생성 @GeneratedValue
- IDENTITY : 기본키 생성을 데이터베이스에 위임
- SEQUENCE : 데이터베이스에서 제공하는 시퀀스를 사용해서 기본키를 생성
- TABLE : 별도의 키 생성 테이블을 사용
- AUTO : JPA가 데이터베이스의 Dialect에 따라서 적절한 전략을 자동으로 선택
// 기본키 직접 할당 -> 코드상에서 생성자 혹은 세터 등으로 직접 설정해야함
@Id
private Long memberId;
// IDENTITY
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
// SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long memberId;
// AUTO
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long memberId;
@Column
필드와 컬럼을 매핑해주는 애너테이션
@Column 정보를 명시적으로 모두 지정하는 것은 번거롭긴 하지만 다른 누군가가 엔티티 클래스 코드를 확인하더라도 테이블 설계가 어떤 식으로 되어 있는지 한눈에 알 수 있다는 장점이 있음
@Column 애너테이션 없이 필드만 정의되어있다면 JPA는 기본적으로 이 필드가 테이블의 컬럼과 매핑되는 필드라고 간주한다
그리고 @Column 애너테이션의 애트리뷰트 값은 디폴트 값으로 적용된다
애트리뷰트
nullable
- 컬럼의 null 값을 허용할지 여부 설정
- 기본값 : true
updatable
- 컬럼 데이터를 수정할 수 있는지 여부 설정
- 기본값 : true
unique
- 하나의 컬럼에 중복값 여부 설정 (true의 경우 중복 불가)
- 기본값 : false
length
- 컬럼에 저장할 수 있는 문자 길이를 지정
- 기본값 : 255
name
- 엔티티 클래스 필드명과 다른 이름으로 컬럼을 생성할 때 사용
- 기본값 : 필드명
예시
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import java.time.LocalDateTime;
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long memberId;
@Column(nullable = false, updatable = false, unique = true)
private String email;
@Column(length = 100, nullable = false)
private String name;
@Column(length = 13, nullable = false, unique = true)
private String phone;
@Column(nullable = false)
private LocalDateTime createdAt = LocalDateTime.now();
@Column(nullable = false, name = "LAST_MODIFIED_AT")
private LocalDateTime modifiedAt = LocalDateTime.now();
public Member(String email) {
this.email = email;
}
public Member(String email, String name, String phone) {
this.email = email;
this.name = name;
this.phone = phone;
}
}
주의 사항
int와 long 같은 자바의 원시 타입이라면 null 값을 입력할 수 없으므로,
@Column(nullable=false)를 설정하여 에러를 미연에 방지하자
@Enumerated
enum 타입과 매핑할 때 사용하는 애너테이션
애트리뷰트
EnumType.ORDINAL
- enum의 순서를 나타내는 숫자를 테이블에 저장한다
EnumType.STRING
- enum의 이름을 테이블에 저장한다
예시
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long orderId;
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus = OrderStatus.ORDER_REQUEST;
public enum OrderStatus {
ORDER_REQUEST(1, "주문 요청"),
ORDER_CONFIRM(2, "주문 확정"),
ORDER_COMPLETE(3, "주문 완료"),
ORDER_CANCEL(4, "주문 취소");
@Getter
private int stepNumber;
@Getter
private String stepDescription;
OrderStatus(int stepNumber, String stepDescription) {
this.stepNumber = stepNumber;
this.stepDescription = stepDescription;
}
}
}
주의 사항
EnumType.ORDINAL을 사용할 경우, enum 순서 번호가 바뀌지 않도록 주의하여 사용해야 함
특별한 이유가 없다면 EnumType.STRING을 사용하는 게 속편 하다
@Transient
필드에 추가하면 해당 필드를 테이블 컬럼과 매핑하지 않는다
데이터베이스에 저장하지 않으며, 조회할 때 역시 매핑되지 않는다
주로 임시 데이터를 메모리에서 사용하기 위한 용도로 사용한다
@Temporal
java.util.Date, java.util.Calendar 타입으로 매핑할 때 사용
LocalDate, LocalDateTime 타입일 경우, 컬럼의 TIMESTAMP타입과 매핑되므로 생략 가능
- @Column 애너테이션의 애트리뷰트
- 식별자
'개발일지 > Spring' 카테고리의 다른 글
Spring boot - Profile 설정 (0) | 2022.11.15 |
---|---|
Spring JPA 연관 관계 매핑 (0) | 2022.11.05 |
JPA (Java Persistence API) (0) | 2022.11.04 |
Spring - Pagination (0) | 2022.10.31 |
Spring - AOP (0) | 2022.10.23 |