영벨롭 개발 일지

[Spring] Spring Data JPA - 엔티티 Entity 매핑 본문

Back-end/Spring

[Spring] Spring Data JPA - 엔티티 Entity 매핑

영벨롭 2023. 8. 14. 17:50

★ @Entity

 @Entity 어노테이션이 붙은 클래스는 JPA 가 관리하는 것으로, 엔티티라고 불립니다. 

 자동으로 데이터베이스의 테이블과 매핑됩니다. 

  • 기본 생성자 필수
  • final 클래스, enum, interface, inner class 에는 사용 불가
  • 저장할 필드에 final 사용 불가

 

속성
name JPA 에서 사용할 엔티티 이름 지정
(default 는 클래스 이름)

★ @Table

 엔티티와 매핑할 테이블을 지정합니다. @Entity 의 이름이 기본값이며, 테이블의 이름은 SQL 에서 사용됩니다. 

 

속성
name 매핑할 테이블 이름 지정
(default 는 Entity 이름)
catalog catalog 기능이 있는 DB 에서 catalog 를 매핑
(default 는 DB 명)
schema schema 기능이 있는 DB 에서 schema 를 매핑
uniqueConstraints DDL 생성 시 유니크 제약조건을 정의
스키마 재동 생성 기능을 사용해서 DDL 을 만들 때만 사용
스키마 자동 생성 기능
// application.properties
spring.jpa.hibernamte.ddl-auto = update

★ @Id

 Entity 의 기본키를 매핑할 때 사용합니다. 

 자바의 모든 Primitive 타입과 해당 Wrapper 클래스 타입, Date, BigDecimal, BigInteger 등을 사용할 수 있습니다. 

 

★ @GeneratedValue

 기본키의 생성 방법을 매핑하는 어노테이션으로, 생성 전략(strategy)과 생성기(generator)를 설정할 수 있습니다. 

 

속성
strategy 생성 전략 타입 (GenerationType)
(default 는 AUTO)
generator 생성기
(default 는 "")
GenerationType
AUTO 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(default)
IDENTITY 기본 키 생성을 데이터베이스에 위임
(= AUTO_INCREMENT)
SEQUENCE 데이터베이스 시퀀스 오브젝트를 사용해서 기본키 할당
TABLE 키 생성 테이블 사용

★ @Column

 객체 필드를 테이블 칼럼에 매핑합니다. 

 

속성
name 필드와 매핑할 테이블 칼럼 이름 지정
(default 는 객체 필드 명)
nullable null 값 허용 여부
(default 는 true)
unique @Table 의 uniqueConstraints 와 동일,
한 칼럼에 간단히 유니크 제약조건을 적용
columnDefinition 데이터베이스 칼럼 정보 지정
(예시 columnDefinition = "varchar(100) default 'EMPTY'"
length 문자열 길이 제약조건
String 타입에만 사용(default 는 255)
persicion, scale BigDecimal, BigInteger 타입에서 사용
아주 큰 숫자나 정밀한 소수를 다룰 때 사용

★ @Enumerated

 자바의 enum 타입을 매핑할 때 사용합니다. 

 

속성
EnumType.ORDINAL enum 에 정의된 순서대로 데이터베이스에 저장
(default)
EnumType.STRING enum 이름 그대로 데이터베이스에 저장
    enum UserType {
        PROVIDER,
        CONSUMER
    }

    @Enumerated(EnumType.ORDINAL)
    private UserType userTypeOrdinal; // UserType.PROVIDER 로 지정 시 1로 저장

    @Enumerated(EnumType.STRING)
    private UserType userTypeString; // UserType.PROVIDER 로 지정 시 PROVIDER 로 저장

★ @Temporal

 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용합니다. 

 

속성
TemporalType.DATE 날짜 (2023-08-01)
데이터베이스 data 타입과 매핑
TemporalType.TIME 시간 (00:00:00)
데이터베이스 time 타입과 매핑
TemporalType.TIMESTAMP 날짜와 시간 (2023-08-01 00:00:00)
데이터베이스 timestamp 타입과 매핑
@Temporal(TemporalType.DATE)
private Date date; // 날짜
 
@Temporal(TemporalType.TIME)
private Date date; // 시간
 
@Temporal(TemporalType.TIMESTAMP)
private Date date; // 날짜와 시간

★ @CreatedDate, @LastModifiedDate

 데이터를 저장할 때 생성된 시간 정보수정된 시간 정보를 매핑할 때 사용합니다. 

 

    @CreatedDate
    @Column(updatable = false)
    private Instant createdAt;

    @LastModifiedDate
    @Column(updatable = true)
    private Instant updatedAt;

 


★ @Transient

 칼럼으로 매핑하고 싶지 않은 멤버 변수에 사용합니다. 

 데이터베이스에 저장하지 않으며, 객체에 임시로 어떤 값을 보관하고 싶을 때 사용합니다. 


★ @Embeded, @Embeddable

  복합 값 타입이라고 말하며, JPA 에서 새로운 값 타입을 정의해서 사용하는 방법입니다. 

package com.dev.jpapractice.entity;

import javax.persistence.*;


@Entity
@Table(name = "user")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Embedded, Embeddable 사용 X
    private String zipcode;
    private String city;
    private String street;

    @Embedded
    private Address address;

}
package com.dev.jpapractice.entity;

import javax.persistence.Embeddable;

@Embeddable
public class Address {
    private String zipcode;
    private String city;
    private String street;

    public Address(String zipcode, String city, String street) {
        this.zipcode = zipcode;
        this.city = city;
        this.street = street;
    }
}

 

 

 

 

 

 

반응형