관리 메뉴

ballqs 님의 블로그

[Spring] JPA 매핑 기능 본문

코딩 공부/Spring

[Spring] JPA 매핑 기능

ballqs 2024. 9. 26. 19:13

JPA 테이블 매핑 기능

@Entity

  • 객체 관점에서의 이름
  • 디폴트로 클래스명으로 설정됨
  • 엔티티의 이름은 JQL에서 쓰임
    • JQL : Entity 명으로 쿼리짤때 쓰이는 언어 (ex. JPQL, QueryDsl)

@Table

  • RDB 의 테이블 이름
  • @Entity의 이름이 테이블의 기본값
    • 주로 Entity 이름과 다르게 Table 명을 지정하고 싶을때 아래와 같이 사용
@Entity
@Table(name = "users")
public class User () {...}
  • 테이블의 이름은 SQL에서 쓰임
    • SQL : Table 명으로 쿼리짤때 쓰이는 언어 (ex. JDBC, SQL Mapper)

@Id

  • 엔티티의 주키를 맵핑할 때 사용
  • 자바의 모든 primitive 타입과 그 랩퍼 타입을 사용할 수 있음
    • Date랑 BigDecimal, BigInteger도 사용 가능
  • 복합키를 만드는 맵핑하는 방법도 있지만 그건 논외로..

@GeneratedValue

  • 주키의 생성 방법을 맵핑하는 애노테이션
  • 생성 전략과 생성기를 설정할 수 있다
    • 기본 전략은 AUTO: 사용하는 DB에 따라 적절한 전략 선택
    • TABLE, SEQUENCE, IDENTITY 중 하나

@Column

  • unique
  • nullable
  • length
  • columnDefinition
  • ...

JPA 필드 타입 매핑 기능

Value 타입 종류

기본 타입

  • @Column
    • String, Date, Boolean, 과 같은 타입들에 공통으로 사이즈 제한, 필드명 지정과 같이 옵션을 설정할 용도로 쓰인다.
    • Class 에 @Entity 가 붙어있으면 자동으로 필드들에 @Column 이 붙음
  • @Enumerated
    • Enum 매핑용도로 쓰이며 실무에서는 @Enumerated(EnumType.*STRING*) 으로 사용권장
    • Default 타입인 ORDINAL 은 0,1,2.. 값으로 들어가기 때문에 추후 순서가 바뀔 가능성있다.

Composite Value 타입

  • @Embeddable : 복합 값 객체로 사용할 클래스 지정
  • @Embedded : 복합 값 객체 적용할 필드 지정
@Embeddable
public class Address {
    private String city;
    private String street;
}
  • @AttributeOverrides : 복합 값 객체 여러개 지정
  • @AttributeOverride : 복합 값 객체 필드명 선언
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
@Setter
@Getter
public class Member{

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;


    private String name;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "city", column = @Column(name = "home_city")),
            @AttributeOverride(name = "street", column = @Column(name = "home_street")),
    })
    private Address homeAddress;


    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "city", column = @Column(name = "company_city")),
            @AttributeOverride(name = "street", column = @Column(name = "company_street")),
    })
    private Address companyAddress;


}

 

생성되는 테이블

CREATE TABLE MEMBER (
  MEMBER_ID BIGINT NOT NULL AUTO_INCREMENT,
  NAME VARCHAR(255) NOT NULL,
  home_city VARCHAR(255) NOT NULL,      # Embedded address.city
  home_street VARCHAR(255) NOT NULL,    # Embedded address.street
  company_city VARCHAR(255) NOT NULL,   # Embedded address.city
  company_street VARCHAR(255) NOT NULL, # Embedded address.street
  PRIMARY KEY (MEMBER_ID)
);