@Entity
- @Entity가 분은 클래스는 JPA가 관리, 엔티티라고 합니다.
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수입니다.
주의할 점!
- 엔티티 클래스에는 기본 생성자가 필수입니다. (파라미터가 없는 public 또는 protected 생성자)
- final 클래스, enum, interface, inner 클래스에는 @Entity 어노테이션 사용이 불가능합니다.
- 저장할 필드에 final 키워드 사용이 불가능합니다.
@Table
- @Table 어노테이션은 엔티티와 매핑할 테이블을 지정합니다.
데이터베이스 스키마 자동 생성 기능
- hibernate.hbm2ddl.auto
속성
- create: 기존 테이블을 삭제 후 다시 생성합니다. (DROP + CREATE)
- create-drop: create와 같으나 종료 시점에 테이블을 DROP합니다.
- update: 변경 부분만 반영합니다. (운영 DB에는 사용하면 안됨)
- validate: 엔티티와 테이블이 정상 매핑 되었는지만 확인합니다.
- none: 스키마 자동생성 기능을 사용하지 않습니다.
JPA가 제공하는 스키마 자동 생성 기능은 개발 단계에서만 사용하고, 운영시에는 모드를 validate, none으로 넣고 써야합니다.
참고
@Column(unique = true, length = 10)
private String name;
여기서 unique, length 등의 속성은 애플리케이션에는 영향을 주지 않지만, DB에 영향을 주게 됩니다.
즉, ddl 생성에 영향을 미치는 것입니다.
필드와 컬럼 매핑
@Getter
@Setter
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name")
private String name;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
public Member() {
}
}
jakarta.persistence 패키지에 있는 연관 관계와 관련한 어노테이션들을 알아보겠습니다.
- @Id: 해당 테이블의 primary key 컬럼을 의미합니다.
- @Column: 위의 예시처럼, 컬럼 네임을 지정하고 싶을 때 name 속성을 줘서 사용합니다.
- @Enumerated: DB의 enum 타입과 매핑이됩니다.
- EnumType 이라는 Enum에는 ORDINAL과 STRING이 있습니다.
- ORDINAL은 DB에 값이 정수로 저장되고, STRING은 문자열로 저장됩니다.
- @Temporal: 날짜 또는 시간 데이터를 의미합니다.
- TemporalType Enum에는 DATE, TIME, DATETIME 이 있습니다.
- DATE: 날짜
- TIME: 시간
- DATETIME: 날짜와 시간
- @Lob: varchar의 범위를 넘어서는 큰 데이터를 넣고 싶을 때 사용합니다.
이렇게 하고, 애플리케이션을 실행하면 다음과 같은 DDL이 생성됩니다.
Hibernate:
create table Member (
age integer,
createdDate timestamp(6),
id bigint not null,
lastModifiedDate timestamp(6),
name varchar(255),
roleType varchar(255) check (roleType in ('MEMBER','ADMIN')),
description clob,
primary key (id)
)
참고: @Transient
메모리에서만 쓰고 싶은 속성에 붙여줍니다.
해당 속성은 ddl문에 반영되지 않고, 애플케이션에서만 쓸 수 있습니다.
@Column의 속성
- name: 필드와 매핑할 테이블의 컬럼 이름을 의미합니다.
- insertable, updatable: 등록, 변경 가능 여부를 의미합니다. (디폴트: true)
- ⭐️ nullable: null 값의 허용 여부를 설정합니다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙습니다.
- unique: @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용합니다.
- 하지만 이 unique 속성을 잘 사용하지 않습니다. (제약 조건 이름이 요상하게 걸리기 때문)
- 대신 class 위에 붙이는 @Table 어노테이션의 속성인 uniqueConstraint 를 통해 유니크 제약 조건을 거는 것이 일반적입니다.
- length: 문자 길이 제약 조건을 겁니다. String 타입에만 사용 가능합니다.
- precision, scale: BigDecimal 타입에서 사용합니다. (정밀한 실수를 다룰 때 사용)
- precision: 소수점을 포함한 전체 자릿수를 의미
- scale: 소수의 자릿수를 의미
- columnDefinition: 컬럼 정보를 직접 줍니다.
- ex: @Column(columnDefinition = varchar(100) default ‘EMPTY’)
기본키 매핑
@Id
- 직접 id 값을 할당하고 싶을 때에는 @Id 어노테이션만 사용합니다.
@GeneratedValue
- id 값을 자동 생성하고 싶다면 @GeneratedValue 어노테이션을 사용합니다.
Reference
'개념 공부 > Spring' 카테고리의 다른 글
[JPA 개념] 연관 관계 매핑 (2) | 2024.06.06 |
---|---|
[Spring MVC] Spring MVC 구조와 DispatcherServlet (0) | 2024.05.18 |