영원히 남는 기록, 재밌게 쓰자

엔티티 매핑에 대해서 본문

springboot/JPA

엔티티 매핑에 대해서

youngjae-kim 2024. 6. 11. 20:52
728x90
반응형

객체와 테이블 매핑하기

@Entity

해당 어노테이션이 붙은 클래스는 JPA에서 관리한다. 이를 엔티티라고 한다.

(@Entity가 붙지 않으면 JPA와 전혀 관계 없는 그냥 마음대로 사용하고 싶은 클래스에 불과하다.)

 

JPA를 사용하여 테이블과 매핑할 클래스는 꼭! @Entity를 붙여주어야 한다.

@Entity를 사용할 때 주의할 점

  • JPA 스펙 상 기본 생성자는 필수이다(파라미터가 없는 public 또는 protected) -> jpa 스펙상 이렇게 사용해야 하는게 규정이 되어 있다. 일단 그렇게만 알아두도록 하자, 너무 깊게 들어가는 건 일단 패스!
  • final, enum, interface, inner클래스에 사용 못함 -> 이런 성격의 클래스에 @Entity를 붙이지 못한다.
  • 저장할 필드에 final을 사용하지 못한다. (db에 저장할 필드)

@Entity 속성으로는 name 속성이 있다

JPA에서 사용할 엔티티 이름을 지정할 수 있다. 기본값은 클래스 이름을 그대로 사용하는데 가급적이면 이 기본값을 사용한다.

@Table

엔티티와 DB에서 매핑할 테이블을 지정 해준다.

여기도 name속성이 있는데 기본값은 엔티티 이름을 사용하지만 DBA나 회사룰에 따라 변경해서 사용하는 경우도 있다고 한다.

데이터 베이스 스키마 자동 생성 기능에 대해서

속성으로는 4가지 속성이 있다.

옵션 기능

create 테이블 삭제 후 재 생성 drop + create
create-drop create와 동일하게 동작하지만 종료시점에 테이블 drop
update 변경되는 부분에 대해서만 반영 (운영 DB 사용 지양)
엔티티에서 컬럼을 다시 없애도 없어지진 않는다.
validate 엔티티와 테이블 매핑이 정상적인지만 확인, 운영서버에서 사용가능
none 사용x, 운영서버에서는 사용가능

 

잘 활용하게 되면 좋지만 주의해야 할 점이 있다. (정말 중요한 부분이다.)

스키마 자동생성 옵션 사용시 주의 사항

운영장비에는 절대 create관련, update를 사용하면 안된다.

  • 개발 초기 단계에서는 create 또는 update 사용
  • 여러 명이서 같이 쓰는 스테이징이나 운영 서버에서는 create 관련, validate, update ddl 들을 가급적이면 쓰지 않는 것이 좋다.
  • validate의 경우는 자동으로 시스템에서 alter 구문을 날렸을 때 서버가 중단될 수도 있다고 함

필드와 컬럼 매핑

@Column(name = "name")

  • name : DB에서 사용하고 싶은 이름 (컬럼이름)
  • nullable(DDL) :
    • 기본값 true
    • false → not null 제약 조건이 붙음
  • length : 문자열 길이 제약조건, String 타입에만 사용한다.
  • 이외에도 여러가지 속성들이 있음 unique, columnDefinition,,,

@Enumerated(EnumType.STRING) 

  • ORDINAL 기본 값
    • enum 순서를 DB에 저장하는데 이 경우 사이에 enum 속성을 추가 하였을 때 순서에 따라 매핑을 해놓은 경우 그 매핑 정보가 다 깨져버리게 되는 문제가 발생한다.
  • STRING
    • enum의 문자 이름을 DB에 저장한다. 순서가 바뀌어도 매핑 정보가 맞지 않는 문제를 해결할 수 있다.

@Temporal(TemporalType.TIMESTAMP) (구버전)

  • DB는 날짜와 시간 타입을 구분해서 사용한다.
    • DATE,TIME,TIMESTAMP : 이렇게 3가지로 나뉜다.
  • 요즘은 LocalDateTime, LocalDate 를 사용
  • LocalDate : 날짜만, DB는 Date 타입으로 들어감
    • LocalDateTime : 날짜 + 시간 DB는 DateTime 타입으로 들어감

@Lob

  • CLOB, BLOB
  • 큰 문자열들을 넣고 싶을 때 사용
    • 문자열은 CLOB 이외에는 BLOB

@Trasient

  • 필드와 테이블을 매핑하고 싶지 않은 경우 사용
  • DB에 저장이 안되고, 조회도 안된다.
  • 메모리 상에서 어떤 값을 계산하거나 그 결과를 보관하고 싶을 때 사용한다.
728x90
반응형