1. 엔티티란?
간단하게 설명해서 DB의 테이블을 객체 형태로 사용할 수 있도록 만들어 주는 클래스
2. 클래스 예시
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity //jpa가 처음 로딩될때 사용되는 클래스라는 것을 인식한다.
@Table(name = "USER") //만약 테이블이름과 객체명이 다를때 이런식으로 테이블을 지정해서 값을 넣어줄 수 있다.
public class Member {
@Id //primary key을 인식하는 어노테이션
private Long id;
@Column(name = "user_name") //마찬가지로 컬럼명과 변수명이 다를 경우에도 값을 지정해서 넣어줄 수 있다. nullable은 null관련설정 false는 notnull
private String userName;
private Integer age;
}
3. @어노테이션
3.1 @Entity
- 해당 클래스를 엔티티로 선언하게 만들어주는 어노테이션. 엔티티를 사용한다면 필수적으로 들어가야하는 어노테이션이다.
- 기본적으로 @Entity를 선언해준 클래스의 이름과 테이블의 이름이 매핑된다.
- 테이블 이름이 food_category일때 클래스 이름을 FoodCategory로 매핑시킬 수 있다.(스네이크 <-> 카멜)
3.2 @Table(name = "USER")
- 클래스 명으로 매핑되는 것이 아니라 직접 테이블명을 입력해서 매핑시킬수도 있다.
3.3 @Id
- 해당 테이블의 PK로 매핑시킨다. 거의 필수적으로 들어가야 하는 어노테이션이다.
3.4 @GeneratedValue
- PK의 생성 규칙을 결정하는 어노테이션이다. 각 DB(ex. Oracle, Mysql)별로 적용되는 전략이 다르다.
- IDENTITY : 기본키 생성을 데이터베이스에 위임하는 방법이다.(Mysql)
Auto_Increment - SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용해서 기본키를 할당하는 방법이다.(Oracle)
@SequenceGenerator 필요 - TABLE : 키 생성용 테이블 만들고 이름과 값으로 사용할 컬럼을 하나 만드는 방법이다.
@TableGenerator 필요 - AUTO : 데이터베이스에 따라서 위의 3가지 방법중 하나를 자동으로 선택해서 할당해주는 방법이다.
- IDENTITY : 기본키 생성을 데이터베이스에 위임하는 방법이다.(Mysql)
- @Id와 같이 사용한다. 그냥 사용할때 둘다 같이 사용해주면 된다.
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
3.5 @Column
- 만약 컬럼을 선언하지 않으면 클래스 내의 변수의 이름이 테이블의 컬럼으로 적용이 된다.(스네이크 <-> 카멜)
- 컬럼을 선언한다면 기본값 이외에 추가적인 옵션이 있을때 사용한다.
- name : 맵핑할 테이블의 컬럼 이름을 지정
- insertable : 엔티티 저장시 선언된 필드도 같이 저장
- updateable : 엔티티 수정시 이 필드를 함께 수정
- table : 지정한 필드를 다른 테이블에 맵핑
- nullable : NULL을 허용할지, 허용하지 않을지 결정
- DB컬럼에 null허용으로 되어있으면 엔티티에서 nullable = false로 되어있어도 적용이 안된다.
- unique : 제약조건을 걸 때 사용
- columnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용
- length : varchar의 길이를 조정합니다. 기본값으로 255가 입력
- precsion, scale : BigInteger, BigDecimal 타입에서 사용, 각각 소수점 포함 자리수, 소수의 자리수를 의미
3.6 @Enumarated
- 쉽게 생각하면 enum타입을 컬럼에 저장하는 용으로 사용된다.
- 2가지 속성으로 나누어서 사용할 수 있다.
- @Enumerated(EnumType.STRING) : enum이름을 DB에 저장하는 방법
- @Enumerated(EnumType.ORDINAL) : enum순서를 DB에 저장하는 방법
- 사실상 Ordinal은 사용하지 않는것이 좋은데 순서를 저장하기 때문에 사용하기도 어렵고 바뀌면 저장된 enum에게 영향을 줄 수 있다.
@Enumerated(EnumType.STRING)
private Category foodType;
3.7 @Temporal
- 날짜 타입을 매핑할 때 사용되는 어노테이션이다.
@Temporal(TemporalType.DATE) // 날짜
private Date date;
@Temporal(TemporalType.TIME) // 시간
private Date time;
@Temporal(TemporalType.TIMESTAMP) // 날짜와 시간
private Date timestamp;
- 최근에는 Date와 Calendar보다는 다음과 같이 LocalDateTime이나 LocalDate를 사용하는게 사용하기도 좋고 정신건강에 좋다.
private LocalDate localDate; // MySQL DATE 타입
private LocalDateTime localDateTime; // MySQL DATETIME 타입
3.8 @Lob
- 데이터베이스의 BLOB, CLOB타입과 매핑한다.
- 쉽게 생각해서 문자열의 길이가 매우 길때 사용하면 된다.(이미지 주소 등)
@Lob
private String imageAddress;
3.9 @Transient
- 엔티티에 매핑하더라도 데이터베이스에 값이 저장되지 않는다.
- 메모리에서 임시로 보관해야할 값이 생기면 사용한다.(사실 사용할 필요가 있는지 잘 모르겠음)