객체와 테이블 매핑 관련 어노테이션
객체와 테이블 매핑에 대해 먼저 알아보자!
@Entity
- @Entity가 붙은 클래스는 jpa가 관리하는 녀석이고 엔티티라고 한다.
- JPA를 사용해서 테이플과 매핑할
- name이라는 속성을 지정해 줄 수 있는데 이는 jpa에서 사용할 엔티티 이름이구 기본값은 클래스 이름을 그대로 사용해! (왠만하면 기본값을 사용)
🤨주의 할 것이 있어
- 기본 생성자는 필수야!! (파라미터가 없는 public 또는 protected 생성자) why? jpa를 활용하다보면 proxy 기술을 사용할 상황이 생기는데 이때, 기본생성자가 있어야 proxy객체를 만들 수 있어!
- final 클래스, enum, interface, inner 클래스는 사용 못해!
- 저장할 필드에 final 사용 못해!
@Table
: 엔티티와 매핑할 테이블을 지정해줘
그 속성으로는
- name : 매핑할 테이블 이름(기본값은 엔티티 이름 사용)
- catalog : 데이터베이스 catalog 매핑
- schema : 데이터베이스 schema 매핑
- uniqueConstraints : DDL 생성 시에 유니크 제약 조건 생성
😬 catalog, schema, uniqueConstraint가 확실히 정리가 되지 않아 먼저 짚고 넘어간드아.. 😬
schema & catalog
먼저 schema… 보통 table과 schema를 동일시 생각했었는데 테이블을 매핑하는데 그 속성으로 schema가 존재하여 의문이었다…
찾아보니 이는 Database의 종류에 따라 개념이 조금 다른 것 같았다.
MySql에서는 동의어이나 다른 DB에서는 또 다른 개념이 있다고 하네.. ㄷㄷ
그래서 보면 schema는 테이블들의 집합이고 database는 schemas의 집합이라고 한다.
catalog도 이와 비슷한데 결론적으로 schema와 catalog는 database에서 정의한 namespace라고 보면 된다!!
아래는 참고할 postgres 구조이닷
제약조건
: 데이터의 무결성을 위해 데이터베이스에서는 5가지 제약조건을 제공하고 있어!!
- NOT NULL : ‘필수 입력 사항’
- UNIQUE : 중복성 배제! 유일해야해
- PRIMARY KEY : NOT NULL + UNQIUE, 테이블에서 각 row를 구별할 수 있는 식별키
- FOREIGN KEY : 참조하는 테이블에서 존재하는 값만 사용 가능 (null 가능)
- CHECK : 주어진 조건에 해당하는 값만 입력 가능
데이터베이스 스키마 자동 생성
- DDL을 어플리케이션 실행 시점에 자동으로 생성해줘!!
- Entity 매핑을 통해 스키마가 자동생성 되어지기에 객체적인 부분에만 집중할 수 있어
- 데이터베이스 방언을 활용에 각 디비에 맞는 적절한 DDL을 만들어줘!! 하지만 이 DDL은 개발 장비에서만 사용하고 실제 운영서버 등에서는 적절히 다듬고 사용해야해.
- hibernate.hbm2ddl.auto 의 value에 따라 동작방식이 달라
👏hibernate.hbm2ddl.auto의 value 별 동작
- create : 기존 테이블 삭제 후 다시 생성 (drop + create)
- create-drop : create와 같으나 종료시점에 테이블 drop
- update : 변경분만 반영(운영 디비에서 사용하지마!)
- validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
- none : 사용하지 않아
Tip!! 👏🏻
운영장비에서 절대 create, create-drop, update 사용하면 안돼!!
한번에 골로 가버리는 상황이 만들어질 수 있따 이말이야!!
그래서 보통은 개발 초기 단계에 create or update
테스트 서버는 update or vlidate
스테이징과 운영서버는 validate or none 으로 써
@Column
컬럼관련 매핑할 때 사용하는 어노테이션이야!!
여러 속성들이 있는데 간단하게 슥슥 끄적여보즈아
참고로 DDL 생성 기능은 DDL 자동 생성할 때만 사용되는거구 JPA의 실행 로직에는 영향 X
- name : 필드와 매핑할 테이블의 컬럼이름 (default 객체의 필드 이름)
- insertable, updatable : 등록,변경 가능 여부 (default TRUE)
- nullable(DDL) : null 값 허용 여부. false → not null constarint
- unique(DDL) : @Table의 uniqueConstraints와 같으나 한 컬럼에 간단히 유니크 제약조건 걸 때 사용
- columnDefinition(DDL) : 데이터베이스 컬럼 정보를 직접 줄 수 있다. (ex : varchar(100) default ‘EMPTY’ 이런식으로)
- length(DDL) : 문자 길이 제약조건. String 타입에 사용. (default 255)
- percision, scale(DDL) : BigDecimal 타입에서 사용(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다!
@Enumerated
: 자바 enum 타입을 매핑할 때 사용해!!
Value 속성이 존재하는데 그 값들은 아래와 같애
- EnumType.ORDINAL : enum 순서를 데이터베이스에 저장(default)
- EnumType.STRING : enum 이름을 데이터베이스에 저장
👏주의할 것!!
EnumType.ORIDNAL은 해당 enum에 대해 수정이 있을 경우 원치 않는 결과로 동작할 수 있어!! 그러니 꼭 EnumType.STRING 을 사용할 것!!
@Temporal
: 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용해
참고로 LocalDate, LocalDateTime을 사용할 때 생략가능해
Value 속성이 존재하는데 그 값들은 아래와 같애
- Temporaltype.DATE : 날짜, 데이터베이스 date 타입과 매핑 ( ex 2021-07-23)
- TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 ( ex 11:11:11)
- TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 ( ex 2013-12-24 11:11:11 )
@Lob
: Lob 타입 데이터는 구조화되지 않은 용량이 큰 데이터를 저장할 수 있는 데이터 타입이야. 여러가지가 있는데 그중 BLOB, CLOB타입과 매핑 가능해
@Transient
: 필드 매핑에서 제외하고 싶은놈한테 붙여주면 되는거야!!
즉, 디비에 저장하거나 조회하고 싶은게 아니라 그냥 메모리상에서 임시로 값은 보관하고 싶을 때 사용할 수 있어.