앤티티 매핑(매핑 어노테이션 정리) 정리

객체와 테이블 매핑 관련 어노테이션

객체와 테이블 매핑에 대해 먼저 알아보자!

@Entity

  • @Entity가 붙은 클래스는 jpa가 관리하는 녀석이고 엔티티라고 한다.
  • JPA를 사용해서 테이플과 매핑할
  • name이라는 속성을 지정해 줄 수 있는데 이는 jpa에서 사용할 엔티티 이름이구 기본값은 클래스 이름을 그대로 사용해! (왠만하면 기본값을 사용)

🤨주의 할 것이 있어

  1. 기본 생성자는 필수야!! (파라미터가 없는 public 또는 protected 생성자) why? jpa를 활용하다보면 proxy 기술을 사용할 상황이 생기는데 이때, 기본생성자가 있어야 proxy객체를 만들 수 있어!
  2. final 클래스, enum, interface, inner 클래스는 사용 못해!
  3. 저장할 필드에 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가지 제약조건을 제공하고 있어!!

  1. NOT NULL : ‘필수 입력 사항’
  2. UNIQUE : 중복성 배제! 유일해야해
  3. PRIMARY KEY : NOT NULL + UNQIUE, 테이블에서 각 row를 구별할 수 있는 식별키
  4. FOREIGN KEY : 참조하는 테이블에서 존재하는 값만 사용 가능 (null 가능)
  5. CHECK : 주어진 조건에 해당하는 값만 입력 가능



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

  • DDL을 어플리케이션 실행 시점에 자동으로 생성해줘!!
  • Entity 매핑을 통해 스키마가 자동생성 되어지기에 객체적인 부분에만 집중할 수 있어
  • 데이터베이스 방언을 활용에 각 디비에 맞는 적절한 DDL을 만들어줘!! 하지만 이 DDL은 개발 장비에서만 사용하고 실제 운영서버 등에서는 적절히 다듬고 사용해야해.
  • hibernate.hbm2ddl.auto 의 value에 따라 동작방식이 달라

👏hibernate.hbm2ddl.auto의 value 별 동작

  1. create : 기존 테이블 삭제 후 다시 생성 (drop + create)
  2. create-drop : create와 같으나 종료시점에 테이블 drop
  3. update : 변경분만 반영(운영 디비에서 사용하지마!)
  4. validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  5. 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

: 필드 매핑에서 제외하고 싶은놈한테 붙여주면 되는거야!!

즉, 디비에 저장하거나 조회하고 싶은게 아니라 그냥 메모리상에서 임시로 값은 보관하고 싶을 때 사용할 수 있어.






https://darkstart.tistory.com/267

https://stackoverflow.com/questions/7022755/whats-the-difference-between-a-catalog-and-a-schema-in-a-relational-database

https://www.inflearn.com/course/ORM-JPA-Basic