[Spring JPA] 엔티티 매핑

Eunho·2023년 4월 25일

spring

목록 보기
3/7

객체와 테이블 매핑

@Entity

: @Entity 어노테이션을 붙인 클래스는 JPA가 관리하는 엔티티가 된다.
엔티티 이름 default는 클래스 이름이며, @Entity(name = "")를 통해 엔티티 이름을 지정할 수 있다.

  • 제약사항
    • public, protected인 기본 생성자(@NoArgsConstructor) 필요
    • final, enum, interface, inner 클래스 사용 불가
    • final인 필드 X

@Table

: @Table(name="")을 통해 DB 테이블 이름을 지정할 수 있다.

@Entity Vs @Table

Entity 이름은 JPQL(HQL)에서 사용하는 엔티티 이름이고,
Table 이름은 DB 테이블 이름이다.

ex) class 이름이 Member일 때,

  • @Entity 혹은 @Entity @Table만 사용
    -> entity, table = default

  • @Entity(name="MemberEntity")
    -> entity = MemberEntity, table = default

  • @Entity
    @Table(name="MemberTable")
    -> entity = default, table = MemberTable

  • @Entity(name="MemberEntity")
    @Table(name="MemberTable")
    -> entity = MemberEntity, table = MemberTable

[참고] https://walkingtechie.blogspot.com/2019/06/difference-between-entity-and-table.html

Primary Key 매핑

@Id

: table의 primary key와 필드 매핑. 항상 @Entity와 함께 사용해야 하며, @Id가 붙은 필드가 없으면 오류 발생.

@GeneratedValue

: Id, 기본키를 자동으로 할당해준다. @GeneratedValue를 사용하지 않으면, 직접 기본키를 할당해주어야 한다. 이는 같은 Id를 할당했을 때 무결성이 위반되어 SQLException이 발생할 수 있으므로, @GeneratedValue를 사용하는 게 좋다.

  • @GeneratedValue(strategy = GenerationType.IDENTITY)
    : 기본키 생성을 DB가 하는 전략. MySQL, MariaDB에서 사용

  • @GeneratedValue(strategy = GenerationType.SEQUENCE)
    : DB의 Sequence Object를 사용하는 전략. @SequenceGenerator 필요. Oracle에서 사용

  • @GeneratedValue(strategy = GenerationType.TABLE)
    : 키 생성 테이블을 만들어서 사용하는 전략. 성능이 그닥 좋지 않음

  • @GeneratedValue(strategy = GenerationType.AUTO)
    : DB Dialect에 따라 IDENTITY, SEQUENCE, TABLE 중 자동으로 지정.(h2는 SEQUENCE)

GenerationType.IDENTITY Vs GenerationType.SEQUENCE

DB에 insert 쿼리가 실행되는 시점이 다르다.

  • IDENTITY - 테이블에 데이터를 insert해야 식별자를 얻을 수 있으므로 entityManager.persist()시점에 entityTransaction.commit(), 즉 insert 쿼리가 실행된다.
  • SEQUENCE - 시퀀스를 통해 식별자를 얻을 수 있으므로 entityManager.persist() 시점에 DB에 반영되지 않고 entityTransaction.commit() 시점에 insert쿼리가 실행된다.

필드와 컬럼 매핑

@Column

: @Column 애너테이션이 붙은 필드와 DB table의 컬럼 매핑.
속성으로 nullable, length, updatable, unique 등등이 있다.

  • @Column이 없는 필드
    -> JPA에서 table의 열과 매핑되며, 이때 @Column의 속성은 default이다.(nullable = true, updatable = true, unique = false)
  • @Coulmn이 있지만 속성이 없는 필드
    -> int같은 primitive type은 nullable = false가 되어야 하는데, default가 nullable = true이므로 주의해야 한다.

@Enumerated

: enum 타입 객체인 엔티티 필드에 적용. 주로 상태를 나타낼 때 쓴다.

  • EnumType.ORDINAL
    : enum의 순서 저장. 추후에 enum의 순서가 바뀔 수도 있으므로 사용을 권장하지 않는다.
  • EnumType.STRING
    : enum의 이름 저장.

@Transient

: 해당 필드를 테이블의 열과 매핑하지 않음

@Entity
@NoArgsConstructor
public class Member() {

	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	long memberId;
    
    @Column(nullable = false)
    int age;
    
    @Enumerated(value = EnumType.String)
    MemberStatus memberStatus;
    
    @Transient
    @Column(nullable = false)
    int weight;
}

엔티티 간의 연관 관계 설정은 글이 너무 길어지므로 다음 포스팅에서 정리하도록 하겠다 ❗ -> https://velog.io/@leh0818/Spring-JPA-%EC%97%B0%EA%B4%80-%EA%B4%80%EA%B3%84-%EB%A7%A4%ED%95%91-kli8lqjw

profile
🌱우당탕탕 메모장 (●'◡'●)🌱

0개의 댓글