JPA
를 사용하며 데이터베이스 테이블과 일대일 매칭되는@Entity
어노테이션의 사용법을 정리해본다
여기에서 정리한 내용중 application.properties
에 spring.jpa.generate-ddl=true
라고 설정한 부분이 있다
서버 시작 시점에 EntityScan
을 통하여 @Entity
어노테이션에 명시한 클래스에 기반하여 DDL문을 생성하여 데이터베이스에 적용하게 된다
@Entity
어노테이션을 클래스에 선언하면 해당 클래스는 JPA
가 관리
@Entity
어노테이션은 테이블과 일대일로 매칭되는 객체 단위
Entity
객체의 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미
final, enum ,interface, class에서는 사용할 수 없음
필드를 final로 선언 불가
@Entity
public class Reply {
...
...
}
@Table
은 엔티티와 매핑할 테이블 지정
외부에서 호출하는 용도가 아닌 실제 데이터베이스에 붙는 테이블명 어노테이션
name | catalog | schema | uniqueConstraints |
---|---|---|---|
매핑할 테이블 이름 | catalog 매핑 | schema 매핑 | DDL 생성시 유니크 제약조건 생성 |
Entity
이름으로 테이블이 만들어진다@Entity
@Table(name = "tb_reply")
public class Reply {
...
...
}
@Entity
는 말그대로 엔티티의 이름을 정할때 사용
@Table
은 데이터베이스에 생성될 테이블의 이름을 지정할때 사용
특정 속성을 기본키로 설정하는 어노테이션
Entity
클래스 상 @Id
어노테이션을 통해 기본키라는것을 명시적으로 표시해야 한다
기본키의 데이터 형식은 정해져있지 않지만 구분이 가능한 유일한 값을 가지고 있어야 하는데, 이에 도움을 주는 어노테이션
Mysql
의 AUTO_INCREMENT
처럼 자동으로 부여되게 해준다
해당 어노테이션은 IDENEITY, SEQUENCE, TABLE 3가지가 있으며 데이터베이스마다 지원하는 방식에 따라 사용할 수 있다
속성 | 기능 |
---|---|
@GeneratedValue(startegy=GenerationType.IDENTITY) | 기본 키 생성을 DB에 위임(Mysql) |
@GeneratedValue(startegy=GenerationType.SEQUENCE) | DB시퀀스를 사용해서 기본 키 할당(ORACLE) |
@GeneratedValue(startegy=GenerationType.TABLE) | 키 생성 테이블 사용 (모든 DB 사용 가능) |
@GeneratedValue(startegy=GenerationType.AUTO) | 선택된 DB에 따라 자동으로 전략 선택 |
JPA
가 자동으로 설정하기 때문에@Entity
@Table(name = "tb_reply")
public class Reply {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int replySeq;
...
...
}
name
: 객체명과 데이터베이스 컬럼명을 다르게 하고싶은 경우nullable
: 기본은 false이며 NOT NULL
제약조건을 걸고싶은 경우length
: 기본은 255이며, 문자 길이 제약조건을 걸고싶은 경우@Entity
@Table(name = "tb_reply")
public class Reply {
...
@Column(unique = true)
private int fundingSeq;
@Column(length = 100)
private String boardTitle;
...
}
날짜 타입에 대한 매핑
java.util.Date
, java.util.Calendar
에 사용
하지만 데이터베이스에 저장하는 날짜는 다양한 형태가 존재하는데 다음과 같다
속성 | 기능 |
---|---|
TemporalType.Date | (년-월-일)의 date 타입 |
TemporalType.Time | (시:분:초)의 time 타입 |
TemporalType.TIMESTAMP | date+time의 timestamp 타입 |
@Entity
@Table(name = "tb_reply")
public class Reply {
...
@Temporal(TemporalType.DATE)
private Date replyDate;
}