이전 포스팅(@Query, @Modifying, @Transactional에 대하여) 에서 영속성 컨텍스트를 포스팅하기로 하였다. 그러나 영속성 컨텍스트 이전에 알아야 하는 기본적인 JPA의 Entity가 무엇인지 Mapping은 어떻게 하는 지에 대한 지식이 필요하다고 생각되어 먼저 포스팅 하도록 하겠습니다.


📙 Entity

📖 Entity 란 ?

내 개인적인 생각으로는 DB Table을 객체로 표현한 것(?) 이라고 생각한다.
SQL을 이용해 Table을 생성한 후 Entity를 만들 수도 있지만 JPA의 기능으로 Entity 를 참조하여 자동으로 Table을 만들어주는 설정을 제공하고 있기 때문이다.

Entity를 참조하여 자동으로 Table을 만들기 위해서는 아래의 설정을 지정해주면 된다.

// application.properties
spring.jpa.hibernate.ddl-auto=~~~;
  1. create : 기존에 존재하는 테이블은 삭제한 후 새로 생성.
  2. create-drop : create 설정값의 기능 + Application 종료할 때 생성한 DDL 제거.
  3. update : DB Table 과 Entity Mapping 정보를 비교하여 변경 사항만 수정.
  4. validate : DB Table 과 Entity Mapping 정보를 비교한 후 차이가 있으면 경고를 남긴 후 Application을 실행하지 않는다. DDL 수정하지 않음.
  5. none : 유효하지 않은 옵션 값. DDL 자동 생성 기능 사용 하지 않을 때 사용.

📙 Entity Mapping

📖 객체와 테이블 Mapping

  • @Entity
    • DB Table과 Mapping 시킬 객체를 명시하는 Annotation.
    • 기본 생성자가 필수임. ( 파라미터가 없는 public / protected 생성자 )
    • final 클래스, enum, interface, inner class 에는 사용할 수 없음.
    • 저장할 field에 final을 사용하면 안 됨.
    • 해당 Annotation으로 명시된 Class를 Entity Class 라고 하며 JPA가 관리를 함.
  • @Table
    • 해당 Entity와 Mapping될 Table의 이름을 지정할 수 있음.
    • 생략 가능하며 생략 시 Entity의 이름을 Table 명으로 사용.

ex1) Entity Class 명으로 DB TableMapping 시킬 경우

@Entity
public class Car {
	@Id
    public String num;
    public String kind;
}
Entity 를 참조하여 생성된 DDL

create table car ( 
	num varchar primary key,
    kind varchar
)
ex2) Entity Class 명과 다른 DB Table 명을 Mapping 시킬 경우

@Entity
@Table(name="bus")
public class Car {
	@Id
    public String num;
    public String kind;
}
Entity 를 참조하여 생성된 DDL

create table bus (
	num varchar primary key,
    kind varchar
)

📖 기본 키 Mappping

  • @Id
    • DB Table 의 기본키 ( Primary Key , 이하 PK ) Mapping하는 Annotation.
    • Entity Class 에서 필수임.
    • DB의 Sequence나 AUTO_INCREMENT 같은 기능을 이용하여 자동 생성된 값도 사용 가능.
    • PK를 자동 생성하여 사용할 경우 @GeneratedValue Annotation을 사용해야 한다.
  • @GeneratedValue
    • 해당 Annotation을 통해 자동 생성된 값을 PK로 사용할 수 있음.
    • 사용 전략은 3가지가 있음.
      1. IDENTITY : PK 생성을 DB에 위임함.
      2. SEQUENCE : DB Sequence를 사용하여 PK할당. ( @SequenceGenerator와 함께 사용 )
      3. TABLE : 키 생성 테이블을 사용. ( @TableGenerator와 함께 사용 )
ex)

@Entity
public class Car {
	// number field를 PK로 지정
    // PK 생성을 DB로 위임하여 자동으로 생성되도록 함.
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public String num;
    public String kind;
}
Entity 를 참조하여 생성된 DDL

create table car (
	num varchar primary key auto_increment,
    kind varchar
)

📖 필드와 컬럼 Mappping

  • @Column
    • field를 DB Column과 Mapping하는 Annotation
    • 생략 가능, 생략 시 field 명으로 DB Column Mapping
    • 여러 속성으로 not null, unique 제약 조건, 길이 제약 조건 등 지정 가능.
      • name : field명을 다른 Table의 Column 명으로 Mapping 가능 ( @Table 과 비슷한 기능 )
      • nullabe : DB의 not null 제약 조건 설정 여부 지정. ( 기본 값은 false 이며, false로 설정 시 null 값 허용 / true로 설정 시 null 값 허용 x )
      • unique : @Table의 uniqueConstraints와 같지만 해당 컬럼에 간단한 unique 제약 조건 지정 시 사용.
      • length : String 타입에만 사용 가능 하며, 문자 길이를 제한함. ( DB의 varchar, varchar2 와 같음. )
  • @Enumerated
    • Java의 enum 타입 Mapping 시 사용.
  • @Temporal
    • 날짜 타입 Mapping 시 사용.
    • DB의 날짜 및 시간 관련 된 타입과 Mapping 가능.
      • TemporalType.DATE : DB date 타입과 Mapping ( ex. yyyy-MM-dd )
      • TemporalType.TIME : DB time 타입과 Mapping ( ex. hh:mm:ss )
      • TemporalType.TIMESTAMP : DB timestamp / datetime 타입과 Mapping ( ex. yyyy-MM-dd hh:mm:ss )
  • @Lob
    • DB의 BLOB, CLOB 타입과 Mapping.
  • @Transient
    • 객체에 임시로 어떤 값을 저장하고 싶을 때 사용.
@Entity
public class Car {
	@Id
    //car_number Column과 Mapping.
    @Column(name="car_number")
    public String num;
    
    // null을 허용하지 않는 not null 제약 조건 추가.
    @Column(nullabe = false)
    public String kind;
    
    // 길이를 10으로 지정.
    @Column(length = 10)
    public String company;
    
    // DB의 date 타입과 Mapping.
    @Temporal(TemporalType.DATE)
    public Date create_date;
   
}
Entity 를 참조하여 생성된 DDL

create table car (
	car_number varchar primary key,
    kind varchar not null,
    company varchar(10),
    create_date date;
)
profile
I'll be a Back-End Developer

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN