@Entity
- JPA에서 사용할 Entity를 지정.
- @Entity 어노데이션을 달면 JPA의 영속성 컨택스트에서 관리될 수 있다.
- 속성: name > JPA에서 사용할 앤티티의 이름을 지정.
> 아무 이름도 지정하지 않으면 클래스 이름을 사용.
- JPA는 앤티티를 생성할 때 기본 생성자(Default Constructor)를 사용.
@Table
- 데이터베이스의 어떤 테이블과 매핑시킬지 지정
- 속성: name > 앤티티와 매핑할 테이블 이름을 지정
> 아무 이름도 지정하지 않으면 클래스 이름을 사용.
Auto DDL
- 자동으로 DDL 쿼리를 생성하고 실행하는 기능
- Auto DDL 옵션
* create: 기존 테이블을 삭제하고 새로 테이블을 생성(DROP + CREATE)
* create-drop: 어플리케이션 종료 시 생성한 DDL을 제거(DROP + CREATE + DROP)
* update: 테이블, 엔티티 매핑정보를 비교하여 변경사항을 수정
* validate: 테이블 엔티티 매핑정보를 비교하여 차이가 있으면 경고를 남기고 어플리케이션을 실행하지 않음
* none: 테이블 자동 생성 기능을 사용하지 않음
>> create, create-drop, update는 개발환경에서 많이 사용
>> validate, none은 운영환경에서 많이 사용
spring:
jpa:
:generate-ddl: true
properties:
hibernate:
hbm2ddl:
auto: create-drop
@Column
- @Table에서 명시한 RDB의 테이블과 매핑할 column을 지정
- 속성: name > column의 이름을 명시, 지정하지 않으면 필드명을 사용.
- 필드명이 camelcase이면 under score로 변경해
- 필드에 @Column을 지정해주지 않아도 필드명으로 테이블에 column이 만들어진다.
- 옵션: 테이블 생성 시 각 column의 조건들을 명시
* nullable: null 허용 여부. 기본값 true
* length: 필드 type이 String일 경우 varchar에 매핑. 길이 지정. 지정하지 않을 시 기본 길이는 255
* unique: 해당 컬럼의 unique 제약조건을 추가
* insertable: 엔티티 저장시 필드도 같이 저장. false이면 읽기 전용으로 사용. 기본값 true
* updatable: 엔티티 수정시 필드도 같이 수정. false이면 읽기 전용으로 사용. 기본값 true
- DDL 옵션을 사용하지 않더라도 이해를 돕기 위해 @Column 옵션 표기를 권장.
>> 앤티티만 보고도 RDB 테이블의 구조를 파악할 수 있기 때
@Entity
@Table(name="member")
public class Member{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(name = "name", nullable = false, length = 30)
private String name;
@Column(nullable = false, length = 30, unique = true)
private String nickName; //nick_name
private int age; //age
@Column(name = "address", nullable = false)
private String address; // address VARCHAR(255)
@Column(name = "description", nullable = true)
private String description;
}
기본키 매핑전략
@Id
- 테이블에서 사용되는 주키(PK: Privmary Key)
- 영속성 컨택스트에서 1차 캐시에 사용되는 key값과도 동일. value로는 entity.
직접 할당
- 영속화 전에 애플리케이션에서 직접 값을 할당
@Id
@Column(name = "id")
private Long id;
SEQUENCE
- 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속화
- ORACLE, H2
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
TABLE
- 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속화
IDENTITY
- 데이터에이스 엔티티를 저장해서 식별자 값을 획득한 후 영속화
- DB에서 식별자 값을 얻어오기 때문에 엔티티를 저장한 후 식별자 값을 얻음.
- 엔티티가 영속화되려면 식별자 값이 반드시 필요하기 때문에, em.persist() 시점에 INSERT 쿼리가 수행
- MySQL의 AUTO_INCREMENT
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
AUTO
- 데이터베이스 방언(dialect)에 따라 자동으로 전략을 선택
- MySQL은 AUTO_INCREMENT, Oracle이나 H2는 SEQUENCE
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Id
@GeneratedValue
private Long id;
기타 컬럼매핑
- columnDefinition = TIMESTAMP: LocalDateTime을 TIMESTAMP로 저장하고 싶을 때 사용
- @Enumerated(EnumType.STRING) : Enum 타입에 매핑
- @Lob: varchar타입의 아주 긴 text를 넣고 싶을 때 사용. LongText 타입이 생성됨.
@Entity
@Table(name = "orders")
public class Order{
@Id
@Column(name = "id")
private String uuid;
@Column(name = "order_datetime", columnDefinition = "TIMESTAMP")
private LocalDateTime orderDatetime;
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus;
@Lob
private String memo;
}
'Spring' 카테고리의 다른 글
Spring Data JPA: 고급 매핑 (0) | 2023.03.22 |
---|---|
Spring Data JPA: 연관관계매핑 (0) | 2023.03.19 |
Spring data JPA: 영속성 컨택스트(Persistence Context) (0) | 2023.03.17 |
Application Context (0) | 2023.03.14 |
Spring MVC (0) | 2023.03.14 |