@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 애트리뷰트를 지정하지 않고, 클래스 이름으로 사용하는 게 권장된다
@Table과 @Entity 차이점 - 인프런 | 질문 & 답변
Order 객체를 매핑할때, db에서 테이블명을 orders로 설정하고 싶어 @Table(name='orders')로 하는 것을 보았습니다. 이말은 실제 클래스명과 다르게 테이블명을 바꾼다 로 알수 있는데 @Entity(name ='orders')
www.inflearn.com
@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 애너테이션의 애트리뷰트
Java(TM) EE 7 Specification APIs
docs.oracle.com
- 식별자
Hibernate ORM 5.6.14.Final User Guide
Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat
docs.jboss.org
'개발일지 > 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 |