본문 바로가기
Spring

Spring Data JPA: 단일 앤티티 매핑

by S2채닝S2 2023. 3. 18.

@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

최근댓글

최근글

skin by © 2024 ttuttak