본문 바로가기
개념 공부/Spring

[JPA 개념] JPA의 기본 어노테이션 알아보기

by clean01 2024. 6. 6.

@Entity

  • @Entity가 분은 클래스는 JPA가 관리, 엔티티라고 합니다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수입니다.

주의할 점!

  • 엔티티 클래스에는 기본 생성자가 필수입니다. (파라미터가 없는 public 또는 protected 생성자)
  • final 클래스, enum, interface, inner 클래스에는 @Entity 어노테이션 사용이 불가능합니다.
  • 저장할 필드에 final 키워드 사용이 불가능합니다.

@Table

  • @Table 어노테이션은 엔티티와 매핑할 테이블을 지정합니다.

데이터베이스 스키마 자동 생성 기능

  • hibernate.hbm2ddl.auto

속성

  • create: 기존 테이블을 삭제 후 다시 생성합니다. (DROP + CREATE)
  • create-drop: create와 같으나 종료 시점에 테이블을 DROP합니다.
  • update: 변경 부분만 반영합니다. (운영 DB에는 사용하면 안됨)
  • validate: 엔티티와 테이블이 정상 매핑 되었는지만 확인합니다.
  • none: 스키마 자동생성 기능을 사용하지 않습니다.

JPA가 제공하는 스키마 자동 생성 기능은 개발 단계에서만 사용하고, 운영시에는 모드를 validate, none으로 넣고 써야합니다.

참고

@Column(unique = true, length = 10)
private String name;

여기서 unique, length 등의 속성은 애플리케이션에는 영향을 주지 않지만, DB에 영향을 주게 됩니다.

즉, ddl 생성에 영향을 미치는 것입니다.


필드와 컬럼 매핑

@Getter
@Setter
@Entity
public class Member {
  @Id
  private Long id;

  @Column(name = "name")
  private String name;

  private Integer age;

  @Enumerated(EnumType.STRING)
  private RoleType roleType;

  @Temporal(TemporalType.TIMESTAMP)
  private Date createdDate;

  @Temporal(TemporalType.TIMESTAMP)
  private Date lastModifiedDate;

  @Lob
  private String description;

  public Member() {
  }
}

jakarta.persistence 패키지에 있는 연관 관계와 관련한 어노테이션들을 알아보겠습니다.

  • @Id: 해당 테이블의 primary key 컬럼을 의미합니다.
  • @Column: 위의 예시처럼, 컬럼 네임을 지정하고 싶을 때 name 속성을 줘서 사용합니다.
  • @Enumerated: DB의 enum 타입과 매핑이됩니다.
    • EnumType 이라는 Enum에는 ORDINAL과 STRING이 있습니다.
    • ORDINAL은 DB에 값이 정수로 저장되고, STRING은 문자열로 저장됩니다.
  • @Temporal: 날짜 또는 시간 데이터를 의미합니다.
    • TemporalType Enum에는 DATE, TIME, DATETIME 이 있습니다.
    • DATE: 날짜
    • TIME: 시간
    • DATETIME: 날짜와 시간
  • @Lob: varchar의 범위를 넘어서는 큰 데이터를 넣고 싶을 때 사용합니다.

이렇게 하고, 애플리케이션을 실행하면 다음과 같은 DDL이 생성됩니다.

Hibernate: 
    create table Member (
        age integer,
        createdDate timestamp(6),
        id bigint not null,
        lastModifiedDate timestamp(6),
        name varchar(255),
        roleType varchar(255) check (roleType in ('MEMBER','ADMIN')),
        description clob,
        primary key (id)
    )

참고: @Transient

메모리에서만 쓰고 싶은 속성에 붙여줍니다.

해당 속성은 ddl문에 반영되지 않고, 애플케이션에서만 쓸 수 있습니다.

@Column의 속성

  • name: 필드와 매핑할 테이블의 컬럼 이름을 의미합니다.
  • insertable, updatable: 등록, 변경 가능 여부를 의미합니다. (디폴트: true)
  • ⭐️ nullable: null 값의 허용 여부를 설정합니다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙습니다.
  • unique: @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용합니다.
    • 하지만 이 unique 속성을 잘 사용하지 않습니다. (제약 조건 이름이 요상하게 걸리기 때문)
    • 대신 class 위에 붙이는 @Table 어노테이션의 속성인 uniqueConstraint 를 통해 유니크 제약 조건을 거는 것이 일반적입니다.
  • length: 문자 길이 제약 조건을 겁니다. String 타입에만 사용 가능합니다.
  • precision, scale: BigDecimal 타입에서 사용합니다. (정밀한 실수를 다룰 때 사용)
    • precision: 소수점을 포함한 전체 자릿수를 의미
    • scale: 소수의 자릿수를 의미
  • columnDefinition: 컬럼 정보를 직접 줍니다.
    • ex: @Column(columnDefinition = varchar(100) default ‘EMPTY’)

기본키 매핑

@Id

  • 직접 id 값을 할당하고 싶을 때에는 @Id 어노테이션만 사용합니다.

@GeneratedValue

  • id 값을 자동 생성하고 싶다면 @GeneratedValue 어노테이션을 사용합니다.

Reference

'개념 공부 > Spring' 카테고리의 다른 글

[JPA 개념] 연관 관계 매핑  (2) 2024.06.06
[Spring MVC] Spring MVC 구조와 DispatcherServlet  (0) 2024.05.18