Web/Spring

[Spring] 스프링 부트 데이터베이스 관련 어노테이션

poopooreum 2024. 9. 2. 12:17
반응형

✏️ 엔티티와 매핑

@Entity

  • 테이블과의 매핑
  • 이 어노테이션을 붙이면 JPA가 관리를 하게 된다
  • Name 속성 ⇒ JPA에서 사용할 엔티티 이름을 지정, 보통 기본값인 클래스 이름을 사용
  • 기본 생성자는 필수(JPA가 엔티티 객체 생성 시 기본 생성자를 사용)
  • final 클래스, enum, interface, inner class에는 사용할 수 없음
  • 저장할 필드에 final 사용 불가
  • DB 테이블에 대응하는 하나의 클래스

@Table

  • 엔티티와 매핑할 테이블을 지정
  • 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용
  • 속성
    • Name ⇒ 매핑할 테이블 이름(default는 엔티티 이름 사용)
    • Catalog ⇒ catalog 기능이 있는 DB에서 catalog를 매핑(default. DB명)
    • Schema ⇒ schema 기능이 있는 DB에서 schema를 매핑
    • uniqueConstraints ⇒ DDL 생성 시 유니크 제약조건을 만든다, 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용

✏️ 데이터베이스 스키마 자동 생성

번외

  • JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원
  • 클래스의 매핑 정보와 데이터베이스 방언을 사용하여 데이터베이스 스키마 생성
  • 애플리케이션션 실행 시점에 데이터베이스 테이블을 자동으로 생성
  • 스키마 자동 생성 기능 사용을 위해 persistence.xml에 속성 추가
	<property name="hibernate.hbm2ddl.auto" value="create" />

hibernate.hbm2ddl.auto 속성

  • create ⇒ 기존 테이블을 삭제하고 새로 생성(DROP + CREATE)
  • create-drop ⇒ CREATE 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거(DROP+CREATE+DROP)
  • update ⇒ DB 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정
  • validate ⇒ DB 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경로를 남기고 애플리케이션을 실행하지 않음. DDL을 수행하지 않음
  • none ⇒ 자동 기능을 사용하지 않음
  • 개발 초기 단계는 create or update
  • 초기화 상태로 자동화된 테스트를 진행하는 개발자 환경과 CI 서버는 create of create-drop
  • 테스트 서버는 update or validate
  • 스테이징과 운영 서버는 validate or none

✏️ 기본 키 매핑

@GeneratedValue

  • 기본 키 생성 전략 - 직접 할당
    • 기본 키를 애플리케이션에 직접 할당해야 함, 식별자 값이 없을 경우 에러 발생
  • 기본 키 생성 전략 - 자동 생성
    • 대리 키를 사용하는 방식
    • IDENTITY : 기본 키 생성을 데이터베이스에 위임 ( = AUTO+INCREAMENT)
    • SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당, 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장, 유일한 값을 순서대로 생성(오라클, PostgreSQL, DB2, H2)
    • TABLE : 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(Default), 오라클 DB 선택시 SEQUENCE, MYSQL DB 선택시 IDENTITY 사용

@Column

  • 객체 필드를 테이블 컬럼에 매핑
  • 속성 중 name, nullable이 주로 사용되고, 나머지는 잘 사용되지 않음
  • 속성
    • name : 필드와 매핑할 테이블 컬럼 이름 (default는 객체의 필드 이름)
    • nullable(DDL) : null값의 허용 여부 설정, false 설정 시 not null(default.true)
    • unique(DDL) : @Table의 uniqueConstraints와 같지만 한 칼람에 간단히 유니크 제약조건을 허용
    • length(DDL) : 문자 길이 제약조건, String 타입에만 사용(default.255)
    • percision, scale(DDL) : BigDecimal, BigInteger 타입에서 사용(default precision=19, scale=2)

@Enumerated

  • 자바의 enum 타입을 매핑할 때 사용
  • 속성
    • value : EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
    • EnumType.String : enum 이름을 데이터베이스에 저장(default는 EnumType.ORDINAL)

@Temporal

  • 날짜 타입을 매핑할 때 사용
  • 속성
    • value
      • TemporalType.DATE : 날짜, 데이터베이스 타입과 매핑 (2020-12-18)
      • TemporalType.TIME : 시간, 데이터베이스 타입과 매핑 (23:36:33)
      • TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2020-12-18 23:36:33)
      • default.TemporalTYPE은 필수로 지정
    • @Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의

@Lob

  • 데이터베이스 BLOB, CLOB 타입과 매핑
  • 지정 속성이 없고 매핑하는 필드 타입이 문자면 CLOB로 나머지는 BLOB로 매핑

@Transient

  • 이 필드는 매핑하지 않는다
  • 데이터베이스에 저장하지 않고 조회하지도 않음
  • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용

@Access

  • JPA가 엔티티 데이터에 접근하는 방식을 지정
  • 필드 접근 : AccessType.FIELD로 지정(필드에 직접 접근, private도 접근 가능)
  • 프로퍼티 접근 : AccessType.PROPERTY러로 지정, 접근자 Getter를 사용
반응형