JPA Entity 어노테이션

김민창·2022년 3월 15일
0
post-thumbnail

JPA를 사용하며 데이터베이스 테이블과 일대일 매칭되는 @Entity 어노테이션의 사용법을 정리해본다

들어가기 전

  • 여기에서 정리한 내용중 application.propertiesspring.jpa.generate-ddl=true 라고 설정한 부분이 있다

  • 서버 시작 시점에 EntityScan을 통하여 @Entity어노테이션에 명시한 클래스에 기반하여 DDL문을 생성하여 데이터베이스에 적용하게 된다


@Entity

  • @Entity 어노테이션을 클래스에 선언하면 해당 클래스는 JPA가 관리

  • @Entity 어노테이션은 테이블과 일대일로 매칭되는 객체 단위

  • Entity 객체의 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미

  • final, enum ,interface, class에서는 사용할 수 없음

  • 필드를 final로 선언 불가

@Entity
public class Reply {
	...
    ...
}

@Table

  • @Table은 엔티티와 매핑할 테이블 지정

  • 외부에서 호출하는 용도가 아닌 실제 데이터베이스에 붙는 테이블명 어노테이션

namecatalogschemauniqueConstraints
매핑할 테이블 이름catalog 매핑schema 매핑DDL 생성시 유니크 제약조건 생성
  • 생략시 Entity이름으로 테이블이 만들어진다
@Entity
@Table(name = "tb_reply")
public class Reply {
	...
    ...
}

@Entity는 말그대로 엔티티의 이름을 정할때 사용
@Table은 데이터베이스에 생성될 테이블의 이름을 지정할때 사용


@Id

  • 특정 속성을 기본키로 설정하는 어노테이션

  • Entity클래스 상 @Id 어노테이션을 통해 기본키라는것을 명시적으로 표시해야 한다


@GeneratedValue

  • 기본키의 데이터 형식은 정해져있지 않지만 구분이 가능한 유일한 값을 가지고 있어야 하는데, 이에 도움을 주는 어노테이션

  • MysqlAUTO_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에 따라 자동으로 전략 선택
  • AUTO같은 경우 데이터베이스에 따라 JPA가 자동으로 설정하기 때문에
    데이터베이스를 변경하더라도 코드를 수정할 필요가 없다는 장점이 있다
@Entity
@Table(name = "tb_reply")
public class Reply {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int replySeq;
	...
    ...
}

Column

  • 해당하는 테이블에 연결되는 컬럼
  • 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;
    
    ...
}

@Temporal

  • 날짜 타입에 대한 매핑

  • java.util.Date, java.util.Calendar에 사용

  • 하지만 데이터베이스에 저장하는 날짜는 다양한 형태가 존재하는데 다음과 같다

속성기능
TemporalType.Date(년-월-일)의 date 타입
TemporalType.Time(시:분:초)의 time 타입
TemporalType.TIMESTAMPdate+time의 timestamp 타입
@Entity
@Table(name = "tb_reply")
public class Reply {

	...
    
    @Temporal(TemporalType.DATE)
    private Date replyDate;
}
profile
개발자 팡이

0개의 댓글