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로 정의
- value
@Lob
- 데이터베이스 BLOB, CLOB 타입과 매핑
- 지정 속성이 없고 매핑하는 필드 타입이 문자면 CLOB로 나머지는 BLOB로 매핑
@Transient
- 이 필드는 매핑하지 않는다
- 데이터베이스에 저장하지 않고 조회하지도 않음
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용
@Access
- JPA가 엔티티 데이터에 접근하는 방식을 지정
- 필드 접근 : AccessType.FIELD로 지정(필드에 직접 접근, private도 접근 가능)
- 프로퍼티 접근 : AccessType.PROPERTY러로 지정, 접근자 Getter를 사용
반응형